Redis实战-redis与数据库双写入-思想及实现

1. 为什么要使用redis缓存?

一句话:因为速度快,好用

缓存数据存储于代码中,而代码运行在内存中,内存的读写性能远高于磁盘,缓存可以大大降低用户访问并发量带来的服务器读写压力

2. 实现店铺缓存和数据库双写一致

实现店铺缓存和数据库双写一致

2.1 单个商铺

使用**import cn.hutool.json.JSONUtil;**来将json与对象互换

	@Resource
    private ShopMapper shopMapper;
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public Result queryById(Long id) {
        // 1. 从redis查询商铺缓存
        String shopJson = stringRedisTemplate.opsForValue().get(CACHE_SHOP_KEY + id);
        // 2. 判断是否存在
        if (StrUtil.isNotBlank(shopJson)) {
            // 3. 存在,直接返回 -> 这里拿到的json需要转化为对象
            Shop shop = JSONUtil.toBean(shopJson, Shop.class);
            return Result.ok(shop);
        }
        // 4. 不存在,根据id来查询数据库
        Shop selectById = shopMapper.selectById(id);
        // 5. 不存在,返回错误
        if (selectById == null){
            return Result.fail("店铺不存在");
        }
        // 6. 存在,写入redis
        stringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY + id,JSONUtil.toJsonStr(selectById));
        // 7. 返回
        return Result.ok(selectById);
    }

在这里插入图片描述

2.2 多个商铺形成的list

使用**import cn.hutool.json.JSONUtil;**来将jsonList与对象List互换

	@Resource
    StringRedisTemplate stringRedisTemplate;

    @Override
    public Result queryShopType() {
        // 1. 从redis查询商铺缓存
        //String shopTypeUUID = UUID.randomUUID().toString(true);
        String shopTypeFlad = "shopTypeList";
        String shopTypeJson = stringRedisTemplate.opsForValue().get(CACHE_SHOPTYPE_KEY + shopTypeFlad);
        // 2. 判断是否存在
        if (StrUtil.isNotBlank(shopTypeJson)) {
            // 3. 存在,直接返回 -> 这里拿到的json需要转化为对象
            List<ShopType> shopTypes = JSONUtil.toList(shopTypeJson,ShopType.class);
            return Result.ok(shopTypes);
        }
        // 4. 不存在,根据id来查询数据库
        List<ShopType> typeList = query().orderByAsc("sort").list();
        // 5. 不存在,返回错误
        if (CollUtil.isEmpty(typeList)) {
            return Result.fail("系统繁忙,请稍后再试");
        }
        // 6. 存在,写入redis
        stringRedisTemplate.opsForValue().set(CACHE_SHOPTYPE_KEY + shopTypeFlad, JSONUtil.toJsonStr(typeList));
        // 7. 返回
        return Result.ok(typeList);
    }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值