前言本文将对Redis中的列表类型命令进行说明,同时也会通过demo进行说明,其他部分在此不再赘述。项目Github地址:https://github.com/rainbowda/...案例的demo函数是一个队列,整个demo的大概页面如下。左边是存储在Redis中的数据,右边是从Redis中弹出的数据。准备工作首先,定义一个keyqueue用于存放list。key队列的关键是使用list:1.Redis中redis操作对象list的结构如下图所示(图片来自RedisinAction)。InsertDataHeadInsert命令简介接下来我们看一下demo中的header插入功能。点击下图中的表头插入按钮,然后在弹出的框中填入数字0。点击Submit后,整个header插入过程结束。可以看到左边队列数据中有一条{"data":"0"}数据,在数据{"data":"1"}上面。我们来看看后台方法。如果需要在Redis中操作,可以输入如下命令TailInsert命令简介接下来我们看一下demo中的尾部插入功能,点击下图中的尾部插入按钮,然后填入数字11在弹出框中点击提交,整个添加过程结束。可以看到左边队列数据中有一条{"data":"11"}数据,在数据{"data":"10"}下面。我们来看看后台方法。如果需要在Redis中操作,可以输入以下命令列表查询命令介绍。也先看看相关的getvalue命令后台查询方法,查询新增的内容。看表头弹窗功能,点击下图中的表头弹窗按钮,可以看到左边队列顶端的数据减少了,右边弹出的数据消失了数据在左边的队列中。我们来看看后台方法。如果需要在Redis中进行操作,可以在最后输入如下命令弹出。接下来看最后弹窗的功能。点击下图中末尾的弹出按钮,可以看到左边队列末尾的数据减少了,右边弹出的数据有左边队列数据的数据消失。我们来看看后台方法。如果需要在Redis中进行操作,可以输入以下命令。其他命令RPOPPLPUSH和BRPOPLPUSH其实是一样的,只是BRPOPLPUSH被阻塞了。没有数据时,会一直阻塞,直到有数据。在Redis官方文档中,用RPOPPLPUSH命令给出了两个例子,一个是Reliablequeue(安全队列),一个是Circularlist(循环列表)。可靠队列(safequeue)Redis通常作为消息服务器来处理各种后台工作或消息任务。一种简单的队列模式是:生产者将消息放入一个列表中,等待消息的消费者使用RPOP命令(轮询方式),或者BRPOP命令(如果客户端使用阻塞操作更好)来获取这些信息。但是,这样的队列并不安全,因为消息可能会丢失。例如,接收消息时,网络出现问题或者消费者崩溃,导致消息丢失。RPOPLPUSH(或其阻塞版本BRPOPLPUSH)提供了一种避免此问题的方法:当消费者收到消息时,它将消息放入正在进行的列表中。处理消息后,该命令使用LREM命令从处理列表中删除相应的消息。此外,还可以添加一个客户端来监控正在处理的列表。如果某些消息已经在列表中停留了很长时间(即超过了一定的处理时限),那么客户端会将这些超时的消息重新加入到队列中。翻译自http://www.redis.cn/commands/...循环列表(Circularlist)如果RPOPPLPUSH命令的源和目的相同,那么当客户端访问一个有n个元素的列表时,可以(n)逐个获取列表元素的时间,而不需要像LRANGE那样将整个列表从服务器传输到客户端。即使在以下两种情况下,上述模式也能很好地工作:有多个客户端同时轮换同一个列表:他们将获得不同的元素,直到列表中的所有元素都被访问过,然后从头开始重新操作。还有其他客户端将新元素添加到列表的末尾。这种模式让我们很容易实现这样一个系统:有N个客户端,需要连续处理一批元素,并且处理过程必须尽可能快。一个典型的例子是服务器上的监控程序:他们需要并行检查一批网站,以确保它们在最短的时间内可以访问。值得注意的是,使用这种模式的客户端是可扩展的和可靠的,因为即使客户端丢失了接收到的消息,消息仍然存在于队列中,等待下一次迭代到它,它被其他客户端处理。翻译来自http://www.redis.cn/commands/...Case-约瑟夫问题约瑟夫问题(有时称为约瑟夫斯排列),是计算机科学和数学中出现的问题。在计算机编程算法中,类似的问题也被称为约瑟夫环。人们站成一圈等待被处决。计数从圆中的指定点开始,并沿指定方向绕圆进行。跳过指定人数后,执行下一个人。对剩下的人重复这个过程,从下一个人开始,向同一方向跳过相同数量的人,直到只剩下一个人并被释放。问题是,给定人数、起点、方向和要跳过的数字,在初始圆圈中选择一个位置以避免执行。来自维基百科https://zh.wikipedia.org/wiki...思路是定义一个listkey为josephus,使用命令构造一个循环链表。每当数量达到3时,使用rpop命令弹出代码,实现整个代码。步骤如下。模拟有41个人(向redis中key为josephus的list添加41条数据)定义索引索引循环判断key为josephus的数据长度是否大于0,当索引index为3时,调用Redis的rpop命令弹出相应的数据。当索引index不为3时,调用RPOPLPUSH命令将对应数据放入队列头索引index加1,运行结果有点长。这里只是最后一部分结果的截图。以下Josephus问题代码请点击JosephusProblem.java,推荐学习的同学最好每条命令都敲一下,加深印象。下面的经文是给你的。纸上谈兵的成果总是肤浅的,我知道这件事必须要做。————来自《冬夜读书示子聿》本文作者:不要胡乱看原文。本文为云栖社区原创内容,未经许可不得转载。
