乐趣区

关于c++:喜马拉雅-Redis-与-Pika-缓存使用军规

作者:喜马拉雅 董道光

宣言:缓存不是万金油,更不是垃圾桶!!!

缓存作为喜马拉雅至关重要的根底组件之一,每天承载着微小的业务申请量。一旦缓存呈现故障,对业务的影响将十分重大。因而,确保缓存服务的稳固和高效运行始终是咱们的重要指标。

上面是咱们对喜马缓存历史故障复盘后总结的一套缓存应用标准,在此分享给大家,心愿小伙伴们能在缓存选型和应用的过程中少踩坑。

1. 缓存选型

1.1 缓存类型介绍

喜马线上缓存类型次要有 4 种:

1. redis 主从模式:官网原版

2.codis-redis:豌豆荚开源,redis 集群解决方案

3. 云数据库 redis:redis-cluster 容器化部署

4.xcache:基于 codis、pika、redis 自研的一套海量 KV 存储解决方案

1.2 缓存应用模式介绍

应用模式次要分为 2 种:

1.cache 模式:数据不须要长久化,实例复原不须要加载数据,扩缩容不须要迁徙数据

2.store 模式:数据须要长久化,实例复原须要加载数据,扩缩容须要迁徙数据

上面是对各种类型缓存做了简略比照:

 

2. 缓存应用军规

2.1 缓存类型应用标准

1)redis 集群模式首选云数据库 redis,海量 KV 存储首选 xcache

云数据库 redis 采纳官网 redis cluster 模式,容器化部署,反对故障主动复原和弹性伸缩,是以后 redis 集群的主推计划,但不反对数据长久化,如果必须要做数据长久化,并且对延时要求十分高,能够应用 codis redis。数据量十分大,并且对延时要求不是特地高,能够抉择 xcache。

2) redis 不要当 db 应用 ,如果数据肯定要做长久化,能够抉择 xcache

redis 当 db 应用,故障复原数据很慢,重大影响 SLA。并且如果主从全副挂掉,slave 机器无奈复原时,数据就会齐全失落。xcache 人造反对数据长久化

3) 不要应用客户端分片模式

客户端分片模式不具备高可用和弹性伸缩能力,倡议应用真正的集群模式,如 codis-redis、云数据库 redis、xcache

4)集群模式不反对 lua、redisson 客户端,如果业务必须应用,只能抉择 redis 主从模式

5)redis 单节点容量不要超过 10GB,xcache 单节点容量不要超过 200GB

redis 单节点容量太大时,实例重启会比较慢,影响复原时长

2.2 键值设计规范

1)key 尽量放弃简洁性、可读性、可管理性

在保障语义的前提下,管制 key 的长度;以业务名 (或数据库名) 为前缀 (避免 key 抵触),用冒号分隔,比方业务名:表名:id;不要蕴含特殊字符

2) 回绝 bigkey ,避免网卡流量过高、慢查问

string 类型管制在 10KB 以内,hash、list、set、zset 元素个数不要超过 5000

3)防止热点 key

热 key 会导致数据歪斜,以及单节点压力过大。倡议业务侧将热 key 打散

4)管制 key 生命周期

缓存不是垃圾桶,最好对 key 都设置 ttl,并且将 key 的 ttl 打散,防止 key 集中过期

2.3 命令应用标准

1)慎用全量操作命令

禁用 keys * 命令,尽量不应用 hgetall、smembers 等命令。在获取 key 下的多个元素时,应用相应的 scan 命令,一次获取大量元素,分屡次获取,倡议一次 scan 不要超过 200 个

2)管制 mset、mget、hmset、hmget、scan、range 等命令单次操作元素数量,倡议 不要超过 200

3)管制 pipeline 中命令的数量,倡议 不要超过 100

4)redis 删除 key 时,不要用 del 命令,应用 unlink 命令

del 一个大 key 会间接导致 redis 卡住。应用 unlink 命令能够异步删除 key,不会对 redis 主线程产生影响,因而也不会影响业务流量

5)set 和 expire 命令合并成 setex 命令,缩小服务端写压力

6)evalsha 代替 eval

redis-cluster 集群中应用 evalsha 代替 eval,缩小网络 IO,同时也减小 redis 网络 IO 压力进步性能

2.4 业务缓存架构标准

1) redis 不要应用逻辑 db ,只应用默认 db 0

能够通过实例隔离,不同业务的数据保留到不同的实例中。(只有 redis 主从能够抉择逻辑 db,集群模式默认都应用 db0)

2)防止多业务复用同一缓存资源

不同业务的数据应用不同的集群,S 级利用不要和 B 级利用混用,过多业务复用同一资源要做拆分。业务尽量提供 rpc 接口给其它业务调用,而不是间接让其它业务拜访数据源(如一个业务写,一个业务读)

3)xcache 尽量应用 string 类型

xcache 反对 string,hash,ehash,list,set,zset 六种数据类型,ehash 数据类型是对 hash 数据类型的扩大,反对对 field 设置过期工夫。xcache 中 string 类型是速度最快的,其余数据类型都是由 string 进行组合变换而实现,六种数据的性能如下:

string > hash > set > ehash > list > zset

倡议:尽量应用 string 类型

4)缩小 lua 脚本应用

集群模式对 lua 反对有限度,必须保障 lua 中操作的 key 被 sharding 到同一个节点。所以尽量减少对 lua 的应用

5)lua 脚本中不跑简单逻辑

简单逻辑放在业务代码中,而不是 lua 脚本中

6)采纳高效序列化办法和压缩办法

为了节俭内存,如果 value 较大时,能够应用压缩工具(如 snappy 或 gzip),把数据压缩后再写入 redis

7)防止批量工作、定时工作、周期工作流量太大影响在线业务

批量工作、定时工作、周期工作业务上要做限速

8)业务变更,存储流量模型变动要先评估

业务模型变动,QPS、容量减少,O (N) 命令增多等都要先评估以后缓存是否抗的住,做到灰度上线,继续察看(尤其是流量高峰期)

9)不必的资源尽早申请回收

休眠资源回收不仅能够升高业务的存储老本,还能够把资源分配给真正须要的业务,堪称是双赢

 

补充:OpenAtom 开源大赛 Pika 赛题放出,奖金 50 万,请扫描如下二维码进行 报名

大家也能够增加 Pika 助手,退出 Pika 微信群,理解更多动静音讯:

退出移动版