开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情
1.内容概述
最近在学习黑马的redis相关课程,本篇的内容主要是介绍店铺的信息如何缓存到redis中。希望借着这篇文章理清如何将需要的数据从数据库中拿取出来,再保存到数据库的思路。
2.为什么要使用redis
首先我们需要明白我们为什么需要使用缓存。现在CPU的计算能力已经大大加强了,但是受限与硬盘等硬件,有时候读取数据的速度并不能使我们满意。我们发现,如果将数据保存在内存的话,我们从内存读取数据的速度无疑会更快。所以我们将常用的数据从数据库中读取出来,放到内存中。而这些被我们放到内存的数据我们通常叫它缓存。 我们常用的缓存软件叫redis。我们可以通过redis将需要快速访问的数据放到redis里面。
redis在项目中的用法如上图。请求来的时候,先不要去数据库查询,因为相比去redis查询更加耗时。我们一般是让请求先访问redis,看里面是否有数据,如果有,我们就直接返回;如果redis中没有我们需要的数据,那再到数据库中查询,接着将数据库查询到的内容保存到redis中,最后将数据返回。
3.关键代码实现
- 我们这里采用简单的String数据结构来保存商铺数据,第一次访问肯定是访问数据库的,毕竟第一次访问redis里面肯定没有商铺的信息。所以我们可以自己来设置redis中key的值,这里采用前缀+商铺id的方式作为key。为什么不直接用商铺id作为key是为了以防后面又的地方也需要商铺id,我们通过加前缀也可以区分这个商铺id在redis中的意义。
- 从redis中查询出来的数据如果不为空,那就是String类型,毕竟我们存的就是JSON格式的String类型的数据到redis中。因此我们可以通过判断我们从redis中获取的字符串是否为空来验证我们是否命中了redis。 如果redis被我们命中,我们就会获得JSON格式的字符串,再将这个JSON字符串转为类对象返回给前端即可。StrUtil和JSONUtil都是hutool提供的工具类。
- 这里需要注意的点是,我们从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);
}