使用Redis实现业务信息缓存(缓存详解,缓存更新策略,缓存三大问题)
一、什么是缓存?
缓存是一种高效的数据存储方式,它通过将数据保存在内存中来提供快速的读写访问。这种机制特别适用于需要高速数据访问的应用场景,如网站、应用程序和服务。在处理大量数据和高并发请求时, 缓存能显著提高性能和用户体验。
Redis就是一款常用的缓存中间件。
二、如何在业务中结合Redis进行缓存(代码模版)?
1.基本步骤
在业务中结合Redis进行缓存主要有以下步骤:
(1)根据key到redis中查找对应值
(2)若查找到,则直接返回。若redis中没有,则在数据库中进行查找
(3)数据库查找完毕后,先存储查找到的数据到redis中,便于下次查找同样数据的时候,可以直接从redis中获取,不用走数据库,减轻数据库的压力
(4)最后将数据进行返回即可
2.代码模版
这里以查找商铺信息为例,给出结合redis进行商铺信息缓存的代码:
(1)Controller层:
/*** 根据id查询商铺信息* @param id 商铺id* @return 商铺详情数据*/@GetMapping("/{id}")public Result queryShopById(@PathVariable("id") Long id) {return shopService.queryById(id);}
(2)Service层:
@AutowiredStringRedisTemplate stringRedisTemplate;/*** 根据id查询商铺信息* @param id* @return*/@Overridepublic Result queryById(Long id) {//1.从redis查询商铺缓存String key = RedisConstants.CACHE_SHOP_KEY + id;String shopFromRedis = stringRedisTemplate.opsForValue().get(key);//2.判断是否存在if(!StringUtils.isEmpty(shopFromRedis)){//3.redis存在此商铺,返回结果Shop shop = JSONUtil.toBean(shopFromRedis, Shop.class);return Result.ok(shop);}//4.不存在,到数据库中去查询Shop shop = getById(id);//5.数据库不存在,返回错误if(shop == null){return Result.fail("店铺不存在");}//6.数据库存在,写入redisstringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(shop),RedisConstants.CACHE_SHOP_TTL, TimeUnit.MINUTES);//7.返回结果return Result.ok(shop);}
三、缓存更新策略
1.三种缓存更新策略
缓存更新策略主要有:内存淘汰,超时剔除和主动更新这三种。
1.内存淘汰:
简单来说就是Redis根据其内存大小,其淘汰策略(如:键值对的访问频率)等,对键值对进行淘汰。 可以对redis进行配置(如:设置redis内存大小),来控制其内存淘汰。这种方法一般由redis自主控制,因此其一致性也比较差。
2.超时剔除:
简单来说,就是在向redis存入键值对的时候,为这个键值对赋予一个TTL(超时时间),如果超过这个时间,redis就会将这个键值对进行删除。其一致性相较于内存淘汰策略会好一些。
3.主动更新:
也就是在修改数据库的时候对缓存也进行修改。这种方法一致性相较于前两种会好很多,但是需要由程序员自主编码进行控制,会复杂一些。
一般使用主动更新策略为主,结合超时剔除作为兜底,来实现缓存的更新。
2.主动更新详解
2.1.三种主动更新策略
(1)Cache Aside Pattern:
由缓存的调用者,在更新数据库的同时更新缓存
(2)Read/Write Through Pattern:
缓存与数据库整合为一个服务,由服务维护一致性,调用者调用该服务,无需关心缓存一致性问题。但这种方式较为复杂,市面上提供这种服务的框架较少。
(3)Wri