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

相关推荐
gwf2161 小时前
SSD读写速度深度解析:顺序读写vs随机读写、IOPS、延迟,你的硬盘性能到底怎么看?
git·嵌入式硬件·缓存·github·智能硬件
番茄炒鸡蛋加糖4 小时前
缓存三大问题
缓存
江晓鱼未暖8 小时前
十七、Redis 核心原理与架构详解
大数据·数据库·数据仓库·redis·缓存·架构
红莲凪是8 小时前
Redis有哪些部署方案?了解哨兵机制吗?
java·redis·eureka
小罗水9 小时前
第13章 Redis 缓存、幂等锁与任务状态
数据库·redis·缓存
热心市民lcj9 小时前
Spring Boot 整合 Caffeine 本地缓存实战
spring boot·后端·缓存
zx11545010 小时前
【热点 Key 探测与加长缓存 TTL 实战】
缓存
Devin~Y10 小时前
从本地生活电商到 AI RAG:互联网大厂 Java 面试场景完整实战
java·spring boot·redis·elasticsearch·spring cloud·kafka·rag
momo1 天前
Java+WebAI黑马知识点
java·spring boot·mybatis
toooooop81 天前
如何用 ss + ps 精准定位本机 Redis 的“隐形”消费者?
linux·数据库·redis·缓存