# redis最佳实践

# 一、键值设计

# key名设计

# (1)可读性和可管理性 【建议】

服务名为前缀(防止key冲突),逻辑含义段必须使用英文半角冒号:分割,举例几个比较常用的场景。

获取userId是286用户的用户信息。user:id:286

获取userId是286用户的用户校友卡等级信息。user:id:286:vip

感觉跟restful差不多

# (2)简洁性 【建议】

不要使用过长的 Key。例如使用一个 1024 字节的 key 就不是一个好主意,不仅会消耗更多的内存,还会导致查找的效率降低。

# (3)不要包含特殊字符 【强制】

反例:包含空格、换行、单双引号以及其他转义字符

# value设计

# (1)拒绝bigkey,防止网卡流量、慢查询 【强制】

string类型控制在10KB以内,尤其是热点key,严格控制在10KB以内。

hash、list、set、zset元素个数不要超过5000。

# (2)选择适合的数据类型。【强制】

## 反例
set user:id:286:wxname  我爱世界
set user:id:286:studentid  1612290080
set user:id:286:age  21
## 正例
hmset 'user:id:286' wxname 我爱世界 studentid 1612290080 age 21 # 可以采用hash方式存储
1
2
3
4
5
6
## 反例
set user:id:286  {"wxname":"我爱世界","studentid":1612290080,"age":21} # 序列化JSON
# 取用户Id为286人的学号和昵称 in Nodejs
data = get user:id:286  
data = JSON.parse(data);
R.pick(['studentid', 'wxname'], data)
## 正例
hmset user:id:286 wxname 我爱世界 studentid 1612290080 age 21
# 取用户Id为286人的学号和昵称
hmget user:id:286 studentid wxname # 按需获取
1
2
3
4
5
6
7
8
9
10

# 二、业务规范

# 所有的key设置过期时间【强制】

redis数据有丢失风险,目前在我们公司redis定位为缓存,杜绝用于持久化储存,一切key都需要设置过期时间。

# 不同的业务数据要分开存储【强制】

redis默认是提供了多个db来使用,以自然数来做区分,如果不选择db,都会默认使用0这个库。

# 三、命令使用

# 合理利用批量操作提高性能 【推荐】

示例1,获取用户286,287两人的用户信息。

原生命令

## 反例
get user:id:286
get user:id:287

## 正例
mget user:id:286 user:id:287
1
2
3
4
5
6

示例2,获取用户286,删除用户287。

非原生命令:利用redis管道pipeline (opens new window),达到一次发送多个命令。

// in Nodejs
redis.pipeline().get('user:id:286').del('user:id:287').exec()
1
2

温馨提示:redis pipeline是批量执行命令,不具备原子性、事务性和一致性。

# redis事务功能较弱,不建议过多使用【建议】

redis的事务功能较弱(不支持回滚),而且集群版本(自研和官方)要求一次事务操作的key必须在一个slot上(可以使用hashtag功能解决)

# 线上禁用命令部分命令【强制】

禁止线上使用keysflushallflushdb其中keys可以用scan代替

# 去重统计之 redis HyperLogLog 【学习、了解】

HyperLogLog means 超级日志

redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。 中文文档 (opens new window) 如需统计类需求,强烈推荐HyperLogLog,比如需要统计每天多少个ip访问过官网。

> PFADD phoenix:pv:t:20191210 192.168.2.161  # 新增一个IP
> 1 # 新增成功
> PFADD phoenix:pv:t:20191210 xxx xxx xxx
> 1 # 新增成功
> PFCOUNT phoenix:pv:t:20191210 # 统计X存入多少IP
> 2 # 2个数据
> PFADD phoenix:pv:t:20191210 192.168.2.161 # 新增一个IP
> 0 # 当前key已经有这个IP,返回0
> PFCOUNT phoenix:pv:t:20191210
> 2 # 还是2条,不会出现重复的统计
1
2
3
4
5
6
7
8
9
10

# 四、参考文档

阿里云Redis开发规范 (opens new window)

掘金技术小册-Redis 深度历险 (opens new window)

最近更新: 9/22/2022, 5:59:36 AM