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.加强用户权限限制

相关推荐
tod11332 分钟前
Redis 分布式锁进阶:从看门狗到 Redlock 的高可用实践
数据库·redis·分布式
闲人编程37 分钟前
Celery分布式任务队列
redis·分布式·python·celery·任务队列·异步化
亓才孓1 小时前
【SQLSyntaxErrorException】SQL语法错误
数据库·sql·mybatis
亓才孓1 小时前
【MyBatis Exception】SQLSyntaxErrorException(按批修改不加配置会报错)
java·开发语言·mybatis
亓才孓1 小时前
【MyBatis Runtime Exception】自动驼峰映射对Map不生效,应该在查询中起别名
java·windows·mybatis
亓才孓1 小时前
【MyBatis Plus】MyBatis Plus框架
mybatis
树码小子1 小时前
图书管理系统(3)修改图书接口
spring boot·mybatis·图书管理系统
渣瓦攻城狮1 小时前
互联网大厂Java面试:Spring、微服务与消息队列技术详解
java·redis·spring·微服务·消息队列·面试指南·程序员面试
玄〤1 小时前
个人博客网站搭建day2-Spring Boot 3 + JWT + Redis 实现后台权限拦截与单点登录(漫画解析)
java·spring boot·redis·后端·jwt
tod1132 小时前
Redis:从消息中间件到分布式核心
服务器·开发语言·redis·分布式