Redis-实战篇-编码解决商铺查询的缓存穿透问题(缓存空对象)

文章目录

1、缓存穿透

缓存击穿是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。

2、常见的解决方案有两种:

2.1、缓存空对象

优点:实现简单,维护方便
缺点:额外的内存消耗、可能造成短期的不一致

2.2、布隆过滤器

优点:内存占用较少,没有多余key
缺点:实现复杂、存在误判可能

3、编码解决商铺查询的缓存穿透问题

3.1、queryById

java 复制代码
    @Override
    public Result queryById(Long id) {
        String key = CACHE_SHOP_KEY + id;
        //1、从redis查询商铺缓存
        String shopJson = stringRedisTemplate.opsForValue().get(key);
        //2、判断是否存在
        if (StrUtil.isNotBlank(shopJson)) {
            //3、存在,直接返回
            Shop shop = JSONUtil.toBean(shopJson, Shop.class);
            return Result.ok(shop);
        }

        //判断命中的是否是空值
        if (shopJson != null) {
            return Result.fail("店铺不存在!");
        }

        //4、不存在,根据id查询数据库
        Shop shop = getById(id);
        //5、数据库不存在,返回错误
        if (shop == null) {
            // 将空值写入redis
            stringRedisTemplate.opsForValue().set(key, "", CACHE_NULL_TTL, TimeUnit.MINUTES);
            //返回错误信息
            return Result.fail("店铺不存在!");
        }
        //6、存在,写入redis
        stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(shop),CACHE_SHOP_TTL, TimeUnit.MINUTES);
        //7、返回
        return Result.ok(shop);
    }

3.2、RedisConstants.java

java 复制代码
    public static final Long CACHE_NULL_TTL = 2L;

    public static final Long CACHE_SHOP_TTL = 30L;
    public static final String CACHE_SHOP_KEY = "cache:shop:";
相关推荐
Rick199315 小时前
如何保证数据库和Redis缓存一致性
数据库·redis·缓存
_ziva_17 小时前
5 分钟搭建 CSV 数据问答系统:LangChain + LLM 实战教程
jvm·数据库·oracle
indexsunny17 小时前
互联网大厂Java求职面试实战:基于电商场景的技术问答及解析
java·spring boot·redis·kafka·security·microservices·面试指导
渣瓦攻城狮18 小时前
互联网大厂Java面试:从数据库连接池到分布式缓存及微服务
java·redis·spring cloud·微服务·hikaricp·数据库连接池·分布式缓存
tod1131 天前
Redis 分布式锁进阶:从看门狗到 Redlock 的高可用实践
数据库·redis·分布式
闲人编程1 天前
Celery分布式任务队列
redis·分布式·python·celery·任务队列·异步化
渣瓦攻城狮1 天前
互联网大厂Java面试:Spring、微服务与消息队列技术详解
java·redis·spring·微服务·消息队列·面试指南·程序员面试
玄〤1 天前
个人博客网站搭建day2-Spring Boot 3 + JWT + Redis 实现后台权限拦截与单点登录(漫画解析)
java·spring boot·redis·后端·jwt
Anastasiozzzz1 天前
阿亮随手记 SpringBoot应用启动预热、@Lazy、Bean作用域、多环境配置
spring boot·spring·oracle
山岚的运维笔记1 天前
SQL Server笔记 -- 第70章:临时表的使用
数据库·笔记·sql·microsoft·oracle·sqlserver