在實際項目中遇到redis讀取時報錯。
報錯是
[ERROR] redis.clients.jedis.exceptions.JedisConnectionException: Unexpected end of stream.
[ERROR] redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:198)
[ERROR] redis.clients.util.RedisInputStream.readByte(RedisInputStream.java:40)
[ERROR] redis.clients.jedis.Protocol.process(Protocol.java:132)
[ERROR] redis.clients.jedis.Protocol.read(Protocol.java:196)
[ERROR] redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:288)
[ERROR] redis.clients.jedis.Connection.getBinaryBulkReply(Connection.java:207)
[ERROR] redis.clients.jedis.BinaryJedis.get(BinaryJedis.java:157)
網上首先找到的資料是修改redis服務器上面redis的配置
127.0.0.1:6380> CONFIG GET client-output-buffer-limit
127.0.0.1:6380> config set client-output-buffer-limit 'normal 0 0 0 slave 268435456 67108864 60 pubsub 0 0 0'
修改完成之后,再去修改redis的配置文件
client-output-buffer-limit pubsub 0 0 0
但是我這邊還是不行,在數據訪問量大的時候還是會出現上面的錯誤。
然后我修改了代碼中redisPool初始化的代碼。
/**
* 原來的構造方法
* @param ip 訪問的ip
* @param port 訪問的端口
*/
public RedisDaoImpl(String ip, int port){
jedisPool = new JedisPool(ip,port);
}
/**
* 修改之后的構造方法
* @param ip 訪問的ip
* @param port 訪問的端口
*/
public RedisDaoImpl(String ip, int port){
JedisPoolConfig config = new JedisPoolConfig();
//控制一個pool最多有多少個狀態為idle(空閑的)的jedis實例。
config.setMaxIdle(5);
//表示當borrow(引入)一個jedis實例時,最大的等待時間,如果超過等待時間,則直接拋出JedisConnectionException;
config.setMaxWaitMillis(1000 * 100);
//在borrow一個jedis實例時,是否提前進行validate操作;如果為true,則得到的jedis實例均是可用的;
config.setTestOnBorrow(true);
jedisPool = new JedisPool(config,ip,port);
}
修改這個配置之后,錯誤不再出現。
主要是參考下面的文章給我的啟發。
里面的工具類包括redis的一些配置講的很清楚,之后的項目我會把我自己的redis改造一下,改造成他這樣的形式,便於我去操作。主要一些要注意的問題其中也提出了,值得學習。
