使用Jedis集成redis5.0的Stream新特性,附代码

redis5.0新增了stream的新特性,目前在很多spring的官方redis客户端中都有了更新,本文介绍使用Jedis来操作redis。

引入jedis的新Jar包


	redis.clients
	jedis
	3.1.0

初始化jedis连接池

    JedisPoolConfig poolConfig = new JedisPoolConfig();
	poolConfig.setMaxTotal(maxTotal);
	poolConfig.setMaxIdle(maxIdle);
	this.jedisPool = new JedisPool(poolConfig, host, port, timeout, password);

下面是一些redis新方法的使用
1.使用redis进行分布式加锁操作

/**
	 * 使用redis进行分布式加锁操作
	 * 
	 * @param key
	 * @param value
	 * @param expireTime 单位毫秒
	 * @return
	 */
	public boolean tryDistributedLock(String key, String value, int expireTime) {
		log.info("tryDistributedLock:" + key + "." + System.currentTimeMillis());
			Jedis jedis = jedisPool.getResource();
			SetParams params = new SetParams();
			try {
				String result = jedis.set(getBytes(key), getBytes(value),params.nx().px(expireTime));
				if ("OK".equals(result)) {
					return true;
				}
				return false;
			} finally {
				jedis.close();
			}
	
	}

2.将数据传入stream

	//将数据传入stream
	public StreamEntryID setStream(String key, Map content) {		
		Jedis jedis = jedisPool.getResource();
		//new StreamEntryID().NEW_ENTR = * ,代表id由redis生成
		//也可以指定stream最多存储多少条记录。--自己查api
		return jedis.xadd(key, new StreamEntryID().NEW_ENTRY, content);
	}

2.获取stream

	//获取stream
	public List>> getStream(int count, int block, Entry... streams) {		
		Jedis jedis = jedisPool.getResource();
		return jedis.xread(count, block, streams);
	}

重点如何使用getStream

由于 Entry… streams 是一个可变的 Entry数组,由于Entry是Map的内部类,无法直接创建。除了自己实现Entry的接口之外,我们可以使用Map 来直接转成Entry[]。

Map map = new HashMap<>();
//key为需要订阅的key, StreamEntryID().LAST_ENTRY = $ , 代表最后一条消息
map .putIfAbsent(key, new StreamEntryID().LAST_ENTRY);
Entry[] rooms =  map.entrySet().toArray(new Entry[0]);
//取出1条,阻塞1000ms
List>> list = redisManager.getStream(1, 1000, rooms);

redis的stream的功能接近于kfk,可以用来实现直播间,聊天室,消息订阅推送等场景。

欢迎交流!

你可能感兴趣的:(redis,JAVA)