此篇介绍一下Redis相关的开发规范。
存储
- 默认都使用redis db 0,一般无需select切换
- 禁止在redis中存储图片类型
性能
- 10w级别qps的性能系统
- 小数据集单个操作,耗时一般小于个位数ms
- 使用 SCAN 命令时应该批次使用,单次扫描key数量不应超过2万,间隔0.5s
- 时间复杂度为O(n)的命令需要注意N的数量
大Key问题避免
- key的长度建议64个字符以内。
- value的大小要控制在10KB以内。
- hash、list、set、zset的元素个数一般不要超过5000个,元素数量过多可考虑拆分成多个key进行处理。
在Redis中,一个字符串最大512MB,一个二级数据结构(例如hash、list、set、zset)可以存储大约40亿个(2^32-1)个元素。但实际上中如果符合下面两种情况,一般就认为它是bigkey:
(1)字符串类型:它的big体现在单个value值很大,一般认为超过10KB就是bigkey。
(2)非字符串类型:哈希、列表、集合、有序集合,它们的big体现在元素个数太多。
热点Key问题避免
- 拆分
批量处理
- 推荐使用批量操作提升操作效率
- 批量命令主要分为两类,原生命令和非原生命令:
原生命令包括:例如mget、mset、hmget、hmset、LPUSH key value集合等
非原生命令包括:Pipeline
- 批量数量建议不超过1000,要考虑数据大小,批量太多建议使用hscan、sscan、zscan遍历代替
数据过期
- 如果不需要长期存储,需要设定过期时间,固定时间+加一个随机数,防止集中过期
- 禁止在集合结构中只存不清,对于集合结构中数据增加频繁必须要有删除机制
禁止命令
- 禁止线上使用命令:KEYS、FLUSHDB、FLUSHALL、BGSAVE SAVE BGREWRITEAOF等
功能
- Redis的事务功能较弱,不建议过多使用
- monitor命令要控制使用时间,避免长时间使用
- Redis集群版本在使用Lua上有特殊要求:所有key都应该由 KEYS 数组来传递,所有key必须在1个slot上
安全
- 使用密码访问授权,保障安全性
线上环境
- Redis节点内存上限不能超过20G。
- 必须设置内存最大值,且必须可用内存不小于10%。