2017-08-24 5 views
0

J'ai un HA redis avec un maître et deux esclaves. Et j'ai environ 10 millions de clés dans mes redis. Pour un flux donné, je supprime environ 1 million de clés avec une taille de lot de 1000 et simulatneoulsy dans d'autres touches de flux se mettent dans les redis. mais à chaque fois que j'effectue une opération de suppression, je rencontre java.net.SocketTimeoutException: Read a expiré. J'ai gardé le délai d'attente à 8 secondes. Y a-t-il un problème avec Redis Delete? J'utilise Jedis cleint 2.7.Exception du délai d'attente de lecture lors de la suppression de 1 million de clés

Stack Trace: "redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Lire timed out": {
« RedisInputStream.java:201":"redis.clients.util.RedisInputStream. ensureFill " "RedisInputStream.java:40":"redis.clients.util.RedisInputStream.readByte", "Protocol.java:141":"redis.clients.jedis.Protocol.process", " Protocol.java : 205 ":" redis.clients.jedis.Protocol.read ", " Connection.java:297":"redis.clients.jedis.Connection.readProtocolWithCheckingBroken ", " Connection.java:267":"redis.clients .jedis.Connection.getAll ", " Connection.java:259":"redis.clients.jedis.C Onnection.getAll ",

+0

Et plus loin stacktrace? – sazzad

Répondre

0

Parce que le serveur redis est un modèle à un seul thread pour la demande de processus. Donc, toute la commande entrante sera mise en file d'attente une par une. En ce qui concerne l'opération DEL, il ne suffit pas de retirer la clé de l'espace de touches, elle bloque également jusqu'à ce que toute la mémoire des touches soit libre. Cela ralentit donc votre serveur redis. vous pouvez essayer la commande UNLINK.

Cette commande est très similaire à DEL: elle supprime les clés spécifiées. Tout comme DEL, une clé est ignorée si elle n'existe pas. Cependant, la commande effectue la récupération de la mémoire dans un thread différent, donc elle ne bloque pas, alors que DEL est. C'est de là que vient le nom de la commande: la commande supprime simplement les clés de l'espace de clé. La suppression effective aura lieu plus tard de manière asynchrone.

EDITED. Peut-être devriez-vous essayer de supprimer progressivement et de mettre en incrémentation. Par exemple. Chaque minute, supprimez 100 touches ou 1000 touches. Si le type de votre clé est list ou set ou zset qui contient d'énormes données, vous pouvez les supprimer, les collecter d'abord, puis les supprimer lorsque redis n'est pas très occupé. Si votre flux de données put est également cette charge en vrac énorme de données en redis, en mettant de manière incrémentale

Pouvez-vous partager une partie de votre code?

+0

Merci pour la réponse rapide. Mais nous utilisons la version 3.0.7 de Redis. Y at-il un autre moyen sur 3.0.7 – user3134614

+0

pas très sûr que la réponse éditée pourrait vous aider. – GuangshengZuo