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

相关推荐
thekenofdis6 小时前
Lua脚本执行多个redis命令提示“CROSSSLOT Keys in request don‘t hash to the same slot“问题
redis·lua·哈希算法
linuxxx1108 小时前
django测试缓存命令的解读
python·缓存·django
oneslide10 小时前
Kubernetes环境部署Redis集群
redis·容器·kubernetes
song85460113410 小时前
线程本地(ThreadLocal)的缓存容器
缓存
是垚不是土12 小时前
构建高可用Redis:哨兵模式深度解析与Nacos微服务适配实践
redis·微服务·bootstrap
找不到、了12 小时前
缓存命中率从 50% 到 95%:缓存优化实战指南
缓存
humors22113 小时前
服务端开发案例(不定期更新)
java·数据库·后端·mysql·mybatis·excel
_Jimmy_14 小时前
Nacos的三层缓存是什么
java·缓存
朝新_14 小时前
【实战】动态 SQL + 统一 Result + 登录校验:图书管理系统(下)
xml·java·数据库·sql·mybatis