redis系列:通过队列案例学习list命令


这一篇文章将讲述Redis中的list类型命令,同样也是通过demo来讲述,其他部分这里就不在赘述了。

项目Github地址:

https://github.com/rainbowda/learnWay/tree/master/learnRedis/case-list

demo功能是队列,整个demo的大致页面如下。左边是存储到Redis中的数据,右边是从Redis中弹出的数据

首先定义一个存储list的key

队列的key就用list:1

redis操作对象

list在Redis中的结构可以看下图(图片来源于Redis in Action)。

接下来看看demo中头部插入的功能,点击下图中头部插入按钮,然后在弹出框中填入数字0,点击提交后整个头部插入流程结束。可以看到左边的队列数据出现了一条{“data”:”0″} 数据,在数据{“data”:”1″} 上面。

来看看后台的方法

如果需要在Redis中操作,可以敲下面的命令

接下来看看demo中尾部插入的功能,点击下图中尾部插入按钮,然后在弹出框中填入数字11,点击提交后整个新增流程结束。可以看到左边的队列数据出现了一条{“data”:”11″} 数据,在数据{“data”:”10″}下面。

来看看后台的方法

如果需要在Redis中操作,可以敲下面的命令

同样先看看相关的获取值命令

后台查询方法,将新增的内容查询出来

接下来看看头部弹出的功能,点击下图中头部弹出按钮,可以看到左边的队列顶部数据减少了,在右边弹出的数据出现了左边队列数据消失的数据。

来看看后台的方法

如果需要在Redis中操作,可以敲下面的命令

接下来看看尾部弹出的功能,点击下图中尾部弹出按钮,可以看到左边的队列尾部数据减少了,在右边弹出的数据出现了左边队列数据消失的数据。

来看看后台的方法

如果需要在Redis中操作,可以敲下面的命令

这两个命令作用其实是相同的,只不过BRPOPLPUSH是阻塞的,当没有数据时,会一直阻塞,直到有数据。

在Redis官方文档中,用RPOPLPUSH命令举了两个例子,一个是Reliable queue(安全的队列 ),另一个是Circular list(循环列表)。

Redis通常都被用做一个处理各种后台工作或消息任务的消息服务器。 一个简单的队列模式就是:生产者把消息放入一个列表中,等待消息的消费者用

RPOP

命令(用轮询方式), 或者用 BRPOP 命令(如果客户端使用阻塞操作会更好)来得到这个消息。

然而,因为消息有可能会丢失,所以这种队列并是不安全的。例如,当接收到消息后,出现了网络问题或者消费者端崩溃了, 那么这个消息就丢失了。

RPOPLPUSH (或者其阻塞版本的

BRPOPLPUSH

) 提供了一种方法来避免这个问题:消费者端取到消息的同时把该消息放入一个正在处理中的列表。 当消息被处理了之后,该命令会使用 LREM 命令来移除正在处理中列表中的对应消息。

另外,可以添加一个客户端来监控这个正在处理中列表,如果有某些消息已经在这个列表中存在很长时间了(即超过一定的处理时限), 那么这个客户端会把这些超时消息重新加入到队列中。

翻译来自

http://www.redis.cn/commands/rpoplpush.html

RPOPLPUSH 命令的 source 和 destination 是相同的话, 那么客户端在访问一个拥有n个元素的列表时,可以在 O(N) 时间里一个接一个获取列表元素, 而不用像

LRANGE

那样需要把整个列表从开发云主机域名服务器端传送到客户端。

上面这种模式即使在以下两种情况下照样能很好地工作:

有多个客户端同时对同一个列表进行旋转(rotating):它们会取得不同的元素,直到列表里所有元素都被访问过,又从头开始这个操作。

有其他客户端在往列表末端加入新的元素。

这个模式让我们可以很容易地实现这样一个系统:有 N 个客户端,需要连续不断地对一批元素进行处理,而且处理的过程必须尽可能地快。 一个典型的例子就是服务器上的监控程序:它们需要在尽可能短的时间内,并行地检查一批网站,确保它们的可访问性。

值得注意的是,使用这个模式的客户端是易于扩展(scalable)且安全的(reliable),因为即使客户端把接收到的消息丢失了, 这个消息依然存在于队列中,等下次迭代到它的时候,由其他客户端进行处理。

翻译来自

http://www.redis.cn/commands/rpoplpush.html


约瑟夫问题

(有时也称为

约瑟夫斯置换

),是一个出现在

计算机科学

数学

中的问题。在计算机

编程

的算法中,类似问题又称为

约瑟夫环

人们站在一个等待被处决的圈子里。 计数从圆圈中的指定点开始,并沿指定方向围绕圆圈进行。 在跳过指定数量的人之后,执行下一个人。 对剩下的人重复该过程,从下一个人开始,朝同一方向跳过相同数量的人,直到只剩下一个人,并被释放。

问题即,给定人数、起点、方向和要跳过的数字,选择初始圆圈中的位置以避免被处决。

来自维基百科

https://zh.wikipedia.org/wiki/%E7%BA%A6%E7%91%9F%E5%A4%AB%E6%96%AF%E9%97%AE%E9%A2%98

定义一个list key为josephus,利用

命令来构造循环链表,每当数到3时,使用rpop

命令弹出

整个代码步骤如下

先是模拟有41个人(向redis中key为josephus的list添加41个数据)

定义索引index

循环判断key为josephus的数据长度是否大于0

当索引index为3时,调用Redis的rpop命令弹出对应的数据。索引index不为3时,调用RPOPLPUSH命令,将对应的数据放到队列头部

索引index加1

运行结果有点长,这里只截图最后一部分的结果,如下

约瑟夫问题代码请点击


JosephusProblem.java

建议学习的人最好每个命令都去敲下,加深印象。下面诗句送给你们。

纸上得来终觉浅,绝知此事要躬行。————出自《冬夜读书示子聿》

相关推荐: Docker集群之Flannel使用技巧

当您将多台服务器节点组成一个Docker集群时,需要对集群网络进行设置,否则默认情况下,无法跨主机容器互联,接下来我们首先分析一下原因。 下图描述了一个简单的集群网络,在该集群内,有两台服务器甲和乙,每台服务器上都有两张网卡,分别连接公网和私网,两台服务器可以…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 05/14 16:43
Next 05/14 16:43

相关推荐