redis数据类型List的安全队列和不安全队列

转载 2018年04月16日 15:15:08

在学习RPOPLPUSH命令的时候,官方文档中有提到安全队列和不安全的队列,一开始没有看懂,现在理解了做个笔记。


一般情况下,我们可以借助List来实现消息队列,比如一个客户端通过命令LPUSH(BLPUSH)把消息入队,另一个客户端通过命令RPOP(BRPOP)获取消息。这种方式实现的队列是不安全的。


为什么是不安全的呢?因为RPOP命令的特性:会移除list的队尾元素(消息),并将这个元素(消息)返回给客户端。这意味着该元素就只存在于客户端的上下文中,redis服务器中没有这个元素了,如果客户端在处理这个返回元素的过程崩溃了,那么这个元素就永远丢失了。这种情况导致:客户端虽然成功收到了消息,但是却没有处理它。


那怎么来实现一个安全的队列呢?可以使用redis的 RPOPLPUSH (或者其阻塞版本的 BRPOPLPUSH)命令。


RPOPLPUSH命令格式:RPOPLPUSH  source  destination 。RPOPLPUSH命令原子性地返回并移除 source 列表的最后一个元素, 并把该元素放入 destination 列表的头部。使用这个命令就可以实现安全队列。


因为使用 RPOPLPUSH 获取消息时,RPOPLPUSH 会把消息返给客户端,同时把该消息放入一个备份消息列表,并且这个过程是原子的,可以保证消息的安全。当客户端成功的处理了消息后,就可以把此消息从备份列表中移除了。如果客户端因为崩溃的原因没有处理某个消息,那么就可以从备份列表destination中重新获取并处理这个消息。


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aitangyong/article/details/51980702




Python算法实战视频课程--队列的应用

-
  • 1970年01月01日 08:00

redis实现可靠的队列

用redis brpop 或 blpop命令可以实现可靠的队列。 其命令格式如: brpop|blpop list1 list2 list3 ... timeout 参数: list 列表...
  • u011341352
  • u011341352
  • 2017-01-06 16:06:29
  • 1225

redis之列表类型(list)——队列和栈简单实现

Redis列表是简单的字符串列表,排序插入顺序。您可以在头部或列表的尾部Redis的列表添加元素。 列表的最大长度为232 - 1 (每个列表超过4十亿元素4294967295)元素。 首先,插入数据...
  • loophome
  • loophome
  • 2015-12-21 13:05:51
  • 10673

redis秒杀商品队列

$user_id=session('user_id');          header("Content-type:text/html;charset=utf-8");          $redi...
  • ztblog
  • ztblog
  • 2016-09-19 14:10:20
  • 3440

[Python标准库]Queue——线程安全的 FIFO 实现

[Python标准库]Queue——线程安全的 FIFO 实现         作用:提供一个线程安全的 FIFO 实现。         Python 版本:至少 1.4         Qu...
  • dapeng0802
  • dapeng0802
  • 2015-12-25 00:00:21
  • 5149

redis+nodejs实现队列的思路

redis里面天然的list链表非常适合做队列,下面看一个简单的nodejs+redis队列的实现过程    我们需要两个页面 一个index.ejs和一个pop.ejs分别来查看入队和出队...
  • z1547840014
  • z1547840014
  • 2013-08-03 21:51:45
  • 867

Redis中的List类型与消息队列的不同之处。

作为一个刚接触到消息队列的小白来说,Redis中的List类型超级象理解中的消息队列,并曾经一度认为搞什么消息队列服务,用Redis里的List类型就可以搞定了。 这两天接触了一下真正的消息队列才知...
  • oyiboy
  • oyiboy
  • 2017-12-15 12:12:33
  • 430

redis队列的安装与配置,还有一些安全方面的配置

安装采用源码编译安装方法: $ wget http://download.redis.io/releases/redis-3.2.1.tar.gz $ tar xzf redis-3.2.1...
  • yongzhang52545
  • yongzhang52545
  • 2016-07-04 16:28:11
  • 423

Redis双链表实现安全队列

场景: task + bak 双链表完成安全队列 Task列表                             bak列表     ...
  • qq_25551295
  • qq_25551295
  • 2015-08-16 22:39:57
  • 186

队列的线程安全

在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出)。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQ...
  • u014788227
  • u014788227
  • 2016-10-20 15:45:39
  • 1319
收藏助手
不良信息举报
您举报文章:redis数据类型List的安全队列和不安全队列
举报原因:
原因补充:

(最多只允许输入30个字)