1、什么是缓存穿透?

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。

2、常见的解决缓存穿透有哪些方法

(1)缓存空对象

优点:实现简单,维护方便

缺点:额外的内存消耗,和可能造成短期的不一致

针对缺点内存消耗我们可以设置key的过期时间,针对于短期不一致性,我们可以在更新数据库的同时更新缓存;

redis缓存策略和持久化机制(浅聊Redis缓存穿透)(1)

(1)布隆过滤器

redis缓存策略和持久化机制(浅聊Redis缓存穿透)(2)

对于布隆过滤器的实现,我们放在后面的章节中讲解;

3、代码实现缓存空对象,解决缓存穿透现象:

redis缓存策略和持久化机制(浅聊Redis缓存穿透)(3)

public <R,ID> R queryWithPassThrough( String keyPrefix, ID id, Class<R> type, Function<ID, R> dbFallback, Long time, TimeUnit unit){ String key = keyPrefix id; // 1.从redis查询商铺缓存 String JSON = stringRedisTemplate.opsForValue().get(key); // 2.判断是否存在 if (StrUtil.isNotBlank(json)) { // 3.存在,直接返回 return JSONUtil.toBean(json, type); } // 判断命中的是否是空值 if (json != null) { // 返回一个错误信息 return null; } // 4.不存在,根据id查询数据库 R r = dbFallback.apply(id); // 5.不存在,返回错误 if (r == null) { // 将空值写入redis stringRedisTemplate.opsForValue().set(key, "", CACHE_NULL_TTL, TimeUnit.MINUTES); // 返回错误信息 return null; } // 6.存在,写入redis this.set(key, r, time, unit); return r; }

,