消费Redis利用队列实现不重复消费(redis 队列不重复)

思路: Redis除了有专用的记录存储以外,还可以担任消息队列的角色,消费者可以通过一些操作来实现不重复消费。 对于普通…

思路:

Redis除了有专用的记录存储以外,还可以担任消息队列的角色,消费者可以通过一些操作来实现不重复消费。

对于普通的消息队列,有两种不重复消费的方法,分别是发布 / 订阅模式和拉取 / 确认模式,但 Redis 不支持这两种方式,它更适合必须在一个窗口中执行的短暂任务。

那么,我们如何使用 Redis 实现不重复消费呢?可以使用Redis LIST 功能,在LIST中存储已消费和待消费的消息,以及根据情况在有限时间内让消息不被重复消费,比如如下代码:

// 首先将未消费的消息存储到 Redis
// 将待消费的消息存放到Redis List队列中
List msgList = new LinkedList();
// 设置消息有效期1小时
Long timeout = 3600L;
for(String msg:wtingMessage){
// 将消息放入队列
msgList.add(msg);
// 并设置超时时间
redisTemplate.expire(msg,timeout,TimeUnit.SECONDS);
}
redisTemplate.opsForList().rightPushAll(KEY,msgList);

接下来,我们可以使用Redis的BLPOP方法来实现不重复消费,将从队列中获取消息并在短时间内执行,如下代码所示:

// 从队列中获取消息 
String msg = redisTemplate.opsForList().rightPop(KEY);
// 将消息可用队列中删除
redisTemplate.opsForList().remove(KEY,1,msg);
// 在限时之内,对消息进行消费
consumerMsg(msg);

另外,如果消息消费者没有能在规定的时间内消费完消息,则可以重新将消息放回队列中,如下代码所示:

// 消息消费没有在规定的时间内消费完,则可以重新将消息放回队列中
msgList.add(msg);
// 重新设置消息的超时时间
redisTemplate.expire(msg,timeout, TimeUnit.SECONDS);
//将消息放回队列
redisTemplate.opsForList().rightPushAll(Key, msgList);

以上就是通过 Redis 队列实现不重复消费的思路。经过以上操作,消息在有限时间内只会被消费一次,有效地完成了实现不重复消费的需求。

香港服务器首选港服(Server.HK),2H2G首月10元开通。
港服(Server.HK)(www.IDC.Net)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。

为您推荐

港服(Server.HK)MongoDB教程:MongoDB 索引

MongoDB 索引 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件...

港服(Server.HK)PostgreSQL教程PostgreSQL 别名

PostgreSQL 别名 我们可以用 SQL 重命名一张表或者一个字段的名称,这个名称就叫着该表或该字段的别名。 创建...

港服(Server.HK)Memcached教程:Memcached stats 命令

Memcached stats 命令 Memcached stats 命令用于返回统计信息例如 PID(进程号)、版本号...

港服(Server.HK)Redis教程:Redis 数据类型

Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集...

港服(Server.HK)Redis教程:Redis GEO

Redis GEO Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 ...
返回顶部