前言
个人整理~主要是参考《redis深度历险》-钱文品 里面的各种章节~零散的提到了一点东西
里面提到好多有用的点~
感谢大佬的书
禁止事项:
- 严格禁止超大Key(Value值超过10KB)
- 禁止大量key设置同一时间失效,否则可能会同时过期,影响到redis线上服务卡顿(因为同时过期还会让redis 定时扫描策略,会循环多次扫描过期字典,直到过期的key变得稀疏,会导致线上读写操作出现明显的卡顿)
- 禁止戒指用del删除大对象,因为删除大对象,比如一个上千万的hash,那么就会造成卡顿,应该使用unlink,后台异步回收线程(建议手动删除元素)(集合类key value,集合规模超过5000都应该这样)
- 避免同一时间大量key过期,参考Redis监控的ExpireKeys指标(单集群ExpireKeys监控指标小于 30k/s )
- 所有的缓存类信息(源数据存储在DB)都必须有防止穿透逻辑
- 严禁异步刷新缓存(这样可能导致缓存更新失败之类的 很坑的问题)
- 涉及到定时初始化的数据要考虑初始化任务失败的可能性, 要有兜底方案
- 不允许使用Redis事务/Lua功能(分布式锁可以)
推荐:
- 1.每个key都推荐要有过期时间,而且要加上一个随机值
- 2.使用Redis组合命令, 避免使用单独的原生命令(比如将SET+PEXPIRE合并为SETEX)(因为组合命令是一次性执行完,可以有原子性 比如set nx)
- 3.超大的hash类型尽量使用hscan, 避免大数据量返回造成Redis拥塞, 同时需要控制hscan同时使用的数量(hscan会占用一个Redis连接)
- 例如hgetall、lrange、smembers、zrange、sinter等并非不能使用,但是需要明确N的值。有遍历的需求可以使用hscan、sscan、zscan代替。
- 4.Redis Key应该有统一的业务标识前缀, 避免共用Redis的情况下造成问题, 同时要求RedisKey字符控制在50个以内 (大key也是不可取的)
- 5.有类似For循环操作Redis的情况下使用批量操作, 如Mget/pipeline等操作(更建议使用pipeline) → 禁止在pipeline中使用RPC/IO操作, mget参数数量要求少于100个
-
使用pipeline 来做批量操作
注意两者不同:
原生是原子操作,pipeline是非原子操作。
pipeline可以打包不同的命令,原生做不到
pipeline需要客户端和服务端同时支持。
-
6.给key携带版本号, 加减字段之后升级版本号防止访问报错