Redis之基础规范
(1)、Key 定义规范
【必须】
key 禁止使用特殊字符:如空格、换行符、单双引号及其
他转义字符等。
【建议】
key 的命名需遵循小写原则,且不允许重复 key,否则
会产生覆盖情况,合理控制 key 的长度,避免使用过长的 key 或
者过简单的 key,减少内存消耗并增加易读性,一般 key 长度不建
议超过 30 字符。
【建议】
建议使用“项目名”+“分隔符”+“业务含义” 的英文
作为 key 的前缀,防止 key 冲突,“:” 或 “.” 作为间隔,字符包
含 A-Z,a-z,0-9,提高可读性和可维护性,如: dppt:kpyw:
(2)、Value 使用规范
【必须】
禁止使用 bigkey ,如:string 类型控制在 10KB 以内,
hash、list、set、zset 元素个数不要超过 5000(bigkey 的大小
和个数不是绝对值,与 key 的访问频次有关,尽量用简小的数据
结构)。
【建议】
避免使用超大 field 的复杂类型对象,超大类型的 field
需要进行切割。
【建议】
防止大 Key 过期时间自动删除问题。
【建议】
非字符串的 bigkey,尽量避免使用整体 del 删除,使用
hscan、sscan、zscan 方式渐进式删除,可 pipeline 加速,同时
要注意防止 bigkey 过期时间自动删除问题导致的性能损耗。
(3)、实例及资源使用规范
【建议】
单一职责原则:一个业务使用一个实例,避免多个业务共
用一个实例。
【建议】
设计合理的缓存命中率,缓存的命中率应该高达 80%以上,
至少不低于 60%,否则需检查是否有不合理的缓存使用。
(4)、缓存失效规范
【必须】
提前评估数据的生命周期,合理设置数据过期时间和失效
策略,如无特殊情况,所有 key 必须设置过期时间。
建议使用 expire 设置过期时间,控制 Key 的生命周期。例
如:
> set cx:cxdb:user:000110011 xiaoming
> expire cx:cxdb:user:000110011 3600 #设置 Key 一小时后过期
【建议】
批量建立的缓存需要打散过期时间,防止集中过期导致数
据不可恢复带来的影响; 一般我们采用 n * 3/4 + n * random() 。
所以,如果是 8 小时,就是 6 小时 + 0~2 小时的随机值。
(5)、命令使用规范
【必须】
禁止使用 keys、flushall、flushdb 等操作。
- KEYS:该命令需要对 Redis 的全局哈希表进行全表扫描,严
重阻塞 Redis 主线程;(应该使用 scan 来代替,分批返回
符合条件的键值对,避免主线程阻塞)。 - FLUSHALL:删除 Redis 实例上的所有数据,如果数据量很大,
会严重阻塞 Redis 主线程。 - FLUSHDB:删除当前数据库中的数据,如果数据量很大,同样
会阻塞 Redis 主线程。(加上 ASYNC 选项,让 FLUSHALL,
FLUSHDB 异步执行)
【建议】
使用批量操作,提高效率,控制一次性操作元素个数,建
议为 500。
说明:获取集合中的元素(HASH 类型的 hgetall、List 类型
的 lrange、Set 类型的 smembers、zrange 等命令)。如果全量
或大 量 操 作 会 对 整 个 底 层 数 据 结 构 进 行 全 量 扫 描 , 导 致 阻 塞Redis 主线程。
【建议】
合理使用 select。
redis 的多数据库较弱,使用数字进行区分,很多客户端支持
较差,同时多业务用多数据库实际还是单线程处理,会有干扰。
【建议】
Redis 事务功能较弱,不建议过多使用。
Redis 的事务功能较弱(不支持回滚),而且集群版本(自研和
官方)要求一次事务操作的 key 必须在一个 slot 上(可以使用
hashtag 功能解决)。
【建议】
Redis 集群版本在使用 Lua 上有特殊要求:
(1)所有 key 都应该由 KEYS 数组来传递,redis.call/pcall
里面调用的 redis 命令,key 的位置,必须是 KEYS array,否则直
接返回 error,“-ERR bad lua script for redis cluster, all
the keys that the script uses should be passed using the
KEYS array”。
(2)所有 key,必须在 1 个 slot 上,否则直接返回 error, “-
ERR eval/evalsha command keys must in same slot”。
【建议】必要情况下使用 monitor 命令时,要注意不要长时间使
用。
(六)其他
【建议】
尽量避免热点 key
当 key 是一个热点 key,在缓存失效的瞬间,假如有大量线程
来重建缓存,会造成后端负载加大,甚至可能会让应用崩溃的风
险。
【建议】
当存储小于 60GB,QPS 小于 10W 建议使用标准版,假如
需要更大的规格使用集群版。
一般情况下,TCE 标准架构的性能最大支持 10 万 QPS(Set 命
令并发),需要更高的 QPS 可选择多副本读写分离,或者选择
Redis 集群版,可支持千万级 QPS。
标准版支持 1GB - 60GB 规格,最大的网络吞吐量 64MB/s,假
如需要更大的规格的容量请选择集群版,集群版最大可支持 4TB 的
容量,6144MB/s。