商铺信息保存到redis的思路

86 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情

1.内容概述

最近在学习黑马的redis相关课程,本篇的内容主要是介绍店铺的信息如何缓存到redis中。希望借着这篇文章理清如何将需要的数据从数据库中拿取出来,再保存到数据库的思路。

2.为什么要使用redis

首先我们需要明白我们为什么需要使用缓存。现在CPU的计算能力已经大大加强了,但是受限与硬盘等硬件,有时候读取数据的速度并不能使我们满意。我们发现,如果将数据保存在内存的话,我们从内存读取数据的速度无疑会更快。所以我们将常用的数据从数据库中读取出来,放到内存中。而这些被我们放到内存的数据我们通常叫它缓存。 我们常用的缓存软件叫redis。我们可以通过redis将需要快速访问的数据放到redis里面。

image.png redis在项目中的用法如上图。请求来的时候,先不要去数据库查询,因为相比去redis查询更加耗时。我们一般是让请求先访问redis,看里面是否有数据,如果有,我们就直接返回;如果redis中没有我们需要的数据,那再到数据库中查询,接着将数据库查询到的内容保存到redis中,最后将数据返回。

3.关键代码实现

image.png

  1. 我们这里采用简单的String数据结构来保存商铺数据,第一次访问肯定是访问数据库的,毕竟第一次访问redis里面肯定没有商铺的信息。所以我们可以自己来设置redis中key的值,这里采用前缀+商铺id的方式作为key。为什么不直接用商铺id作为key是为了以防后面又的地方也需要商铺id,我们通过加前缀也可以区分这个商铺id在redis中的意义。
  2. 从redis中查询出来的数据如果不为空,那就是String类型,毕竟我们存的就是JSON格式的String类型的数据到redis中。因此我们可以通过判断我们从redis中获取的字符串是否为空来验证我们是否命中了redis。 如果redis被我们命中,我们就会获得JSON格式的字符串,再将这个JSON字符串转为类对象返回给前端即可。StrUtil和JSONUtil都是hutool提供的工具类。
  3. 这里需要注意的点是,我们从redis中获取到的数据需要我们自己转化成对应的实体类,再返回给前端;我们从数据库获取的数据也需要我们转化,比如把对应的实体类对象转化成JSON格式的字符串再保存到redis里面。
@GetMapping("/{id}")
public Result queryShopById(@PathVariable("id") Long id) {
    return shopService.queryById(id);
}
@Resource
private StringRedisTemplate stringRedisTemplate;

@Override
public Result queryById(Long id) {
    //String key = "cache:shop:" + id;
    String key = RedisConstants.CACHE_SHOP_KEY + id;
    //1.从redis查询商铺缓存
    String shopJson = stringRedisTemplate.opsForValue().get(key);
    //2.判断是否存在
    if (StrUtil.isNotBlank(shopJson)) {
        //3.redis存在,直接返回
        Shop shop = JSONUtil.toBean(shopJson, Shop.class);
        return Result.ok(shop);
    }
    //4.redis不存在,根据id查询数据库
    Shop shop = getById(id);
    //5.数据库不存在,返回错误
    if (shop == null){
        return Result.fail("店铺不存在");
    }
    //6.数据库存在,写入redis
    stringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(shop));
    //7.返回
    return Result.ok(shop);
}