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:";
相关推荐
CC.GG2 小时前
【C++】二叉搜索树
java·c++·redis
only-qi4 小时前
Redis如何应对 Redis 大 Key 问题
数据库·redis·缓存
释怀°Believe7 小时前
javaweb
数据库·sql·oracle
Clarence Liu7 小时前
redis学习 (1) 基础入门
数据库·redis·学习
天生励志1237 小时前
Redis 安装部署
数据库·redis·缓存
北半球的夜7 小时前
emoji 表情符号保存问题
数据库·oracle
爬山算法9 小时前
Redis(169)如何使用Redis实现数据同步?
前端·redis·bootstrap
武帝为此10 小时前
【Redis 数据库介绍】
数据库·redis·缓存
铁锚10 小时前
Redis中KEYS命令的潜在风险与遍历建议
数据库·redis·缓存
爬山算法11 小时前
Redis(168) 如何使用Redis实现会话管理?
java·数据库·redis