此篇介绍一下Redis相关的开发规范。

存储

  1. 默认都使用redis db 0,一般无需select切换
  2. 禁止在redis中存储图片类型

性能

  1. 10w级别qps的性能系统
  2. 小数据集单个操作,耗时一般小于个位数ms
  3. 使用 SCAN 命令时应该批次使用,单次扫描key数量不应超过2万,间隔0.5s
  4. 时间复杂度为O(n)的命令需要注意N的数量

大Key问题避免

  1. key的长度建议64个字符以内。
  2. value的大小要控制在10KB以内。
  3. 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问题避免

  1. 拆分

批量处理

  1. 推荐使用批量操作提升操作效率
  2. 批量命令主要分为两类,原生命令和非原生命令:

原生命令包括:例如mget、mset、hmget、hmset、LPUSH key value集合等
非原生命令包括:Pipeline

  1. 批量数量建议不超过1000,要考虑数据大小,批量太多建议使用hscan、sscan、zscan遍历代替

数据过期

  1. 如果不需要长期存储,需要设定过期时间,固定时间+加一个随机数,防止集中过期
  2. 禁止在集合结构中只存不清,对于集合结构中数据增加频繁必须要有删除机制

禁止命令

  1. 禁止线上使用命令:KEYS、FLUSHDB、FLUSHALL、BGSAVE SAVE BGREWRITEAOF等

功能

  1. Redis的事务功能较弱,不建议过多使用
  2. monitor命令要控制使用时间,避免长时间使用
  3. Redis集群版本在使用Lua上有特殊要求:所有key都应该由 KEYS 数组来传递,所有key必须在1个slot上

安全

  1. 使用密码访问授权,保障安全性

线上环境

  1. Redis节点内存上限不能超过20G。
  2. 必须设置内存最大值,且必须可用内存不小于10%。