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

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

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

场景

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

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

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

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

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

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

设计思路

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

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

  • 使用 业务主键:表名 作为缓存 key,表名里对应的该业务主键的记录作为 value;
  • 查询时,先根据查询参数 keys,以及 types 对应的表,得到所有 key1:tb_1_1、key1:tb_1_2 这样的组合,使用 Redis 的 mget 命令,批量取到所有缓存中存在的信息,剩下没有命中的,批量到数据库里查询到结果,并放入缓存;
  • 在某个表的数据有更新时,只需刷新 涉及业务主键:该表名 的缓存,或令其失效即可。

小结

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

  • 缓存命中率;
  • 缓存数量、占用空间大小;
  • 刷新缓存是否方便;

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

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

责任编辑:赵宁宁 来源: 闷骚的程序员
相关推荐

2022-06-23 07:05:46

跳板机服务器PAM

2018-04-18 07:34:58

2016-10-26 09:12:58

2014-03-17 10:30:12

网络服务器

2024-05-09 08:20:29

AC架构数据库冗余存储

2020-11-27 14:45:57

开发服务器代码

2022-08-17 09:07:09

低代码LCDP编码

2018-12-29 10:37:05

HTTP缓存URL

2017-07-05 14:09:04

系统设计与架构java云计算

2024-04-26 08:58:54

if-else代码JavaSpring

2016-10-13 10:57:55

phptcp专栏

2019-11-22 09:21:17

技术研发数据

2024-04-30 08:12:05

CRUD方法JavaAC架构

2017-08-24 15:02:01

前端增量式更新

2021-05-18 06:22:39

CSS 制作波浪技巧

2020-05-12 10:00:14

缓存算法赠源码

2010-08-23 14:25:13

marginCSS

2020-05-06 11:29:29

UX设计钓鱼攻击用户体验

2013-09-04 12:38:56

架构设计架构设计构思

2020-12-23 10:10:23

Pythonweb代码
点赞
收藏

51CTO技术栈公众号