记一种不错的缓存设计思路

简介: 存储的归存储,逻辑的归逻辑

之前与同事讨论接口性能问题时听他介绍了一种缓存设计思路,觉得不错,做个记录供以后参考。

场景

假设有个以下格式的接口:

GET /api?keys={key1,key2,key3,...}&types={1,2,3,...}

其中 keys 是业务主键列表,types 是想要取到的信息的类型。

请求该接口需要返回业务主键列表对应的业务对象列表,对象里需要包含指定类型的信息。

业务主键可能的取值较多,千万量级,type 取值范围为 1-10,可以任意组合,每种 type 对应到数据库是 1-N 张表,示意:

图片

现在设想这个接口遇到了性能瓶颈,打算添加 Redis 缓存来改善响应速度,应该如何设计?

设计思路

方案一:

最简单粗暴的方法是直接使用请求的所有参数作为缓存 key,请求的返回内容为 value。

方案二:

如果稍做一下思考,可能就会想到文首我提到的觉得不错的思路了:

  1. 使用 业务主键:表名 作为缓存 key,表名里对应的该业务主键的记录作为 value;

  2. 查询时,先根据查询参数 keys,以及 types 对应的表,得到所有 key1:tb_1_1key1:tb_1_2 这样的组合,使用 Redis 的 mget 命令,批量取到所有缓存中存在的信息,剩下没有命中的,批量到数据库里查询到结果,并放入缓存;

  3. 在某个表的数据有更新时,只需刷新 涉及业务主键:该表名 的缓存,或令其失效即可。

小结

在以上两种方案之间做评估和选择,考虑几个方面:

  • 缓存命中率;

  • 缓存数量、占用空间大小;

  • 刷新缓存是否方便;

稍作思考和计算,就会发现此场景下方案二的优势。

另外,就是需要根据实际业务场景,如业务对象复杂度、读写次数比等,来评估合适的缓存数据的粒度和层次,是对应到某一级组合后的业务对象(缓存值对应存储 + 部分逻辑),还是最基本的数据库表/字段(存储的归存储,逻辑的归逻辑)。

目录
相关文章
|
6月前
|
缓存 Java 应用服务中间件
面试官:如何实现多级缓存?
面试官:如何实现多级缓存?
240 1
|
6月前
|
存储 缓存 NoSQL
Redis缓存设计典型问题
缓存穿透 缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中, 通常出于容错的考虑, 如果从存储层查不到数据则不写入缓存层。缓存穿透将导致不存在的数据每次请求都要到存储层去查询, 失去了缓存保护后端存储的意义。
|
存储 缓存 JSON
实战干货 | 分布式多级缓存设计方案
分布式多级缓存设计方案,解决海量数据读取的性能问题,包含多级缓存的存储设计,流程设计;利用多数据副本保证数据的可用性,同时通过不同数据源特点提供更高性能、更多场景数据差异化的支持
1369 0
实战干货 | 分布式多级缓存设计方案
|
27天前
|
存储 缓存 运维
缓存技术有哪些优缺点呢
【10月更文挑战第19天】缓存技术有哪些优缺点呢
|
6月前
|
缓存 监控 前端开发
软件体系结构 - 缓存技术(8)缓存雪崩
【4月更文挑战第20天】软件体系结构 - 缓存技术(8)缓存雪崩
116 17
|
6月前
|
存储 缓存 NoSQL
Redis缓存设计与性能优化(一)
Redis缓存设计与性能优化(一)
|
11月前
|
缓存 NoSQL 关系型数据库
缓存的设计方式
缓存的设计方式
|
存储 缓存 监控
10 分钟搞懂缓存设计策略
10 分钟搞懂缓存设计策略
826 0
|
消息中间件 canal 缓存
缓存数据一致性探究
缓存是一种较低成本提升系统性能的方式,自它面世第一天起就备受广大开发者的喜爱。然而正如《人月神话》中的那句经典的“没有银弹”中所说,软件工程的设计没有银弹。 就像每一次发布上线修复问题的同时,也极易引入新的问题,自缓存诞生的第一天起,缓存与数据库的数据一致性问题就深深困扰着开发者们。 关键词:原子性、事务性、数据一致性、双写一致性
6544 1
缓存数据一致性探究
|
存储 缓存 NoSQL
如何设计一个本地缓存
如何设计一个本地缓存