gpt4 book ai didi

java - 如何防止因不存在的 id 导致缓存崩溃?

转载 作者:行者123 更新时间:2023-12-01 04:35:12 27 4
gpt4 key购买 nike

如果一个请求不存在的id,Cache不会获取到,该请求将通过数据库进行查询。

不存在的id请求将全部命中数据库,如果这是攻击,缓存无法保护数据库。

数据库很快就崩溃了。

那么我该怎么做才能防止这种类型的攻击呢?

附注数据库的数据太多。而如果一个id只访问一次,空对象缓存将不起作用。

最佳答案

您可以缓存一个Optional,如果响应为空,您可以在第一个请求中保存Optional.absent()。一旦关联的 ID 出现在数据库中,您就必须立即使该缓存的可选实体失效,或者如果您因缓存不断增长而遇到内存问题,则必须尽快使该缓存的可选实体失效。

我喜欢 Guava 的缓存和可选类,因为我认为它们解决了大多数可能的问题,我将在我的示例中使用它们:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

import com.google.common.base.Optional;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;


public class OptionalCacheUsage {

private static final Cache<Id, Optional<Entity>> cache = CacheBuilder.newBuilder()
.softValues()
.expireAfterWrite(5, TimeUnit.MINUTES)
.build();

private static final Database db = Databases.getDatabase();

Entity findEntity(final Id requestedId) throws ExecutionException, EntityNotFoundException {
final Optional<Entity> optionalEntity = cache.get(requestedId, new Callable<Optional<Entity>>() {

@Override public Optional<Entity> call() throws Exception {
return Optional.fromNullable(db.getById(requestedId));
}});
if (optionalEntity.isPresent()) {
return optionalEntity.get();
} else {
throw new EntityNotFoundException();
}
}

Id saveEntity(final Entity newEntity) {
final Id savedId = db.save(newEntity);
cache.invalidate(savedId);
return savedId;
}
}

关于java - 如何防止因不存在的 id 导致缓存崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17461543/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com