Redis-实战篇-实现商铺缓存与数据库的双写一致(超时剔除和主动更新)

文章目录

1、给查询商铺的缓存添加超时剔除和主动更新的策略

修改ShopController中的业务逻辑,满足下面的需求:

  1. 根据id查询店铺时,如果缓存未命中,则查询数据库,将数据库结果写入缓存,并设置超时时间
  2. 根据id修改店铺时,先修改数据库,再删除缓存

2、根据id查询店铺

2.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);
        }

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

2.2、RedisConstants.java

java 复制代码
    public static final Long CACHE_SHOP_TTL = 30L;
    public static final String CACHE_SHOP_KEY = "cache:shop:";

3、根据id修改店铺

3.1、ShopController.java

java 复制代码
    @PutMapping
    public Result updateShop(@RequestBody Shop shop) {
        // 写入数据库
        //shopService.updateById(shop);
        //return Result.ok();
        return shopService.update(shop);
    }

3.2、update

java 复制代码
    @Override
    @Transactional
    public Result update(Shop shop) {
        Long id = shop.getId();
        if (id == null) {
            return Result.fail("店铺id不能为空");
        }
        //1、更新数据库
        updateById(shop);
        //2、删除缓存
        stringRedisTemplate.delete(CACHE_SHOP_KEY + id);
        return Result.ok();
    }
}


此时刷新redis发现,商户信息已经被删除

相关推荐
老华带你飞3 分钟前
工会管理|基于springboot 工会管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·spring
自在极意功。3 分钟前
MyBatis配置文件详解:environments、transactionManager与dataSource全面解析
java·数据库·tomcat·mybatis
紫金桥软件4 分钟前
紫金桥软件 | 赋能工业数字化转型
数据库·国产化
Navicat中国7 分钟前
Navicat x 达梦技术指引 | 模型转换
数据库·达梦·navicat·概念模型·物理模型·逻辑模型·模型转换
邂逅星河浪漫9 分钟前
【MySQL 事务】详细介绍+实例
数据库·mysql·事务
tianyuanwo11 分钟前
RPM数据库锁竞争:原理、诊断与根治方案
数据库·rpm·bdb·命令挂起
TG:@yunlaoda360 云老大13 分钟前
如何评估华为云国际站代理商跨境合规要求?
大数据·数据库·华为云·云计算
志凌海纳SmartX14 分钟前
银行核心系统备库“降本增效”探索:超融合承载Oracle ADG备库的测试验证
数据库·oracle
木卫二号Coding18 分钟前
POSTGRESQL+数据库备份与还原
数据库·postgresql·oracle
Lvan的前端笔记19 分钟前
python:用 dotenv 管理环境变量&生产环境怎么管理环境变量
网络·数据库·python