缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。(一般是指黑客的恶意流量攻击)
常见的解决方案有两种:


首先,在第一次查询不存在时,缓存空数据数据到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中保存了""值,再次查询时,则不通过数据库,直接在缓存层命中

上一篇:C语言学习笔记-错误处理