轻舟中间件最佳实践
《轻⾈中间件最佳实践》源⾃⽹易⼗年的数据库、缓存、消息等核⼼技术的研发、应⽤、运维沉淀,集结了众多领域专家的经验⼼得,历经了众多⼤规模、⾼性能的互联⽹实战考验。本实践⽴⾜实战,更加具有现实的指导意义,助⼒中间件发挥核⼼价值,加速企业数字化创新。
Redis 最佳实践
1. 数据分离,请勿将所有数据存放到 Redis 中说明:
建议根据业务只将⾼频热数据存储到 Redis 中,对于低频冷数据可以使⽤
MySQL/ElasticSearch 等基于磁盘的存储⽅式。不仅节省内存成本,⽽且数据量⼩在操作时速度更快、效率更⾼。
2. 业务数据隔离说明:
Redis 默认是提供了 32 个 database 供使⽤,以⾃然数来做区分,若不指定 database,都将默认使⽤ 0 这个库。
cluster 模式不⽀持多 database,可通过创建多集群实现隔离,防⽌互相影响。
3. key 的命名说明:
合适的 key 命名,便于查看、统计、排错。
4. 存储的 key 建议设置超时时间说明:
若应⽤将 Redis 定位为缓存 Cache 使⽤,对于存放的 key ⼀定要设置超时时间。否则,这些 key 将⻓期占⽤内存不释放,造成极⼤的资源浪费,并且随着时间的推移会导致内存占⽤越来越⼤,直到达到服务器内存上限。
key 的超时时间要根据业务综合评估,⽽不是越⻓越好。某些业务要求 key ⻓期有效,可以在每次写⼊时,都设置超时时间,让超时时间顺延。
5. 数据⼤⼩限制说明:
对于⼤⽂本(如超过 500 字节)写⼊到 Redis 时,建议压缩后存储。否则,除了带来极⼤的内存占⽤外,在访问量⾼时,很容易就会将⽹卡流量占满,进⽽造成整个服务器上的所有服务不可⽤,进⽽引发雪崩效应,造成系统瘫痪。
6. 线上 Redis 禁⽌使⽤ KEYS 正则匹配操作或者其他时间复杂度⾼的命令说明:
Redis 是单线程处理,在线上 key 数量较多时,操作效率极低(时间复杂度为 O(N) ),该命令执⾏后将严重阻塞线上其它命令的正常请求,⽽且在⾼ qps 情况下会直接造成 Redis 服务崩溃。
如果有类似需求,请使⽤ scan 命令代替。 还⽐如 LREM 命令,对于较⻓的 list,LREM 的时间复杂度 O(N),也会导致 Redis 服务崩溃。
7. 谨慎全量操作 Hash、Set 等集合结构说明:
在使⽤ HASH 结构存储对象属性时,开始只有有限的⼗⼏个 field,往往使⽤ HGETALL 获取所有成员,效率也很⾼。但是随着业务发展,会将 field 扩张到上百个甚⾄⼏百个,若仍使⽤ HGETALL 会出现效率急剧下降、⽹卡频繁打满等问题(时间复杂度O(N) )
此时建议根据业务拆分为多个Hash结构;或者如果⼤部分都是获取所有属性的操作,可以将所有属性序列化为⼀个String类型存储!同样在使⽤SMEMBERS操作SET结构类型时也是相同的情况。
8. 根据业务场景合理使⽤不同的数据结构类型说明:
⽬前 Redis ⽀持的数据库结构类型较多:字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等,需要根据业务场景选择合适的类型。常⻅的如:String可以⽤作普通的 K-V、计数类;Hash 可以⽤作对象等包含较多属性的信息;List可以⽤作消息队列、粉丝/关注列表等;Set可以⽤于推荐;Sorted Set可以⽤于排⾏等。
9. 对重要的数据使⽤ try/catch说明:
⼏乎所有的 Redis 客户端采⽤的都是“发送即忘”策略,因此经常需要关⼼关键数据是否真正写⼊ Redis。若需要确保关键性的数据可以被写⼊ Redis 中,强烈建议将其放⼊ try/except 块中。
10. 连接数限制
说明:
连接的频繁创建和销毁,将浪费⼤量的系统资源,且容易导致连接资源不⾜,极限情况导致宿主机宕机。请确保使⽤了正确的 Redis 客户端连接池配置。
11. 数据会丢失说明:
由于 Redis ⾼性能实现机制,基于异步复制的特性,特殊场景⽆法保证数据不丢失,请勿将 Redis 作为持久化存储。
12. 提前做好容量规划和评估
说明:
虽然 Redis cluster 能够⽀持⽔平扩容,但是数据迁移过程中可能导致业务抖动,建议业务做好半年增⻓预估。
13. 确保有⼀定的空闲内存
说明:
在⼀些运维操作或者全量同步时,⼤压⼒下 Redis 需要额外占⽤⼀⼤部分内存。当使⽤到 swap 时,Redis 的性能会急剧下降;不开启 swap 则会存在 OOM ⻛险。
14. 避免 CLUSTERDOWN 异常
说明:
建议设置 cluster-require-full-coverage no,避免 slot 出现缺失导致集群出现 CLUSTERDOWN,完全不可⽤。
15. 避免数据强制剔除
说明:
Redis 数据剔除算法不能完全确保正确性,可能会把设置了过期时间但还未过期的数据强制剔除,需要避免 Redis 内存使⽤达到配置的 maxmeory 上限。16. 避免使⽤短连接说明:短连接可能会增加 RT,并且会对服务端造成压⼒,尽量使⽤⻓连接⽅式接⼊。
因篇幅问题不能全部显示,请点此查看更多更全内容