缓存穿透
说明:缓存穿透是指客户端请求缓存和数据库都不存在的数据,这样缓存永远不会生效,这些请求都会打到数据库上。
如图:每次请求都经过3、4、5,每次都要操作数据库,也就是缓存无效了。如果是1w 请求,1w 请求最终都打到数据库上。
解决方案
常见的解决方案有两种:缓存空对象,使用布隆过滤器;
- 缓存空对象
客户端请求缓存和数据库都不存在的数据,返回时将控制设置到redis中,并且设置过期时间。
public Product getProductCache(String productId) {
// 从缓存中获取数据
String key = (String)redisTemplate.opsForValue().get("productId");
if (key == null) {
// 从数据库获取查询
Product product = ProductService.selectByProductId(productId);
if (Objects.nonNull(product)) {
// 数据库存在数据,则重新设置缓存
redisTe