Redis日志-多线程blpop导致的客户端异常

如果是多个线程thread,有几个线程创建几个新连接池,建议不要公用一个,否则研发人员无意间的一个close,会造成多个线程崩溃,程序“不动了”

blpop注意设置超时时间,jedis.blpop(60,"aaa"); 60单位秒,超过60秒没有消息本次blpop也自动结束

服务端启动指令

redis-server.exe redis.windows.conf

客户端连接指令

redis-cli.exe -h 127.0.0.1 -p 6379 -a 123456

查看当前连接数

info clients 

查看最大连接数

config get maxclients

rpush指令,向队列中放入消息

package com.muyunfei.redis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class Redis_rpush {


	private static JedisPool jedisPool = null;
	
	public static void main(String[] args) {
		
		
		JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
		jedisPoolConfig.setMaxIdle(30);// 最大闲置个数
		jedisPoolConfig.setMinIdle(10);// 最小闲置个数
		jedisPoolConfig.setMaxTotal(30);// 最大连接数

		jedisPoolConfig.setTestOnBorrow(true);					 //进行有效性检查
		jedisPoolConfig.setTimeBetweenEvictionRunsMillis(30000); //多长时间检查一次连接池中空闲的连接(ms)
		jedisPoolConfig.setMinEvictableIdleTimeMillis(30000);	 //空闲连接多长时间后会被收回 (ms)

		 jedisPoolConfig.setTestOnReturn(true);
		 jedisPoolConfig.setNumTestsPerEvictionRun(-1);
		 //soTimeout:表示读取数据超时时间
		 //connectionTimeout:表示连接超时时间
         jedisPool = new JedisPool(jedisPoolConfig,"172.20.184.218",6379);

		
		Jedis jedis = jedisPool.getResource();
//		for (int i = 0; i < 300000; i++) {
//			
//			jedis.rpush("HAIYI_DATA_ACQUISITION_SERVICE_SET", "reset " + i);
//		}
//		jedis.close();
		
		int i=0;
		while(true){
			jedis.rpush("HAIYI_DATA_ACQUISITION_SERVICE_SET", "reset " +i++);
		}
		

	}
	
	
	
}

通过blpop获取队列消息

package com.muyunfei.redis;

import java.util.List;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class Redis_blpop {


	private static JedisPool jedisPool = null;
	
	public static void main(String[] args) {
		
		
		JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
		jedisPoolConfig.setMaxIdle(30);// 最大闲置个数
		jedisPoolConfig.setMinIdle(10);// 最小闲置个数
		jedisPoolConfig.setMaxTotal(30);// 最大连接数

		jedisPoolConfig.setTestOnBorrow(true);					 //进行有效性检查
		jedisPoolConfig.setTimeBetweenEvictionRunsMillis(30000); //多长时间检查一次连接池中空闲的连接(ms)
		jedisPoolConfig.setMinEvictableIdleTimeMillis(30000);	 //空闲连接多长时间后会被收回 (ms)

		jedisPoolConfig.setTestOnReturn(true);
		jedisPoolConfig.setNumTestsPerEvictionRun(-1);
		jedisPool = new JedisPool(jedisPoolConfig,"172.20.184.218",6379);

		executeThread_1();
		executeThread_2();
		
	}
	
	
	//第一个线程
	private static void executeThread_1(){
		// 单独创建一个线程
		Thread newThread;
		try {
			Runnable ree = new Runnable() {
				@Override
				public void run() {
					Jedis jedis = jedisPool.getResource();
					while(true){
						//2000表示单位是秒,如果设置为0,blpop会一直等待新消息
						//设置时间后,超过2000秒,没有数据也自动释放本地blpop
						List<String> list = jedis.blpop(2000,"HAIYI_DATA_ACQUISITION_SERVICE_SET");
						System.out.print("111111111:");
						for(String temp:list){
							System.out.print(":"+temp);
						}
						System.out.println("");
					}
				}
			};
			newThread = new Thread(ree);
			// 开启线程
			newThread.start();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	
	
	//第二个线程
	private static void executeThread_2(){
		// 单独创建一个线程
		Thread newThread;
		try {
			Runnable ree = new Runnable() {
				@Override
				public void run() {
					Jedis jedis = jedisPool.getResource();
					while(true){
						List<String> list = jedis.blpop(2000,"HAIYI_DATA_ACQUISITION_SERVICE_SET");
						System.out.print("22222:");
						for(String temp:list){
							System.out.print(":"+temp);
						}
						System.out.println("");
					}
				}
			};
			newThread = new Thread(ree);
			// 开启线程
			newThread.start();
		}catch(Exception e){
			e.printStackTrace();
		}
		
	}
		
}

猜你喜欢

转载自blog.csdn.net/myfmyfmyfmyf/article/details/124693484