生产使用
准备好您的Jedis应用程序以投入生产
以下部分解释了如何处理生产环境中可能出现的情况。
超时
要为连接设置超时,请使用带有timeout
参数的JedisPooled
或JedisPool
构造函数,或者使用带有socketTimeout
和connectionTimeout
参数的JedisClientConfig
:
HostAndPort hostAndPort = new HostAndPort("localhost", 6379);
JedisPooled jedisWithTimeout = new JedisPooled(hostAndPort,
DefaultJedisClientConfig.builder()
.socketTimeoutMillis(5000) // set timeout to 5 seconds
.connectionTimeoutMillis(5000) // set connection timeout to 5 seconds
.build(),
poolConfig
);
异常处理
Jedis 异常层次结构的根是 JedisException
,它实现了 RuntimeException
,因此都是未检查的异常。
JedisException
├── JedisDataException
│ ├── JedisRedirectionException
│ │ ├── JedisMovedDataException
│ │ └── JedisAskDataException
│ ├── AbortedTransactionException
│ ├── JedisAccessControlException
│ └── JedisNoScriptException
├── JedisClusterException
│ ├── JedisClusterOperationException
│ ├── JedisConnectionException
│ └── JedisValidationException
└── InvalidURIException
一般异常
一般来说,Jedis 在执行命令时可能会抛出以下异常:
JedisConnectionException
- 当与Redis的连接丢失或意外关闭时。配置故障转移以使用Resilience4J和内置的Jedis故障转移机制自动处理此异常。JedisAccessControlException
- 当用户没有执行命令的权限或用户ID和/或密码不正确时。JedisDataException
- 当发送到或从Redis服务器接收的数据出现问题时。通常,错误消息将包含有关失败命令的更多信息。JedisException
- 此异常是一个捕获所有异常的异常,可以抛出任何其他意外错误。
当抛出JedisException
时的条件:
- 使用
PING
命令进行健康检查时返回错误 - 关闭期间失败
- 发布/订阅失败时发出命令(断开连接)
- 任何未知的服务器消息
- Sentinel: 可以连接到sentinel,但主服务器未被监控或所有Sentinel都宕机。
- MULTI 或 DISCARD 命令失败
- 分片命令键哈希检查失败或没有可访问的分片
- 重试截止时间已过/尝试次数(重试命令执行器)
- POOL - 池耗尽,添加空闲对象时出错,将损坏的资源返回到池中
所有的Jedis异常都是运行时异常,在大多数情况下是不可恢复的,因此通常会冒泡到捕获错误消息的API。
DNS缓存和Redis
当你连接到具有多个端点的Redis服务器时,例如Redis Enterprise Active-Active,你必须禁用JVM的DNS缓存。如果服务器节点或代理失败,受故障影响的任何数据库的IP地址将会改变。当这种情况发生时,如果启用了DNS缓存,你的应用程序将继续尝试使用过时的IP地址。
使用以下代码禁用DNS缓存:
java.security.Security.setProperty("networkaddress.cache.ttl","0");
java.security.Security.setProperty("networkaddress.cache.negative.ttl", "0");