# Redis 规范
# 键名设计
【强制】禁止包含特殊字符,比如空格、换行、单双引号以及其他转移字符。
【强制】以业务名为前缀(前缀必须唯一),多个单词用驼峰格式,以冒号分割构造 key 名(比如业务名:表名:对应 ID)。
- 说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,不得使用纯数字。
- 正例:company:80443 (ID 为 80443 的公司信息)
- userInfo:5 (ID 为 5 的用户信息)
- rank:d201008 (2020-10-08 的排行榜信息)
【推荐】控制 key 的长度,过长占用内存且不易懂。
# 键值设计
【强制】拒绝大 key 操作,禁止使用超过 10k 的 string
【强制】根据业务场景合理使用不同数据结构类型,不要只局限于 string
- 字符串(String):用作普通的 K-V、计数类
- 哈希 (Hash) :用作对象等,包含较多属性的信息,如公司信息
- 列表 (List) :用作消息队列、粉丝/关注列表
- 集合 (Set) :用于推荐,如找人脉推荐机构
- 有序集合(Sorted Set):用于排行榜
【强制】存储一定要设置过期时间
- 说明:如果应用将 Redis 定位为缓存 Cache 使用,对于存放的 Key 一定要设置超时时间!因为若不设置,这些 Key 会一直占用内存不释放,造成极大的浪费,而且随着时间的推移会导致内存占用越来越大,直到达到服务器内存上限!另外 Key 的超时长短要根据业务综合评估,而不是越长越好!(某些业务要求 key 长期有效。可以在每次写入时,都设置超时时间,让超时时间顺延。)
# 命令使用
【强制】禁止使用 keys(匹配),flushall(删除所有 key)等危险操作,需要进行匹配或删除 key 时可以使用 scan 命令。
【强制】阅读 redis 相关文档,灵活使用 redis 相关命令。很多命令通过不同参数的配置可以实现多命令的组合结果
- 正例:设置一个过期时间为 5 分钟的 key
- set test 'hello word' ex 300
- 等同于
- set test 'hello word'
- expire test 300
# 缓存设计
【强制】冷热数据分离,不要将所有的数据全部放入 Redis 中
- 说明:根据业务只将高频数据存储至 Redis 中,如常用到的公司信息,排行榜信息,用户信息。对于低频冷数据可以使用 Mysql/ElasticSearch 中,不仅可以节省内存成本,而且数据小时操作速度会更快、效率更高
【强制】不同项目使用各自的 Redis 实例,各项目根据业务,是否可手动全部清除分 DB 进行存储
- 说明:Redis 默认是提供了 32 个 DataBase 来使用,推荐每个项目分业务,是否可手动删除分别使用 Database。
- 用户信息/公司信息:0
- 排行榜数据:1
【强制】缓存非特殊情况不做中间态
- 说明:Redis 大多数都是缓存,去掉业务逻辑后不应该发生改变,尽量不切入至业务中。(数据组待讨 论)
【强制】分模块 Reids 使用问题
- 说明:每个项目的 Redis 配置应当只允许使用该项目的实例。如抖老板项目只允许链接实例 A。选品项目只允许链接实例 B,如果项目中需要调用对方的缓存。应该是提供 api 接口进行访问。
【强制】合理设置 Redis 过期时间,一些热 key 若过期时间过短,容易造成缓存穿透,导致大量请求直接至 Mysql