摘要: 前言 这一篇文章将讲述Redis中的list类型命令,同样也是通过demo来讲述,其他部分这里就不在赘述了。 项目Github地址:https://github.com/rainbowda/... 案例 demo功能是队列,整个demo的大致页面如下。

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

项目Github地址:https://github.com/rainbowda/...

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

准备工作
首先定义一个存储list的key

private static final String LIST_KEY = "list:1";
队列的key就用list:1

redis操作对象

private RedisTemplate redisTemplate;
//string 命令操作对象
private ValueOperations valueOperations;
//list 命令操作对象
private ListOperations listOperations;
list在Redis中的结构可以看下图(图片来源于Redis in Action)。

图片来源于Redis in Action

插入数据
头部插入
命令介绍

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

来看看后台的方法

@RequestMapping(value = "/leftPop",method = RequestMethod.GET)
public Object leftPop(){

return listOperations.leftPop(LIST_KEY);

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

lpush list:1 "{"data":"0"}"
尾部插入
命令介绍

RPUSHX RPUSHX key value 将值 value 插入到列表 key 的表尾, 当且仅当 key 存在并且是一个列表。
接下来看看demo中尾部插入的功能,点击下图中尾部插入按钮,然后在弹出框中填入数字11,点击提交后整个新增流程结束。可以看到左边的队列数据出现了一条{"data":"11"} 数据,在数据{"data":"10"}下面。

来看看后台的方法

@RequestMapping(value = "/rightPop",method = RequestMethod.GET)
public Object rightPop(){

return listOperations.rightPop(LIST_KEY);

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

rpush list:1 "{"data":"11"}"
列表查询
命令介绍
同样先看看相关的获取值命令


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

@RequestMapping(value = "/getList",method = RequestMethod.GET)
public List getList(){

List list = listOperations.range(LIST_KEY, 0, -1);//可以用size获取成员长度
//listOperations.size(LIST_KEY);return list;

}
数据弹出
头部弹出

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

来看看后台的方法

@RequestMapping(value = "/leftPop",method = RequestMethod.GET)
public Object leftPop(){

return listOperations.leftPop(LIST_KEY);

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

lpop list:1
尾部弹出

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

来看看后台的方法

@RequestMapping(value = "/rightPop",method = RequestMethod.GET)
public Object rightPop(){

return listOperations.rightPop(LIST_KEY);

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

rpop list:1
其他命令

RPOPLPUSH RPOPLPUSH source destination 原子性地返回并移除存储在 source 的列表的最后一个元素(列表尾部元素), 并把该元素放入存储在 destination 的列表的第一个元素位置(列表头部)。
BRPOPLPUSH BRPOPLPUSH source destination timeout BRPOPLPUSH 是 RPOPLPUSH 的阻塞版本。
RPOPLPUSH和BRPOPLPUSH
这两个命令作用其实是相同的,只不过BRPOPLPUSH是阻塞的,当没有数据时,会一直阻塞,直到有数据。

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

Reliable queue(安全的队列 )
Redis通常都被用做一个处理各种后台工作或消息任务的消息服务器。 一个简单的队列模式就是:生产者把消息放入一个列表中,等待消息的消费者用 RPOP 命令(用轮询方式), 或者用 BRPOP 命令(如果客户端使用阻塞操作会更好)来得到这个消息。

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

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

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

翻译来自 http://www.redis.cn/commands/...

Circular list(循环列表)
RPOPLPUSH 命令的 source 和 destination 是相同的话, 那么客户端在访问一个拥有n个元素的列表时,可以在 O(N) 时间里一个接一个获取列表元素, 而不用像 LRANGE 那样需要把整个列表从服务器端传送到客户端。

上面这种模式即使在以下两种情况下照样能很好地工作: 有多个客户端同时对同一个列表进行旋转(rotating):它们会取得不同的元素,直到列表里所有元素都被访问过,又从头开始这个操作。 有其他客户端在往列表末端加入新的元素。

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

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

翻译来自 http://www.redis.cn/commands/...

案例-约瑟夫问题
约瑟夫问题(有时也称为约瑟夫斯置换),是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。

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

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

来自维基百科 https://zh.wikipedia.org/wiki...

思路
定义一个list key为josephus,利用

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

rpop josephus
命令弹出

代码实现
public class JosephusProblem extends RedisBaseConnection {

@Test
public void test() {//构造数据for (int i = 1; i <= 41; i++) {listOperations.leftPush("josephus", String.valueOf(i));}int index = 1;while (listOperations.size("josephus") > 0) {//当数到3时,弹出if (index == 3) {System.out.println(listOperations.range("josephus", 0, -1));System.out.println("当前被杀的人是:" + listOperations.rightPop("josephus"));index = 0;} else {listOperations.rightPopAndLeftPush("josephus", "josephus");}index++;}
}

}
整个代码步骤如下

先是模拟有41个人(向redis中key为josephus的list添加41个数据)
定义索引index
循环判断key为josephus的数据长度是否大于0
当索引index为3时,调用Redis的rpop命令弹出对应的数据。索引index不为3时,调用RPOPLPUSH命令,将对应的数据放到队列头部
索引index加1
运行结果有点长,这里只截图最后一部分的结果,如下

约瑟夫问题代码请点击JosephusProblem.java

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

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

redis系列:通过队列案例学习list命令相关推荐

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

    前言 这一篇文章将讲述Redis中的list类型命令,同样也是通过demo来讲述,其他部分这里就不在赘述了. 项目Github地址:https://github.com/rainbowda/learn ...

  2. redis系列:通过文章点赞排名案例学习sortedset命令

    前言 这一篇文章将讲述Redis中的sortedset类型命令,同样也是通过demo来讲述,其他部分这里就不在赘述了. 项目Github地址:https://github.com/rainbowda/ ...

  3. Redis学习总结(6)——Redis 高级特性与案例学习

    Redis基础类型 String Redis中最基本,也是最简单的数据类型.注意,VALUE既可以是简单的String,也可以是复杂的String,如JSON,在实际中常常利用fastjson将对象序 ...

  4. linux中的ubiq命令用途,学习Linux命令(一)

    Linux下的命令到底有多少,没人清楚.但是有一些命令是大多数系统都包含的,这些命令基本上都包含在GNU Coreutils包中.当然也有一些不包含在Coreutils包中,但是也很基本,很实用的软件 ...

  5. Redis 入门和 RedisTemplate 常用方法(常用命令 + 案例源码)

    Redis 入门 内容 一.Redis 概念 二.Redis 优缺点 1. 优点 2. 缺点 三.应用场景 四.Redis 安装 五.常用命令 1. Redis 字符串(String) 1.1 概念 ...

  6. 【Shell牛客刷题系列】SHELL5 打印空行的行号:一起学习grep命令搭配正则表达式的使用

    该系列是基于牛客Shell题库,针对具体题目进行查漏补缺,学习相应的命令. 刷题链接:牛客题霸-Shell篇. 该系列文章都放到专栏下,专栏链接为:<专栏:Linux>.欢迎关注专栏~ 本 ...

  7. 深入剖析Redis系列(七) - Redis数据结构之列表

    前言 列表(list)类型是用来存储多个 有序 的 字符串.在 Redis 中,可以对列表的 两端 进行 插入(push)和 弹出(pop)操作,还可以获取 指定范围 的 元素列表.获取 指定索引下标 ...

  8. redis系列:redis介绍与安装

    前言 这个redis系列的文章将会记录博主学习redis的过程.基本上现在的互联网公司都会用到redis,所以学习这门技术于你于我都是有帮助的. 博主在写这个系列是用的是目前最新版本4.0.10,虚拟 ...

  9. Redis系列之key操作命令与Redis中的事务详解(六)

    From: http://www.cnblogs.com/knowledgesea/p/5008594.html 序言 本篇主要目的有二: 1.展示所有数据类型中key的所有操作命令,以供大家学习,查 ...

最新文章

  1. c++中求字符串数组的min/max
  2. 【BZOJ5311/CF321E】贞鱼/Ciel and Gondolas(动态规划,凸优化,决策单调性)
  3. 如何在 Centos8 中安装 Lynis审计工具
  4. 你应该将应用迁移到Spring 4的五个原因
  5. Can't get source for site-packages\torchvision\ops\poolers.py. TorchScript requires source access in
  6. Python 技术篇-socket套接字实现服务器客户端消息传递实例演示,UDP实现
  7. Struts2 文件下载
  8. be sure to bring water with you while studying
  9. erlang精要(18)-以函数作为参数的函数,返回函数的函数(1)
  10. OO第二单元作业小结
  11. UE4材质是什么样的机制
  12. 试试看读一下Zepto源码
  13. 贾跃亭个人破产内幕曝光 差一点获得中东土豪投资
  14. Bootstrap响应式布局之 col-xs col-sm col-md
  15. LaTeX中插入文本框并且设置文本框底色(填充色)的方法
  16. 下载chromium for Android
  17. 一文带你认清运维岗位
  18. 区块链MMO游戏该如何设计Token经济?
  19. 如何在网页中调用百度地图API
  20. 新手小白如何开始网络赚钱?最靠谱的实操方法来了!

热门文章

  1. ppt 的局部分大功能软件介绍.ZoomIt
  2. Android中Context详解
  3. android关于控件中setTag(key,Object)的设置的相关问题
  4. 注册中心—组件—Consul
  5. 性能优化—代码层面优化
  6. 一个循环、一个变量打印乘法口诀
  7. python学习day06--01
  8. python (八)迭代器、生成器、列表推导式
  9. border绘制三角形
  10. Swift 添加自定义响应事件