【SpringBoot篇】解决缓存击穿问题② — 基于逻辑过期方式
import java.util.concurrent.TimeUnit;
public class CacheService {
private final Cache<String, Object> cache;
public CacheService(Cache<String, Object> cache) {
this.cache = cache;
}
public Object getFromCache(String key) {
Object value = cache.get(key);
if (value == null) {
// 加锁,防止高并发重复查询数据库
synchronized (this) {
value = cache.get(key);
if (value == null) {
// 模拟从数据库查询数据
value = loadFromDatabase(key);
// 设置缓存,并标记为逻辑过期
cache.put(key, value);
// 设置逻辑过期时间,例如30秒
cache.setExpireTime(key, 30, TimeUnit.SECONDS);
}
}
}
return value;
}
private Object loadFromDatabase(String key) {
// 实现数据库查询逻辑
return "database_value";
}
}
这段代码示例中,我们使用了一个内存缓存系统(Cache),它支持设置过期时间。在getFromCache
方法中,我们首先尝试从缓存中获取数据。如果缓存中没有数据,我们使用synchronized
关键字来确保只有一个线程可以去数据库中加载数据,其他线程会等待该线程从数据库中获取数据并更新到缓存中后再从缓存中获取数据。这样可以避免缓存击穿问题,并且只有在真正需要时才去数据库加载数据,提高了系统的性能和资源利用效率。
评论已关闭