Cet article vous présentera un résumé des exceptions courantes des clients Redis (article Jedis). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.
[Introduction] Jedis est l'implémentation client de la version java de Redis. Lors de l'utilisation du client Redis, que le client soit mal utilisé ou qu'il y ait un problème avec le serveur Redis, le client répondra à certaines exceptions. Cet article analyse les exceptions courantes lors de l'utilisation de Jedis. [Recommandations associées : Tutoriel vidéo Redis]
1 Impossible d'obtenir une connexion à partir du pool de connexion
Le nombre d'objets Jedis dans JedisPool. est limité, la valeur par défaut est 8. On suppose ici que la configuration par défaut est utilisée. Si 8 objets Jedis sont occupés et ne sont pas renvoyés, si l'appelant souhaite emprunter des Jedis à JedisPool, il devra attendre (par exemple, maxWaitMillis>0 est défini si c'est le cas). toujours dans le délai maxWaitMillis, si l'objet Jedis ne peut pas être obtenu, l'exception suivante sera levée.
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool … Caused by: java.util.NoSuchElementException: Timeout waiting for idle object at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:449)
Il existe une autre situation, c'est-à-dire que si blockWhenExhausted=false est défini, alors lorsque l'appelant constate qu'il n'y a pas de ressources dans le pool, une exception sera levée immédiatement sans attendre. effet de blockWhenExhausted=false.
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool … Caused by: java.util.NoSuchElementException: Pool exhausted at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:464)
Pour ce problème, ce qui doit être discuté est la raison pour laquelle le pool de connexions n'a pas de ressources. Il existe de nombreuses raisons possibles pour le manque de ressources
Client : Le pool de connexions a été. mis en place sous une concurrence élevée Petit, l'offre dépasse la demande, donc l'erreur ci-dessus se produira, mais dans des circonstances normales, elle n'a besoin que d'être supérieure au nombre maximum de connexions par défaut (8), car dans des circonstances normales, l'efficacité de traitement de JedisPool et Jedis est suffisamment élevé.
2. Client : Le pool de connexions n'est pas utilisé correctement, par exemple, il n'est pas libéré, comme indiqué dans le code suivant : Définissez JedisPool et utilisez la configuration du pool de connexions par défaut.
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig(); JedisPool jedisPool = new JedisPool(poolConfig, "127.0.0.1", 6379); //向JedisPool借用8次连接,但是没有执行归还操作。 for (int i = 0; i < 8; i++) { Jedis jedis = null; try { jedis = jedisPool.getResource(); jedis.ping(); } catch (Exception e) { e.printStackTrace(); } }
Lorsque l'appelant emprunte des Jedis au pool de connexions (comme suit), une exception sera levée :
jedisPool.getResource().ping();
3. , les objets Jedis détenus par ces requêtes lentes seront renvoyés lentement, ce qui remplira le pool.
4. Serveur : le client est normal, mais le serveur Redis bloque le processus d'exécution de la commande client pour certaines raisons, ce qui amènera également le client à lever cette exception. On peut voir qu'il y a de nombreuses raisons à cette exception. Ne vous laissez pas tromper par l'apparence de l'exception. Il n'existe pas de clé principale qui puisse résoudre tous les problèmes. Le développement, l'exploitation et la maintenance ne peuvent que renforcer continuellement leur compréhension de Redis et. trouvez progressivement le problème en suivant les indices.
2. Délai d'expiration de lecture et d'écriture du client
Lorsque Jedis appelle Redis, si un délai d'attente de lecture et d'écriture se produit, l'exception suivante apparaîtra :
redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out
Les raisons de cette exception sont également les suivantes :
Le délai d'attente de lecture et d'écriture est trop court.
La commande elle-même est relativement lente.
Le réseau entre le client et le serveur est anormal.
Redis lui-même est bloqué.
3. Délai d'expiration de la connexion client
Lorsque Jedis appelle Redis, si un délai d'attente de lecture et d'écriture se produit, l'exception suivante apparaîtra :
redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out
Le les raisons de cette exception sont également les suivantes :
Le délai d'expiration de la connexion est trop court.
Redis est bloqué, ce qui entraîne la saturation du journal TCP et l'échec des nouvelles connexions.
Le réseau entre le client et le serveur est anormal.
4. Exception du tampon client
Lorsque Jedis appelle Redis, si une exception de flux de données client se produit, l'exception suivante se produira.
redis.clients.jedis.exceptions.JedisConnectionException: Unexpected end of stream.
Les raisons de cette exception peuvent être les suivantes :
1. Le tampon de sortie est plein. Par exemple, définissez le tampon de sortie d'un client normal sur 1M 1M 60 :
config set client-output-buffer-limit "normal 1048576 1048576 60 slave 268435456 67108864 60 pubsub 33554432 8388608 60"
Si vous utilisez la commande get pour obtenir une grande clé (telle que 3M), cette exception se produira.
2. La connexion inactive à long terme est activement déconnectée par le serveur. Vous pouvez vérifier les paramètres de configuration du délai d'attente et si la configuration du pool de connexions nécessite une détection d'inactivité.
3. Lecture et écriture simultanées anormales : l'objet Jedis est exploité simultanément par plusieurs threads en même temps, et l'exception ci-dessus peut se produire.
5. Le script Lua est en cours d'exécution
Si Redis exécute actuellement le script Lua et dépasse la limite de temps Lua, lorsque Jedis appelle Redis, il recevra à l'exception ci-dessous. Comment gérer ce genre de problème (la configuration Lua lua-time-limit a été introduite dans le chapitre précédent)
redis.clients.jedis.exceptions.JedisDataException: BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.
6 Redis charge le fichier de persistance
<🎜. >Jedis appelle Redis À ce stade, si Redis charge le fichier persistant, vous recevrez l'exception suivante.redis.clients.jedis.exceptions.JedisDataException: LOADING Redis is loading the dataset in memory
7. La mémoire utilisée par Redis dépasse la configuration maxmemory
Lorsque Jedis appelle Redis pour effectuer des opérations d'écriture, si la mémoire utilisée par Redis est supérieure à la mémoire maximale paramètre, vous recevrez l'exception suivante, vous devez ajuster maxmemory à ce moment et trouver la cause de la croissance de la mémoire (maxmemory a été introduit dans le chapitre précédent)redis.clients.jedis.exceptions.JedisDataException: OOM command not allowed when used memory > 'maxmemory'.
8. est trop grand
Si le nombre de connexions client dépasse maxclients, l'exception suivante se produira dans la connexion nouvellement appliquée :redis.clients.jedis.exceptions.JedisDataException: ERR max number of clients reached
127.0.0.1:6379> get hello (error) ERR max number of clients reached
这个问题可能会比较棘手,因为此时无法执行Redis命令,一般来说可以从两个方面进行着手。
1.客户端:如果maxclients参数不是很小的话,应用方的客户端连接数基本不会超过maxclients,通常来看是由于应用方对于Redis客户端使用不当造成的。此时如果应用方是分布式结构的话,可以通过下线部分应用节点(例如占用连接较多的节点),使得Redis的连接数先降下来。从而让绝大部分节点可以正常运行,此时在再通过查找程序bug或者调整maxclients进行问题的修复。
2.服务端:如果此时客户端无法处理,而当前Redis为高可用模式(例如Redis Sentinel和Redis Cluster),可以考虑将当前Redis做故障转移。
此问题不存在确定的解决方式,但是无论从哪个方面进行处理,故障的快速恢复极为重要,当然更为重要的是找到问题的所在,否则一段时间后客户端连接数依然会超过maxclients。
附赠GenericObjectPoolConfig的重要属性
原文地址:https://mp.weixin.qq.com/s?__biz=MjM5NTk0MTM1Mw==&mid=2650650677&idx=1&sn=cbb1cb9fefdf9641a4a7c775660114e8&chksm=bef9c6b3898e4fa5a31ac6e572dca4c20a37d6c1dcb41004d831b34300c5c9ae0ed8c3a1bb45&scene=21#wechat_redirect 作者:付磊
更多编程相关知识,请访问:编程教学!!
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!