1.广告平台,海量数据查询固定前缀的key
不要使用keys , 使用 scan 命令
scan 0 match "user:" 10
2.Memory usage命令用过吗
memory usage key [semples count] :计算每个键值对的字节数
3.bigKey 问题,多大算bigKey,如何发现?如何处理?如何删除
string 类型控制在10k以内,hash,list,set,zset元素个数不要超过5k,
反例:一个包含200w个元素的list
非字符串的bigkey,不要使用del删除,使用hscan,sscan,zscan的方式渐进式删除,同时防止bigkey过期自动删除问题,例如一个200w元素的list设置一个小时过期,会触发del操作。会造成阻塞。
del命令是一种同步命令,即它会阻塞客户端,
与del命令不同的是,unlink命令会异步地删除指定的键以及与之相关联的值。即,它会将要删除的键添加到一个待删除的列表中,并立即返回,不会阻塞客户端。Redis服务器会在后台异步地删除待删除列表中的键。
综上:
String :值最大是512M,但超过10kb就是bigkey
list,hash,set和zset:最大个数是40多亿个,但是个数超过5000就是 bigkey
那些危害?
网络阻塞,过期阻塞删除耗时长。
如何产生的?
热销品的收藏量,明星的粉丝逐步增长。
如何排查?
redis-cli --bigkeys
redis-cli --bigkeys -i 0.1
给出每种数据类型 TOP 1的bigkey,同时给出键值个数及平均值。
每隔100条scan命令就会休眠0.1s,ops就不会剧烈抬升,但是扫描时间会变长
如果想查询大于10kb的所有key, --bigkey参数就无能为力了,需要使用 memory usage来计算每个键值的字节数。
如何删除bigkey?
渐进式删除,
string : del 命令 或者 unlink
hash: 使用 hscan每次获取少量的 key-value,再使用hdel删除每个flied.
4.bigKey 如何调优,惰性释放 lazy-free了解吗
reids 默认的过期删除del,阻塞的,如果是一个bigkey,可能需要几秒钟
而 unlink, flushDB async 等是异步非阻塞的
需要在redis.conf 的 lazy-free 向中配置
lazyfree-lazy-server-del no 改为yes
lazyfree-lazy-flush no 改为 yes
lazyfree-lazy-user-del 改为 yes
5.moreKey 问题,生产上有1000w记录,如何遍历?keys* 可以吗
小数据量可以使用key*,为了良好的习惯,建议还是别用。
keys * 也是原子命令,数据大会导致redis长时间锁住及CPU飙升,生产杜绝使用。
比如 100w的数据,一般机器需等待2-3s, 1000w的数据 长则20-30s.
在这么长 时间内,所有其他读写命令都会延后甚至报错,随着命令的积压,可能会造成缓存雪崩,甚至数据库宕机。
那我们如何变流key 呢
使用scan命令!类似mysql的limit
sscan 针对于string, 迭代 集合键中的元素
hscan 针对于 hash,迭代哈希键中的键值对
zscan 针对于 zset,迭代有序集合中的元素(包括元素成员和元素分值)
SCAN cursor [MATCH pattern] [COUNT count]
cursor - 游标。
pattern - 匹配的模式。
count - 指定从数据集里返回多少元素,默认值为 10
游标从0开始,执行命令后返回下一次游标,知道下一次游标为0.则查询结束。
6.如何生产上限制 keys */flushdb/flushall 等危险命令以防止误删勿用
通过配置禁用这些命令,redis.conf的1066行下的
rename-command这一项中进行配置
rename-command keys “”
rename-command flushdb “”
rename-command flushall “”
或则配置一个极难拼写的字符串 比如
rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52