【遇见青山】项目难点:缓存穿透的解决方案
- 1.缓存穿透现象
- 缓存空对象
- 布隆过滤
- 其他方案
- 2.解决方案,缓存空数据
1.缓存穿透现象
缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。(一般是指黑客的恶意流量攻击)
常见的解决方案有两种:
缓存空对象
- 优点:实现简单,维护方便
- 缺点:额外的内存消耗,可能造成短期的不一致
布隆过滤
- 优点:内存占用较少,没有多余key
- 缺点:实现复杂,存在误判可能
其他方案
- 增强id的复杂度,避免被猜测id规律
- 做好数据的基础格式校验
- 加强用户权限校验
- 做好热点参数的限流
2.解决方案,缓存空数据
首先,在第一次查询不存在时,缓存空数据数据到Redis中:
// 不存在,查询数据库
Shop shop = getById(id);
// 查询数据库不存在,返回错误
if (shop == null) {
// 将null值写入Redis,防止缓存穿透问题
stringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY + id, "", CACHE_NULL_TTL, TimeUnit.MINUTES);
return Result.fail("店铺不存在!");
}
在查询数据库之前,判断缓存的值是否为""
值,如果是则直接返回错误:
// 判断命中的是否为空值 ""
if ("".equals(shopJson)) {
return Result.fail("店铺信息不存在!");
}
测试:查询不存在的商户信息,Redis中保存了""
值,再次查询时,则不通过数据库,直接在缓存层命中