67,513
社区成员
发帖
与我相关
我的任务
分享
package com.test.jedis;
import redis.clients.jedis.Jedis;
/**
* @Author: yinqianhui
* @Date Created by ThinkPad on 2017/8/24.
*/
public class MutiTest implements Runnable {
Jedis jedis;
public MutiTest(Jedis jedis) {
this.jedis = jedis;
}
public void run() {
try {
System.out.println(jedis);
jedis.set("name", "123");
Thread.sleep(3000);
System.out.println(Thread.currentThread().getName() + " name======" + jedis.get("name"));
} catch (Exception e) {
System.out.println("错误:" + e);
} finally {
RedisUtil.returnResource(jedis);
}
}
public static void main(String[] args) {
//为每隔线程获取一个jedis,这是没问题的
/* for(int i=0;i<10;i++) {
Jedis jedis1 = RedisUtil.getJedis();
MutiTest mutiTest1 = new MutiTest(jedis1);
Thread t1 = new Thread(mutiTest1);
t1.start();
Jedis jedis2 = RedisUtil.getJedis();
MutiTest mutiTest2 = new MutiTest(jedis2);
Thread t2 = new Thread(mutiTest2);
t2.start();
}*/
System.out.println("----------------猥琐的分割线--------------------");
//所有线程共用一个jedis,会出现错误
Jedis jedis1 = RedisUtil.getJedis();
for (int i = 0; i < 10; i++) {
MutiTest mutiTest1 = new MutiTest(jedis1);
Thread t1 = new Thread(mutiTest1);
t1.start();
MutiTest mutiTest2 = new MutiTest(jedis1);
Thread t2 = new Thread(mutiTest2);
t2.start();
MutiTest mutiTest3 = new MutiTest(jedis1);
Thread t3 = new Thread(mutiTest3);
t3.start();
}
}
}
当所线程共用一个jedis时会报:
错误:redis.clients.jedis.exceptions.JedisConnectionException: Unknown reply: O
错误:redis.clients.jedis.exceptions.JedisConnectionException: Unknown reply: K
错误:redis.clients.jedis.exceptions.JedisConnectionException: It seems like server has closed the connection.
错误:redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Software caused connection abort: socket write error
synchronized 这个东西是可以去掉的,因为jedis源码内部已经加了package com.test.jedis;
import redis.clients.jedis.Jedis;
/**
* @Author: yinqianhui
* @Date Created by ThinkPad on 2017/8/24.
*/
public class MutiTest implements Runnable {
Jedis jedis;
public MutiTest(Jedis jedis) {
this.jedis = jedis;
}
public void run() {
try {
System.out.println(jedis);
jedis.set("name", "123");
Thread.sleep(3000);
System.out.println(Thread.currentThread().getName() + " name======" + jedis.get("name"));
} catch (Exception e) {
System.out.println("错误:" + e);
} finally {
RedisUtil.returnResource(jedis);
}
}
public static void main(String[] args) {
//为每隔线程获取一个jedis,这是没问题的
/* for(int i=0;i<10;i++) {
Jedis jedis1 = RedisUtil.getJedis();
MutiTest mutiTest1 = new MutiTest(jedis1);
Thread t1 = new Thread(mutiTest1);
t1.start();
Jedis jedis2 = RedisUtil.getJedis();
MutiTest mutiTest2 = new MutiTest(jedis2);
Thread t2 = new Thread(mutiTest2);
t2.start();
}*/
System.out.println("----------------猥琐的分割线--------------------");
//所有线程共用一个jedis,会出现错误
Jedis jedis1 = RedisUtil.getJedis();
for (int i = 0; i < 10; i++) {
MutiTest mutiTest1 = new MutiTest(jedis1);
Thread t1 = new Thread(mutiTest1);
t1.start();
MutiTest mutiTest2 = new MutiTest(jedis1);
Thread t2 = new Thread(mutiTest2);
t2.start();
MutiTest mutiTest3 = new MutiTest(jedis1);
Thread t3 = new Thread(mutiTest3);
t3.start();
}
}
}
当所线程共用一个jedis时会报:
错误:redis.clients.jedis.exceptions.JedisConnectionException: Unknown reply: O
错误:redis.clients.jedis.exceptions.JedisConnectionException: Unknown reply: K
错误:redis.clients.jedis.exceptions.JedisConnectionException: It seems like server has closed the connection.
错误:redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Software caused connection abort: socket write error
public synchronized static Jedis getJedis() {
try {
if (jedisPool != null) {
} else {
initJedisPool();
}
return jedisPool.getResource();
} catch (Exception e) {
LOGGER.error("获取jedis异常:"+e.getMessage());
e.printStackTrace();
return null;
}
}
//这个是我释放redis的代码
public synchronized static void returnResource(final Jedis jedis) {
if (jedis != null) {
jedisPool.returnResource(jedis);
}
}
有没有可能把那些损坏的jedis还回去了。。。。。但是这种说不过去!要是有问题应该所有的服务器都会出问题才对...