key设计建议:
- 可读性和可管理性管理(以业务名(或数据库名)为前缀,防止key冲突,用 冒号分割,如表名:id, tbl_person:1
- 简洁性,保证语意前提下,控制key的长度,key如果太长,太多,内存占用严重
- 不要包含特殊字符:空格,换行,单双引号。
redis key会使用 embstr编码进行压缩!!
object key 命令 可以查看对应串的编码
如果 value过大过长, 会转为 raw编码(低于 39个字节,使用 embstr), 这样会进行特定的内存优化,如果是 int的话,会优化为 int
用 embstr ,可以节省一定的内存开销
value设计原则:
- 拒绝bigkey
- 选择合适的数据结构
- 过期设计
强制规范:
- string类型控制在10KB以内
- hash,list,set,zset元素个数不要超过5000
- 反例:一个包含几百万个元素的list,hash等,一个巨大的json字符串
bigkey 的危害
- 网络阻塞
- redis阻塞
- 集群节点数据不均衡
- 频繁序列化:应用服务器CPU消耗
如何发现 bigKey
- 程序应用报异常日志
- redis-cli --bigkeys
- debug object 的方法
- 网络流量监控,客户端监控
redis 周期数据设置过期时间,object idle time 可以查找 key-value
过期时间不宜集中: 缓存穿透和雪崩等问题(具备例子,你应该 jedis.set(k, v, time+ randomTime() ) )
要加一个随机值,打散 过期时间(使得时间尽量的均匀),防止缓存雪崩