Redis之BigKey的常见问题以及大厂相关面试题

一,相关面试题

1.在海量数据里查询某一固定的前缀的key(阿里)

2.在生产上你是如何限制key */flushdb/flushall等危险命令以防止误删误用?(小红书)

3.MEMORY USAGE 命令你使用过吗?(美团)

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

5.BigKey你是如何进行调优的?惰性释放lazyfree了解过吗?

6.在上生产上redis数据库中有100W条记录,你是如何遍历的?keys * 可以吗?

面试题的答案下面全都有欧!!!看完你就全明白了

二,MoreKey案例

2.1向redis中插入100W条测试数据

第一步:在Linux Bach下面插入100W条数据

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

第二步:通过pipe管道命令向redis中灌入这100W条数据

bash 复制代码
cat /tmp/redisTest.txt | /opt/redis-7.0.0/src/redis-cli -h 127.0.0.1 -p 6379 -a 密码 --pipe

2.2 keys * 访问100W条数据

由图可知访问100W条数据所用的时间为10.93s(不同的电脑可能会用所不同),访问时间达到10.93s,相比于内存的运转时间,差距还是非常大的,使用此命令可能会导致redis宕机。

那么生产中如何进行keys *,flushdb,flushall等危险命令的使用呢?

答:修改redis.conf的配置文件,可以在redis中通过SECURITY进行相关配置如图所示

修改后重启redis数据库效果如下

在上面我们提到当数据量过大的时候,不能用keys *命令来查询,那么我们改如何去进行查询呢?用什么命令?

答:SCAN命令来进行查询,此命令可以用来进行模糊查询,用来迭代数据库中的键。

用法讲解:SACN cursor [MATCH pattern] [COUNT count] 基于游标的迭代器,需要将上一一次迭代的游标作为下一次迭代的开始,直到游标返回0时代表一次迭代完成。一次返回的数量不可控,只能说是大约符合count值,支持模糊查询。

具体操作如下图

三,BigKey案例

3.1 BigKey多大才算大?

在阿里开发手册中明确提出,string类型的应该控制在10KB以内,hash,list,set,zset类型的元素个数不超过5000个。

*注意在一般情况下list最大存储元素一般为2的32次方-1个,但是没有人需要在value值中存储近40个值,并且这个值仅仅是理论值。set和zset类似。

3.2BigKey可能存在哪些危害?

内存分配不均匀,迁移困难;删除超时,大key做怪;网络流量阻塞;

3.3BigKey如何产生的呢?

一般情况下,不会有人去专门设置BigKey,BigKey一般存在社交类和汇总类中,比如某个明星的粉丝列表暴增,在一些年度财务报表统计当中,数据的累计增加。都会产生BigKey。

3.4 那么改如何发现BigKey呢?

发现BigKey常用的命令有两条:1.redis-cli -h 127.0.0.1 -p 6379 -a 111111 --bigkeys 2.MEMORY USAGE key。查看每个Key所占RAM的中字节数;第一种给出每种数据结构Top 1 bigkey,同时给出每种数据类型的键值个数+平均大小,但是想查询大于10kb的所有key,--bigkeys参数就无能为力了,需要用到memory usage来计算每个键值的字节数。

3.5 当BigKey产生的时候,我们改如何进行删除呢?

由阿里开发者手册可知,我们可以进行渐进式删除,那么什么叫渐进式删除呢?简单的来说就是一部分一部分删,比如custom:id 1000 name zhansan age 10 gender 男.........,这样的value我们可以先删除age 10 gender 男等相关字段,直到进行全部删除为止。

string:一般用del ,如果过于庞大用unlink

hash:每次获取少量的field-value,用hdel命令删除每个field:命令:HSCAN key cursor [MATCH pattern][COUNT count]

代码

list:渐进式命令ltrim进行删除,命令ltrim key_name strat stop ;代码

四.BigKey生产调优

在redis.conf中的 LAZY FREEIG中的配置进行相关说明。

相关推荐
虹科网络安全18 小时前
艾体宝产品 | 隆重推出 Haink:Redis 的应用型 AI 智能体
数据库·人工智能·redis
老朱佩琪!18 小时前
Unity备忘录模式
java·unity·备忘录模式
祁思妙想18 小时前
Python中ORM(对象关系映射)的概念与实操---连接数据库
数据库·oracle
高斯的手稿080119 小时前
Django里面,多个APP的url设置,每个APP单独对应HTML设置
数据库·django·html
是一个Bug19 小时前
Java主流框架面试题(一)
java·开发语言
镜花水月linyi19 小时前
MySQL与Redis缓存一致性方案
redis·后端·mysql
情爱少有真诚19 小时前
Java集合框架:数据存储与操作的利器
java·开发语言·经验分享·课程设计·ai编程
工业甲酰苯胺19 小时前
【面试题】数据库事务隔离与传播属性是什么?
java·数据库·oracle
我居然是兔子19 小时前
基于字符串的专项实验:解锁Java String类的隐藏细节
java·开发语言
jiayong2319 小时前
Java 反射完全指南 - 原理与实战
java·开发语言