本文讲解Redis在应用缓存领域的使用方法,实例代码基于 .net core WebApi进行实现。实例代码下载链接:http://www.80cxy.com/Blog/ResourceView?arId=202401110950583321kEqrCT
缓存是数据交换的缓冲区(称作Cache),是存贮数据的临时地方,一般读写性能较高。缓存有浏览器缓存、应用层缓存、数据库缓存。Redis主要用于应用层缓存。
降低后端负载,经常访问的数据将存储在Redis中,不用读取数据库进行获取。
提高读写效率,降低响应时间,Redis数据存储在内存中,数据库数据在磁盘中,内存获取数据响应时间较快。
数据一致性成本,Redis数据与数据库数据需保持一致,有些场景可能存在不一致的情况。
代码维护成本,为保持Redis和数据库存储数据的一致性,需要通过额外代码编写实现。
运维成本,为避免缓存雪崩,保证缓存高可用,需要搭建集群模式,需要进行软硬件的定期维护。
添加Redis缓存的目的是能更快的获取数据,并降低后端负载,增加Redis缓存后数据获取流程为,先从Redis中获取,如果有则直接返回,如果没有则再从数据库获取,获取到数据返回并将数据写入Redis,流程图如下:
增加Redis缓存后的数据获取具体程序流程如下图所示:
以下代码是获取一个商铺实体信息的实现:
public async Task<ResponseContent> GetShopById(string id) { ResponseContent response = new ResponseContent(); Shop shop = null; //1.从Redis缓存查询商品 string shopStr = cacheService.Get(RedisConstants.CACHE_SHOP_KEY + id); //2.判断是否存在 if (!string.IsNullOrEmpty(shopStr)) { //3.存在直接返回 shop = JsonConvert.DeserializeObject<Shop>(shopStr); return response.Ok(new { shop }); } //4.不存在,根据Id查询数据库 shop = await redisRepostory.GetShopById(id); if (shop == null) { //5.不存在,返回错误 return response.Error(ResponseType.ParameterVerificationError); } //6.存在写入Redis cacheService.Add(RedisConstants.CACHE_SHOP_KEY + id, JsonConvert.SerializeObject(shop)); //7.返回 return response.Ok(shop); }
Redis缓存更新策略主要包含以下三种:
不用自己维护,利用Redis内容淘汰机制,当内容不足时自动淘汰部分数据。下次查询时更新缓存。一致性效果差,维护成本几乎为零。
给缓存数据添加TTL时间,到期后自动删除缓存。下次查询时更新缓存。一致性一般,维护成本比较低。
自己编写业务逻辑,在修改数据库的同时,更新缓存。一致性非常好,需要自己写代码,编码比较复杂,维护成本较高。
1、缓存更新策略业务场景:
低一致性需求:使用内存淘汰机制。例如商品分类数据。
高一致性需求:主动更新,并以超时剔除昨晚兜底方案。例如店铺详情数据。
2、主动更新策略详解:
(1)由缓存的调用者,在更新数据库的同时更新缓存。实际开发中比较常用。
◆一般选择删除缓存,而不是更新缓存,查询时在更新缓存。
◆单体系统,将缓存与数据库操作放在一个事务,保证缓存与数据库操作同时成功。
◆分布式系统,采用TCC等分布式事务方案,保证缓存与数据库操作同时成功。
◆先操作数据库,再删除缓存。
(2)缓存与数据库整合为一个服务,由服务来维护一致性。调用者调用该服务,无需关心缓存一致性问题。
(3)调用者只操作缓存,由其他线程异步的将缓存数据持久化到数据库,保证最终一致性。
以下将上面获取商铺代码进行升级,实现缓存更新策略,第一段代码是获取商铺信息代码,第二段是修改商铺信息代码,获取商铺代码加入过期时间,修改商铺代码加入删除缓存。
public async Task<ResponseContent> GetShopById(string id) { ResponseContent response = new ResponseContent(); Shop shop = null; //1.从Redis缓存查询商品 string shopStr = cacheService.Get(RedisConstants.CACHE_SHOP_KEY + id); //2.判断是否存在 if (!string.IsNullOrEmpty(shopStr)) { //3.存在直接返回 shop = JsonConvert.DeserializeObject<Shop>(shopStr); return response.Ok(new { shop }); } //4.不存在,根据Id查询数据库 shop = await redisRepostory.GetShopById(id); if (shop == null) { //5.不存在,返回错误 return response.Error(ResponseType.ParameterVerificationError); } //6.存在写入Redis,并设置缓存超时时间 cacheService.Add(RedisConstants.CACHE_SHOP_KEY + id, JsonConvert.SerializeObject(shop), RedisConstants.CACHE_SHOP_TTL); //7.返回 return response.Ok(shop); }
public async Task<ResponseContent> UpdateShop(string id, string name, string address) { ResponseContent response = new ResponseContent(); try { //更新数据库 await redisRepostory.UpdateShop(id, name, address); //删除Redis缓存,每次查询商铺信息在重新获取 cacheService.Remove(RedisConstants.CACHE_SHOP_KEY + id); return response.Ok(ResponseType.OperSuccess); } catch (Exception e) { return response.Error(ResponseType.OperError); } }
初学,如有不对的地方,欢迎评论区指正。
- .net core WebApi使用Redis教程(二)Redis缓存应用基础讲解(838)
- Redis教程一、Redis基础讲解及windows下安装、配置说明(612)
- .net core WebApi使用Redis教程(一)Redis代替Session实现登录(520)
- .net core WebApi使用Redis教程(五)Redis缓存应用缓存击穿概念及解决办法(472)
- .net core WebApi使用Redis教程(三)Redis缓存应用缓存穿透概念及解决办法(459)
- Redis教程二、Redis数据结构及常用命令详细介绍(379)
- .net core WebApi使用Redis教程(四)Redis缓存应用缓存雪崩讲解(375)
- Redis教程三、一图读懂Redis企业应用场景(350)
- 2025年3月 (1)
- 2024年6月 (2)
- 2024年5月 (2)
- 2024年4月 (4)
- 2024年3月 (30)
- 2024年1月 (4)
- 2023年12月 (2)
- 2023年11月 (4)
- 2023年10月 (4)
- 2023年9月 (6)
- 2023年3月 (2)
- 2023年2月 (1)
- 2023年1月 (1)
- 2022年12月 (1)
- 2022年9月 (21)
- 2022年8月 (10)
- 2022年7月 (3)
- 2022年4月 (1)
- 2022年3月 (13)
- 2021年8月 (1)
- 2021年3月 (1)
- 2020年12月 (42)
- 2020年11月 (7)
- 2020年10月 (5)
- 2020年8月 (1)
- 2020年6月 (1)
- 2020年3月 (2)
- 2019年12月 (8)
- 2019年11月 (3)
- 2019年9月 (1)
- 2019年4月 (1)
- 2019年3月 (6)
- 2019年2月 (1)
- 2018年7月 (7)
- 1.asp.net mvc内微信pc端、H5、JsApi支付方式总结(5702)
- 2.各大搜索网站网站收录提交入口地址(3201)
- 3.Windows 10休眠文件更改存储位置(3163)
- 4.ECharts仪表盘实例及参数使用详解(3095)
- 5.windows 10安装myeclipse 10破解补丁cracker.jar、run.bat闪退解决办法(2991)
- 6.HTML5 WebSocket与C#建立Socket连接实现代码(2865)
- 7.华为鸿蒙系统清除微信浏览器缓存方法(2779)
- 8.CERT_HAS_EXPIRED错误如何解决(2245)
- 9.Js异步async、await关键字详细介绍(lambda表达式中使用async和await关键字)(2187)
- 10.HBuilder编辑器格式化代码(2118)