关注“之家技术”,获取更多技术干货
总篇149篇 2022年第24篇
★ 目录 ★
01 | 前言 |
02 | 场景介绍 2.1 XML格式数据缓存(1.0版本) 2.2 XML及.Net DataTable格式数据缓存(2.0版本) 2.3 Protobuf格式数据缓存(3.0版本) 2.4 Protobuf结合LocalCache多级缓存(4.0版本) |
03 | 缓存应用 |
04 | 实施成果 |
05 | 总结及后续扩展 |
前言
随着业务的发展,数据内容越来越复杂,用户、访问量也在增长。访问量的增多,导致数据库计算查询压力增大,从而导致响应变慢,因此对部分(指:更新频率较低,使用很频繁)数据进行缓存,来减轻数据库压力和提高响应速度。
初期技术语言使用单一,业务场景简单,因此采用缓存手段也相对简单。在业务高速发展的情况下,为了支撑更大的吞吐量并且响应足够及时,无论是系统架构还是缓存架构,都进行了多次升级。
场景介绍
图1 缓存1.0
2、XML及.Net DataTable格式数据缓存(2.0版本):
随着业务的发展,数据实体越来越多且结构越来越复杂,以及应用的增多导致服务器的增加。1.0版本的缓存方式弊端显露,存储数据形式单一、需要推送多台服务器、保证数据的一致性的成本也随之变高。且采用XML格式对数据进行序列化时,虽然时间消耗上性能尚可,但使用XML格式对数据进行反序列化时的时间花费上,耗时长,性能差,在高并发下,尤为明显,原因是XML格式为了保持较好的可读性,引入了一些冗余的文本信息。所以在使用XML格式进行存储数据时,也会占用更多空间。因此为了解决这些问题,在1.0缓存的基础上,增加Redis做为缓存层,一是丰富缓存数据存储形式(使用.Net DataTable格式),二是缓存数据可用性、一致性得到更有效保障。
图2 缓存2.0
图3 缓存3.0
4、Protobuf结合LocalCache多级缓存(4.0版本):
图4 缓存应用场景
实际应用场景中,对各类数据进行划分存储。比如车型库基础信息、车源标签信息、商家基础信息、车源基础信息等等。因为部分业务在同一次请求中对缓存的读取次数相当高,高达几十次,比如二手车车源列表页数据,在渲染中,需要获取车源的基础数据,配置数据,标签等数据,都是同一时间大量请求Redis。Redis固然查询速度很快,但在高并发下大量网络IO也会导致响应变慢。在流量高峰或者突发性的增长下,网络IO的抖动容易造成服务器IO的堵塞,存在很大宕机风险。因此引入了本地缓存,由本地缓存来承接流量,从而减少网络IO的开销,有效的避免由网络IO不稳定而带来的风险。
图5 缓存4.0
缓存应用
图6 应用缓存数据时序图
图7 数据同步流程
实施成果
图8 API 99TP响应对比图
表1 未使用缓存API请求响应耗时
表2 使用缓存API请求响应耗时
总结及后续扩展
在使用缓存来支撑业务发展的过程中,随着业务的快速发展及流量的增长,碰到了磁盘IO、数据库资源、网络IO等各种问题,通过对实际问题的逐一解决,逐步升级缓存架构到现有的4.0版本多级缓存。多级缓存的使用在实际应用中,极大的提高了服务器并发处理能力,提高服务响应速度,在对业务、用户体验提升的同时,也提高了前端应用服务器资源的利用率,减轻了后端服务器的压力,避免了增加后端服务器的成本。
在实际业务中,还存在部分业务对数据时效性有较高的要求。针对这个问题,后续对缓存的升级有了初步规划,考虑数据的实时更新、主动更新来确保数据的及时性,更好的支撑业务,为用户带来更好的体验。
作者简介
汽车之家
二手车事业部-技术部
何峰
加入汽车之家二手车事业部多年,负责二手车信息平台、买车卖车等业务的研发工作
阅读更多:
▼ 关注「之家技术」,获取更多技术干货 ▼