Redis:处理缓存穿透的两种方法

缓存穿透:客户端请求的数据在缓存和数据库中都不存在,这样缓存永远不能生效,请求都会直接发送到数据库

解决方案:

1.缓存空对象

查完数据库后,将该数据以空值缓存进redis中,同时增加命中时对命中空值的判断

java 复制代码
 @Override
    public Result queryById(Long id) {
        String key=CACHE_SHOP_KEY+id;
        //1.从redis查询商铺缓存
        String shopJson=stringRedisTemplate.opsForValue().get(key);
        //2.判断是否存在,isNotBlank("")也为false
        if(StrUtil.isNotBlank(shopJson)){
            //3.存在,返回商铺对象
            Shop shop= JSONUtil.toBean(shopJson,Shop.class);
            return Result.ok(shop);
        }
        //判断命中的是否为空值
        if(shopJson != null && shopJson.isEmpty()){
            return Result.fail("店铺不存在");
        }
        //4.不存在,从mysql数据库中查询
        Shop shop=getById(id);
        //5.判断是否存在
        if(shop==null){
            //缓存空值,处理缓存穿透
            stringRedisTemplate.opsForValue().set(key,"",CACHE_NULL_TTL,TimeUnit.MINUTES);
            return Result.fail("店铺不存在");
        }
        //6.存在,向redis中缓存店铺数据

        stringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(shop),LOGIN_USER_TTL, TimeUnit.MINUTES);
        //7.返回
        return Result.ok(shop);
    }

2.布隆过滤器

3.增加id的复杂度,防止id规律被猜中

4.做好数据的基础格式校验

5.加强用户权限限制

相关推荐
Narutolxy9 分钟前
MySQL+Redis实战教程:从Docker安装部署到自动化备份与数据恢复20250418
redis·mysql·docker
sinat_2622921123 分钟前
Java面试实战:谢飞机的求职记 - Spring Boot、Redis与微服务技术问答解析
java·spring boot·redis·微服务·分布式事务
盖世英雄酱581361 小时前
同事说缓存都用redis啊,数据不会丢失!真的吗?
redis·后端·面试
techdashen1 小时前
性能比拼: Redis vs Dragonfly
数据库·redis·缓存
_Djhhh2 小时前
【Redis】缓存三剑客问题实践(上)
数据库·redis·缓存
蜗牛03144 小时前
Redis在SpringBoot中的使用
java·spring boot·redis
一个小坑货4 小时前
Docker 部署 Redis 缓存服务
redis·缓存·docker
码熔burning6 小时前
Redis分片集群
数据库·redis·分片集群
小五Z7 小时前
Redis--主从复制
数据库·redis·分布式·后端·缓存
马达加斯加D7 小时前
缓存 --- 缓存击穿, 缓存雪崩, 缓存穿透
数据库·redis·缓存