【Redis】Spring Boot整合Redis和Guava,解决缓存穿透、缓存击穿、缓存雪崩等缓存问题
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
@Component
public class CacheService {
@Autowired
private StringRedisTemplate redisTemplate;
private LoadingCache<String, String> cache = CacheBuilder.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build(new CacheLoader<String, String>() {
@Override
public String load(String key) throws Exception {
// 缓存失效时,从Redis加载数据
return redisTemplate.opsForValue().get(key);
}
});
public String get(String key) throws ExecutionException {
// 尝试从Guava缓存获取数据
String value = cache.get(key);
if (value == null) {
// 缓存未命中,可能发生缓存穿透、缓存击穿或缓存雪崩
// 可以采取相应措施,如设置默认值、缓存空对象等
// 这里简单返回null,实际应用中可以根据业务需求处理
return null;
}
return value;
}
public void put(String key, String value) {
// 数据更新时,同时更新Redis和Guava缓存
redisTemplate.opsForValue().set(key, value);
cache.put(key, value);
}
public void remove(String key) {
// 删除缓存数据时,同时操作Redis和Guava缓存
redisTemplate.delete(key);
cache.invalidate(key);
}
}
这个示例展示了如何在Spring Boot应用中使用Redis和Guava Cache来提供缓存服务。get
方法首先尝试从Guava缓存中获取数据,如果缓存未命中,则从Redis加载数据。put
方法更新缓存和Redis,remove
方法删除缓存和Redis中的数据。在实际应用中,可以根据业务需求和缓存穿透、击穿、雪崩等问题的情况,适当地设置缓存的默认值、空对象或采用分布式锁等策略来避免这些问题。
评论已关闭