redis实战(商品查询缓存)

根据id查询商品:

添加redis缓存(增强读写功能)步骤

1.从redis中获取商品信息,判断信息是否存在

2.若存在则从redis中获取,不存在则直接查询数据库

3.若数据库中不存在则返回错误信息

4.若数据库中存在则同同样将信息存入redis中

controller层

复制代码
    @GetMapping("/{id}")
    public Result queryShopById(@PathVariable("id") Long id) {
        return shopService.queryById(id);
    }

service层

复制代码
@Resource
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public Result queryById(Long id) {
        String key=CACHE_SHOP_KEY+id;
        //从redis查询商品缓存
        String shopJson = stringRedisTemplate.opsForValue().get(key);

        //判断是否命中,若命中
        if(StrUtil.isNotBlank(shopJson)){
            Shop shop = JSONUtil.toBean(shopJson, Shop.class);
            return Result.ok(shop);
        }
        //判断命中是否为空值
        if(shopJson!=null){
            //返回一个错误信息
            return Result.fail("店铺不存在");
        }

        //若不存在,查询数据库
        Shop shop = getById(id);

        if(shop==null){
            //将空值写入redis
            stringRedisTemplate.opsForValue().set(key,"",CACHE_NULL_TTL,TimeUnit.MINUTES);
            return Result.fail("店铺不存在");
        }
        //存入redis
        stringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(shop),CACHE_SHOP_TTL, TimeUnit.MINUTES);

        return Result.ok(shop);
    }

有可能发生数据库和redis中信息存储不一致的情况,即缓存更新问题

对于低一致性的需求:可以使用内存淘汰,例如商品店铺的查询缓存

对于高一致性的需求:使用主动更新,并以超时剔除为兜底方案,例如商品详情查询的缓存

然后应该先操作数据库,再删除缓存

查询店铺

controller类

复制代码
    @GetMapping("/{id}")
    public Result queryShopById(@PathVariable("id") Long id) {
        return shopService.queryById(id);
    }

service类

复制代码
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public Result queryTypeList() {
        String key=CACHE_SHOP_TYPE_KEY;
        //从redis中读取缓存
        String type = stringRedisTemplate.opsForValue().get(key);

        //判断是否命中缓存
        if(StrUtil.isNotBlank(type)){
            //若存在
            List<ShopType> list = JSONUtil.toList(type, ShopType.class);
            return Result.ok(list);
        }

        //若不存在,查找数据库
        List<ShopType> shopTypes = query().orderByAsc("sort").list();
        if(shopTypes==null){
            return Result.fail("分类不存在!");
        }

        //存入redis
        stringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(shopTypes));

        return Result.ok(shopTypes);
    }

还需考虑缓存穿透问题

解决方案

1.从redis中获取信息,判断信息是否存在(再判断是否为空值)

2.若存在则从redis中获取,不存在则直接查询数据库

3.若数据库中不存在则设置为空值存入redis并设置有效时长

4.若数据库中存在则同同样将信息存入redis中

缓存雪崩

相关推荐
蛋蛋的就会顺顺的2 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
需要8262 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡3 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
骇客野人3 小时前
在麒麟操作系统上 分别安装 jdk1.8, 达梦数据库,redis ,memcache 的操作实施方案和步骤
数据库·redis·memcached
伯恩bourne4 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
silvamux_5 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
省钱兄--zs5 小时前
深圳24小时自助健身房软硬件解决方案实战指南与开发流程详解
java·数据仓库·spring boot·小程序·架构
顽疲5 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog6 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
用户21296835261686 小时前
开源了一个 Java 多智能体 LLM 框架 Baton:一个依赖,把 Agent 循环、工具调用、记忆、编排全配齐
java·llm