redis网络波动,Jedis/Lettuce是阻塞还是失败?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis网络波动,Jedis/Lettuce是阻塞还是失败?相关的知识,希望对你有一定的参考价值。

参考技术A

Redis服务器环境:单点配置
Redis客户端环境:Jedis/Lettuce配置
配置信息如下:

Jedis连接工厂的配置:

lettuce连接工厂的配置:

无论是Jedis客户端还是Lettuce客户端,当Redis服务器恢复后,均无需重启项目,项目的Redis访问请求即可恢复。

但是:Jedis客户端的请求会立刻失败;Lettuce的请求会被阻塞,由定时发起reconnect操作。

将连接池与 Jedis 一起使用

【中文标题】将连接池与 Jedis 一起使用【英文标题】:Use Connection pool with Jedis 【发布时间】:2017-11-18 02:08:23 【问题描述】:

我正在使用 Jedis 连接 REST 服务中的 Redis 服务器。

当我调用网络服务时,我想做 jedis.hmgetjedis.exitshgetALL 等操作。

例如:

jedis.hmget("employee:data:" + emp_user_id, "employee_id").get(0);

我用于 Redis 的配置是:

Jedis jedis;

    JedisShardInfo shardInfo;

    @PostConstruct
    public void init() 

        try 

            shardInfo = new JedisShardInfo(Config.getRedisHost(), Config.getRedisPort());
            shardInfo.setPassword(Config.getRedisPassword());
            jedis = new Jedis(shardInfo);
            jedis.select(2);
        //jedis.se
         catch (Exception e) 
            logger.error("Exception in init ------- > " + e);
        

    

我知道 Jedis 不是线程安全的。当我一次使用 1000 个线程调用该服务时,我收到一个异常,即 Unexpected end of stream。我想知道 Jedis 池是线程安全的吗?无法找到具体的解决方案。

谢谢。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:
JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost", portno, 10000,
            "password");

请看这里:https://github.com/xetorthio/jedis/wiki/Getting-started

【讨论】:

【参考方案2】:

查看 Spring-data-redis

当您添加JedisConnectionFactory 时,您将获得一个默认具有连接池功能的connectionFactory。

JedisConnectionFactory() 使用默认设置(默认连接池,无分片信息)构造一个新的 JedisConnectionFactory 实例。 See docs.

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true" p:host-name="server" p:port="6379"/>

</beans>

更多信息,see the documentation。

【讨论】:

使用 JedisConnectionFactory 我们必须使用 RedisTemplate 并且 Redistemplate 不支持我正在执行的操作:jedis.hmget("employee:data:" + emp_user_id, "employee_id").get(0) ;和 Jedis.exits(字符串键);如何做到这一点? 检查 docs.spring.io/spring-data/redis/docs/1.8.4.RELEASE/reference/… 和 docs.spring.io/spring-data/redis/docs/current/api/org/… 。它们都受支持。 我们如何实现jedis.hmget("employee:data:" + emp_user_id, "employee_id").get(0);和 Jedis.exits(字符串键);在java中使用redistemplate 完全可以同时使用JedisConnectionFactoryRedisTemplate。事实上,您的RedisTemplate 可能已经配置了JedisConnectionFactory,为什么不使用它呢?为什么使用JedisConnectionFactory 比使用xetorthio/jedis 内部类解决您最初的问题更糟糕? 我按要求提供了您应该搜索的方向。我不会为您编写代码,因为 Stack Overflow 不是编码服务。

以上是关于redis网络波动,Jedis/Lettuce是阻塞还是失败?的主要内容,如果未能解决你的问题,请参考以下文章

jedis 连接超时后还需要关闭吗

一日一技:隐患——redis-py的blpop可能由于网络波动导致收不到信息

jedis订阅发布故障处理

Jedis连接redis偶尔connection timeout

java通过jedis为啥无法连接redis服务

redis的java客户端之jedis