Redis开发规范
大约 2 分钟数据库Redis
开发规范
以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id;保证语义的前提下,控制key的长度,当key较多时也会占用过多内存。
拒绝bigkey(防止网卡流量、慢查询),string类型控制在10KB以内,hash、list、set、zset元素个数不要超过5000。参考官网给出的资料,string类型的数据大小超过10KB后性能会有一个比较大的损耗。
非字符串的bigkey,不要使用del删除,使用hscan、sscan、zscan
方式渐进式删除,也可使用unlink
命令进行删除,使用del
删除可能会导致redis阻塞,同时要注意防止bigkey过期时间自动删除问题(例如一个200万的zset设置1小时过期,会触发del
操作,造成阻塞,而且该操作不会不出现在慢查询中(latency可查))。
- 建议使用expire设置过期时间(条件允许可以打散过期时间,防止集中过期),设置过期时间可以减小内存占用率,集中过期可能会导致缓存失败从而请求到数据库,造成缓存雪崩。不过期的数据重点关注空闲时间。
- 禁止线上使用keys、flushall、flushdb等,通过redis的rename机制禁掉命令,或者使用scan的方式渐进式处理
- 使用批量操作提高效率
- 原生命令:mget、mset
- 非原生命令:可以使用pipeline提高效率
- Redis事务功能较弱,不建议过多使用
- O(N)命令关注N的数量,例如hgetall、lrange、smembers、zrange、sinter等并非不能使用,但是需要明确N的值。有遍历的需求可以使用hscan、sscan、zscan代替。