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

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

引入jedis的新Jar包

<dependency>
	<groupId>redis.clients</groupId>
	<artifactId>jedis</artifactId>
	<version>3.1.0</version>
</dependency>

初始化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<Entry<String, List<StreamEntry>>> getStream(int count, int block, Entry<String, StreamEntryID>... streams) {		
		Jedis jedis = jedisPool.getResource();
		return jedis.xread(count, block, streams);
	}

重点如何使用getStream

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

Map<String, StreamEntryID> 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<Entry<String, List<StreamEntry>>> list = redisManager.getStream(1, 1000, rooms);

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

欢迎交流!

评论 6 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页

打赏作者

枯燥的扁豆

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值