Redis+Caffeine 实现两级缓存实战
warning:
这篇文章距离上次修改已过183天,其中的内容可能已经有所变动。
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import redis.clients.jedis.Jedis;
public class RedisCaffeineCache {
private final Jedis jedis;
private final Cache<String, String> caffeineCache;
public RedisCaffeineCache(Jedis jedis) {
this.jedis = jedis;
this.caffeineCache = Caffeine.newBuilder()
.maximumSize(10_000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build();
}
public String get(String key) {
// 先从Caffeine缓存获取
String value = caffeineCache.getIfPresent(key);
if (value == null) {
// Caffeine缓存未命中,从Redis获取
value = jedis.get(key);
if (value != null) {
// 将获取的数据存入Caffeine缓存
caffeineCache.put(key, value);
}
}
return value;
}
public void put(String key, String value) {
// 直接写入Redis
jedis.set(key, value);
// 同时写入Caffeine缓存
caffeineCache.put(key, value);
}
public void evict(String key) {
// 从Redis删除
jedis.del(key);
// 从Caffeine缓存删除
caffeineCache.invalidate(key);
}
}
这个示例代码展示了如何使用Redis和Caffeine实现两级缓存。get
方法首先检查Caffeine缓存,如果未命中,再去Redis查询。put
方法直接将数据存入Redis,并同时更新Caffeine缓存。evict
方法会从Redis和Caffeine缓存中删除一个键值对。
评论已关闭