缓存策略在项目中的运用
接上篇文章《》,分析了Springcache 缓存源码以及使用规范。本篇文章结合实际项目中应用场景,讲述缓存策略以及开发过程中的细节。
项目中的问题
项目A中2个关键key各35w个,key1对应的val包含:基本配置信息、控制流程信息、运营策略信息等等,对象中约70个字段信息,用于业务逻辑处理和上层返回数据的组装。每次的请求经过缓存模版判断、更新等一系列操作。
通过Client请求类型分别讲述项目中缓存策略:
Read请求
先读Cache,命中则返回结果
未命中,读DataSource,然后将数据同步到Cache中
Write请求
先写DataSource
然后更新Cache信息
日常1wQPS,通过监控统计发现80%的key并不活跃, 试想每次Write请求要将多个关联对象组装进行缓存且key调用频次低,这种冷数据缓存的同步更新影响资源消耗。此外还应考虑到Cache更新失败的情况,造成数据不一致的情况。
解决方案
根据实际项目中缓存场景,降低操作的复杂度,采用Cache Aside Pattern 下的一种缓存策略。不同点:
Write请求:
先写DataSource
直接删除Cache
当前缓存策略模式基于懒加载的思想,在Spring、Mybatis中都有这种思想。只有用到对应的key才进行缓存,高频次下key的修改,很好的避免的资源的浪费。SpringCache 操作方式,指定要删除的key~
分布式缓存设计,结合实际业务场景,降低业务复杂度,避免过度设计。良好的缓存设计不仅可以提高Cache的响应速度,还提升业务场景的复用和拓展。
多级缓存一致性问题
在版本更新迭代和体量增加的过程中, 采取本地缓存+Redis的形式避免缓存穿透。项目分布式集群部署,Write请求更新Redis缓存,Node节点上的本地缓存数据不一致的情况。那么该如何解决这种情况呢?欢迎大家讨论~