Maison >base de données >Redis >Comment résoudre le problème que la commande Redis bigkeys bloquera
Une commande a entraîné des millions de pertes.
Le code n'est pas standardisé et mes collègues ont fondu en larmes. Soyez prudent lors du codage !
Par curiosité, laissez-moi le tester. Quel est le problème ?
pour écrire 10 millions de données.
for((i=1;i<=10000000;i++)); do echo "set k$i 哪吒编程$i" >> /tmp/test1.txt;done;
Vérifiez si l'écriture a réussi via /tmp/test1.txt
. /tmp/test1.txt
查看一下是否写入成功。
cat /tmp/test1.txt | redis-cli -a 111111 --pipe
在redis.conf文件中配置security:
rename- command keys "" rename- command flushdb "" rename- command flushall ""
Redis Scan 命令用于迭代数据库中的数据库键。
SCAN 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。
SCAN 返回一个包含两个元素的数组, 第一个元素是用于进行下一次迭代的新游标, 而第二个元素则是一个数组, 这个数组中包含了所有被迭代的元素。如果新游标返回 0 表示迭代已结束。
scan语法:
SCAN cursor [MATCH pattern] [COUNT count]
阿里云Redis开发规范中明确规定“拒绝bigkey(防止网卡流量、慢查询)”
。
String类型控制在10KB以内,hash、list、set、zset元素个数不要超过5000。
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); }
内存不均,集群迁移困难;
超时删除,阻塞线程;
网络流量阻塞;
(1)通过redis-cli --bigkeys
2. Écrivez 10 millions de données dans Redis
3. Afficher 10 millions de données via des clés *
"Rejeter bigkey (pour éviter le trafic de la carte réseau et les requêtes lentes)"
. 🎜🎜Le type de chaîne est contrôlé dans la limite de 10 Ko et le nombre d'éléments de hachage, de liste, de set et de zset ne doit pas dépasser 5 000. 🎜🎜2. Comment supprimer la bigkey lorsqu'elle apparaît ? 🎜redis-cli --bigkeys
. 🎜🎜🎜🎜🎜(2) Calculez le nombre d'octets de chaque valeur de clé et trouvez-la via la clé d'utilisation de la mémoire🎜🎜🎜🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!