1.什么是Redis的大key?(BigKey)
redis存储数据的时候,当某个key的值比较大(包括字符串、列表等数据类型),key的数据越大,占用的内存和空间就越多。
BigKey(大key)
Bigkey指的是redis中一些key value值很大,这些key在序列化与反序列化过程中花费的时间很大!
操作bigkey的通常比较耗时,也就意味着阻塞Redis可能性越大!占用的流量同时也会变得很大!
大白话就是:bigkey实际指一个key对应的value很大,占用的空间很大!
string类型的数据: 长度大于10K,认为是大key
list列表类型的数据: 长度大于10240,认为是大key

2.制造两个不同数据类型的大key
批量写入1万个key,为了验证一下普通key和大key占用内存的情况,数据量小的时候,不好对比
for i in $(seq -w 10000);do redis-cli -a redispwd set name${i} test${i}; redis-cli -a redispwd get name${i}; done 2>/dev/null

字符串类型的大key: #制造一个字符串类型的大key

> set k1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

列表类型的大key:                             #制造一个列表类型的大key
> LPUSH name yyyyyyyy
> LPUSH name yyyyyyyy
> LPUSH name yyyyyyyy
> LPUSH name yyyyyyyy
> LPUSH name yyyyyyyy
> LPUSH name yyyyyyyy
> LPUSH name yyyyyyyy
....
列表左边添加元素,多添加一些

> keys *
1) "name"
2) "k1"
3) "namexxx"
......

127.0.0.1:6379> LLEN name
(integer) 15
127.0.0.1:6379> LRANGE name 0 -1
 1) "yyyyyyyy"
 2) "yyyyyyyy"
 3) "yyyyyyyy"
 4) "yyyyyyyy"
 5) "yyyyyyyy"
 6) "yyyyyyyy"
 7) "yyyyyyyy"
 8) "yyyyyyyy"
 9) "yyyyyyyy"
10) "yyyyyyyy"
11) "yyyyyyyy"
12) "yyyyyyyy"
13) "yyyyyyyy"
14) "yyyyyyyy"
15) "yyyyyyyy"

3.扫描和分析大key

方法1:
# redis-cli -a redispwd --bigkeys                                                                #扫描和分析redis的大key工具
....
[00.00%] Biggest string found so far '"name07194"' with 9 bytes
[14.78%] Biggest list   found so far '"name"' with 15 items
[83.13%] Biggest string found so far '"k1"' with 216 bytes
...
-------- summary -------
Sampled 10002 keys in the keyspace!
Total key length in bytes is 90006 (avg len 9.00)
Biggest   list found '"name"' has 15 items
Biggest string found '"k1"' has 216 bytes
方法2:使用rdb工具分析大key(是通过dump.rdb文件进行分析的)
rdb分析所有key大小,建议拷贝到闲置的服务器进行分析
# yum -y install python36                                                                         #需要依赖python环境
# pip3 install rdbtools==0.1.15 -i https://mirrors.aliyun.com/pypi/simple/       #安装rdb工具
# rdb -c memory dump.rdb >/tmp/test.csv                                                 #使用rdb工具分析大key并把结果输出到一个文件里,指定rdb文件

# cat /tmp/test.csv |head -5                                                                    #查看文件,主要关心的是key和大小
database,type,key,size_in_bytes,encoding,num_elements,len_largest_element,expiry
0,string,name05565,72,string,9,9,
0,string,name07617,72,string,9,9,
0,string,name07090,72,string,9,9,
0,string,name03368,72,string,9,9,

大小排序
cat /tmp/test.csv |sort -nrk 4 -t ',' |head -5         
0,list,name,289,quicklist,15,8,
0,string,k1,272,string,216,216,
0,string,name10000,72,string,9,9,
0,string,name09999,72,string,9,9,
0,string,name09998,72,string,9,9,

4.删除大key,观察性能分析,占用内存大的key已经消失

> DEL k1
用分析工具查看,该大key已经不显示

# redis-cli -a redispwd --bigkeys
...
[00.00%] Biggest string found so far '"name07052"' with 9 bytes
[28.76%] Biggest list   found so far '"name"' with 15 items
发现占用内存大的k1已经消失