生产使用

准备好您的Jedis应用程序以投入生产

以下部分解释了如何处理生产环境中可能出现的情况。

超时

要为连接设置超时,请使用带有timeout参数的JedisPooledJedisPool构造函数,或者使用带有socketTimeoutconnectionTimeout参数的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");
RATE THIS PAGE
Back to top ↑