Redis_BigKey

面试题

阿里广告平台,海量数据里查询某一固定前缀的key

小红书,你如何生厂上限值key */flushdb/flushall等危险命令以防止误删误用?

美团,MEMORY USAGE 命令你用过吗?

BigKey问题,多大算big?你如何发现?如何删除?如何处理?

BigKey你做过调优吗?惰性释放lazyfree了解过吗?

Morekey问题,生产上redis数据库有1000w记录,你如何遍历? key * 可以吗?

1.Morekey案例

大批量往redis里面插入2000w测试数据key

1.Linux Bash下面执行,插入100w

生成100W条redis批量设置kv的语句(key=kn,value=vn)写入到/tmp目录下的redisTest.txt文件

for((i=1;i<=100*10000;i++)); do echo "set k$i v$i" >> /tmp/redisTest.txt ;done;

[root@localhost ~]# for((i=1;i<100*10000;i++));do echo "set k$i v$i" >>/tmp/redisTest.txt;done;
[root@localhost ~]# 

Redis_BigKey_第1张图片

通过redis提供的管道--pipe命令插入100W大批量数据

[root@localhost myredis]# cat /tmp/redisTest.txt | redis-cli --pipe
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 999999
[root@localhost myredis]# redis-cli
127.0.0.1:6379> dbsize
(integer) 999999
127.0.0.1:6379> 

某快递巨头真实生产案例新闻

Redis_BigKey_第2张图片

 key * 你试试100W花费多少秒遍历查询

Redis_BigKey_第3张图片

999991) "k935351"
999992) "k379644"
999993) "k906086"
999994) "k954027"
999995) "k538124"
999996) "k207347"
999997) "k543262"
999998) "k530837"
999999) "k229700"
(2.53s)
127.0.0.1:6379> 

Q:生产上怎么限制key */flushdb/flushall等危险命令以防止误删误用?

A:通过配置设置禁用这些命令,redis.conf在SECURITY这一项中

Redis_BigKey_第4张图片

 不用key * 避免卡顿,那该用什么

scan命令登场----一句话,类似mysql limit但不完全相同

Scan命令用于迭代数据库中的数据库健


2. BigKey案例

2.1 多大算Big?

参考《阿里云Redis开发规范》

Redis_BigKey_第5张图片

string和二级结构

1、string是value,最大512MB,但是大于等于10KB就是bigkey

2、list、hash、set、和zset,个数超过500就是bigkey

Redis_BigKey_第6张图片


2.2 哪些危害

内存不均,集群迁移困难

超时删除,大key删除作梗

网络流量阻塞

2.3 如何产生

社交类: XXX粉丝列表,典型案例粉丝逐步增加

汇总统计: 某个报表,月日年经年累月的积累

你可能感兴趣的:(redis,数据库,缓存)