Skip to content

Redis之Bigkey

1. 环境准备

sh
# 生成100W条redis批量设置kv的语句(key=kn,value=vn)写入到/tmp目录下的redisTest.txt文件中
for((i=1;i<=100*10000;i++)); do echo "set k$i v$i" >> /d/redisTest.txt ;done;
cat /tmp/redisTest.txt | redis-cli -h 127.0.0.1 -p 6379 --pipe

2. 慎用keys *

如果直接在Redis服务器上面执行keys *命令:
Alt text 由于redis是单线程的,其所有操作都是原子的,而keys算法是遍历算法,复杂度是0(n),如果实例中有千万级以上的 key,这个指令就会导致Redis服务卡顿,所有读写Redis的其它的指令都会被延后甚至会超时报错,可能会引起缓存雪崩甚至数据库宕机。

2.1 禁用keys命令

通过配置redis.conf设置禁用这些命令:

ini
rename-command keys ""
rename-command flushdb ""
rename-command flushall ""

重启redis服务器后:

sh
127.0.0.1:6379> keys *
ERR unknown command 'keys', with args beginning with: '*'

2.2 使用scan命令

scan的语法如下:

sh
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
  • cursor:游标,如0为迭代的开始或结束,其他值为中间过程的某游标。
  • pattern:通配符,匹配key,例如"user*"即为以user开头的字符串,例如a*b即为另一种模式的字符串。
  • count:指定从数据集中返回的数据条数,默认是10。
  • type:是key的类型,如可以指定string、set、zset、hash等。