一个命令损失数百万,这,需要赔偿吗?
代码不规范,同事两行泪,撸码需谨慎!
处于好奇考虑,我来测试一下,这到底是什么问题?
二、测试一下1000万数据的性能1、编写脚本文件写入1000万数据。
for((i=1;i<=10000000;i++)); do echo "set k$i 哪吒编程$i" >> /tmp/test1.txt;done;
通过/tmp/test1.txt查看一下是否写入成功。
2、写入redis1000万数据cat /tmp/test1.txt | redis-cli -a 111111 --pipe
3、通过keys * 查看1000万数据
4、通过配置文件禁止keys *的使用在redis.conf文件中配置security:
rename- command keys "" rename- command flushdb "" rename- command flushall ""
三、使用scan替代keys *redis scan 命令用于迭代数据库中的数据库键。
scan 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 scan 命令的游标参数, 以此来延续之前的迭代过程。
scan 返回一个包含两个元素的数组, 第一个元素是用于进行下一次迭代的新游标, 而第二个元素则是一个数组, 这个数组中包含了所有被迭代的元素。如果新游标返回 0 表示迭代已结束。
scan语法:
scan cursor [match pattern] [count count]
四、拒绝bigkey1、阿里云redis开发规范阿里云redis开发规范中明确规定“拒绝bigkey(防止网卡流量、慢查询)”。
string类型控制在10kb以内,hash、list、set、zset元素个数不要超过5000。
2、出现bigkey时如何删除?string类型的用del删除。
其它类型使用hscan、sscan、zscan方式渐进式删除,同时要避免bigkey过期时间自动删除问题,因为它会造成主线程阻塞。
hash 删除: hscan+hdel
public void delbighash(string host, int port, string password, string bighashkey) { jedis jedis = new jedis(host, port); if (password != null && !"".equals(password)) { jedis.auth(password); } scanparams scanparams = new scanparams().count(100); string cursor = "0"; do { scanresult<entry<string, string>> scanresult = jedis.hscan(bighashkey, cursor, scanparams); list<entry<string, string>> entrylist = scanresult.getresult(); if (entrylist != null && !entrylist.isempty()) { for (entry<string, string> entry : entrylist) { jedis.hdel(bighashkey, entry.getkey()); } } cursor = scanresult.getstringcursor(); } while (!"0".equals(cursor)); //删除 bigkey jedis.del(bighashkey);}
3、bigkey会造成哪些问题?内存不均,集群迁移困难;
超时删除,阻塞线程;
网络流量阻塞;
4、如何发现bigkey?(1)通过redis-cli --bigkeys查找。
(2)计算每个键值的字节数,通过memory usage key查找
以上就是redis bigkeys命令会阻塞问题如何解决的详细内容。
