4、列表

列表(list)类型是用来存储多个有序的字符串,如图2-18所示,a、b、c、d、e五个元素从左到右组成一个有序列表,列表中的每个字符串称为元素,一个列表最大可以存储2^32-1个元素。在Redis中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等(如图2-18和图2-19所示)。列表是一种比较灵活的数据结构,它可充当栈和队列的角色,在实际开发中有很多应用场景。

列表类型有如下两个特点:

(1)列表中的元素是有序的。这就意味着可以通过索引下表获取某个元素或者某个范围内的元素列表,例如要获取图2-19的第5个元素,可以执行lindex user:1: message4 (索引从0开始)就可以得到元素e。

(2)列表中的元素可以是重复的。例如图2-20所示列表中包含两个字符串a。

4.1 命令

按照对列表的5种操作类型对命令进行介绍,命令如表2-4所示。

4.1.1 添加操作

(1)从右边插入元素

 rpush key value [value ...]

程序举例:

可以使用 lrange 0 -1 命令从左到右获取列表中的所有元素。

(2)从左边插入元素

 lpush key value [value ...]

使用方法和rpush相同,只不过从左侧插入。

(3)向某个元素前或者后插入元素

 linsert key before | after pivot value

linsert命令会从列表中找出等于pivot的元素,在其前(before)护着后(after)插入新的元素value,例如下面的操作会在列表的元素b前插入java:

返回结果为4,代表当前命令的长度,可使用lrange命令查看当前列表。

4.1.2 查找

(1)获取指定范围内的元素列表

 lrange key start end

lrange操作会获取列表指定索引范围所有的元素。索引下表有2个特点:

  • 索引下标从左到右分别是0到N-1,但是从右到左分别是-1和-N。
  • lrange中的end选项包含了自身,这和很多编程语言是不同的。

例如想获取列表的第2到第4个元素,可以执行下列操作:

(2)获取列表指定索引下表的元素

 lindex key index

例如当前列表最后一个元素为a:

(3)获取列表长度

 llen key

例如下面示例当前列表长度为4:

4.1.3 删除

(1)从列表左侧弹出元素

 lpop key

如下操作会将列表最左侧的元素a弹出,弹出后列表变为java、b、c

(2)从列表右侧弹出元素

 rpop key

(3)删除指定元素

 lrem key count value

lrem命令会从列表中找到等于value的元素并进行删除,根据count的不同分为3种情况:

  • count > 0 ,从左到右最多删除count个元素;
  • count < 0 ,从右到左最多删除count绝对值个元素;
  • count = 0 ,删除所有。

例如下述操作从列表左边开始删除4个为a的元素:

(4)按照索引范围修剪列表

 ltrim key start end

例如下述操作只保留了listkey列表中的第2到第4个元素:

4.1.4 修改

修改指定索引下标的元素:

 lset key index newValue

下面的操作会将列表listkey中的第3个元素设置为python:

4.1.5 阻塞操作

4.2 内部编码

列表类型的内部编码有2种:

  • ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries配置(默认为512个),同时列表中每个元素的值都小于list-max-ziplist-value配置时(默认64字节),redis会选用ziplist来作为列表内部实现来减少内存的使用。
  • linkedlist(链表):当列表类型无法满足ziplist的条件时,redis会使用linkedlist作为列表的内部实现。

4.3 使用场景

4.3.1 消息队列

如图2-21所示,redis的lpush+brpop命令组合可以实现阻塞队列,生产者客户端使用lrpush从列表左侧插入元素,多个客户端使用brpop命令阻塞式的“抢”列表尾部的元素,多个客户端保证了消费者的负载均衡以及高可用性。

4.3.2 文章列表

【redis 学习系列】API的理解与使用(三)的更多相关文章

  1. 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)

    本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...

  2. 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

    本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...

  3. 分布式缓存技术redis学习系列

    分布式缓存技术redis学习系列(一)--redis简介以及linux上的安装以及操作redis问题整理 分布式缓存技术redis学习系列(二)--详细讲解redis数据结构(内存模型)以及常用命令 ...

  4. redis学习系列

    redis学习系列 基本看完 最近在看redis的代码,简单记录下自己认为重要的点,自己写比较费时间的,我会把查到的资料贴出来方便查看 淘宝的redis内存分析 http://www.searchtb ...

  5. C# Redis学习系列三:Redis配置主从

    Redis配置主从 主IP :端口      192.168.0.103 6666 从IP:端口       192.168.0.108 3333 配置从库 (1)安装服务: redis-server ...

  6. Python操作redis学习系列之(集合)set,redis set详解 (六)

    # -*- coding: utf-8 -*- import redis r = redis.Redis(host=") 1. Sadd 命令将一个或多个成员元素加入到集合中,已经存在于集合 ...

  7. C# Redis学习系列二:Redis基本设置

    上一篇:C# Redis学习系列一:Redis的认识.下载.安装.使用 一.redis 设置密码 使用下载好的 redis-cli.exe 指令: 1.设置密码: config set require ...

  8. Redis学习系列一Linux环境搭建

    1.简介 Redis是互联网技术架构中在存储系统中用的最广泛的中间件,是中高级后端工程师技术面试中面试官最喜欢问的工程技能之一.所以Redis是.Net技术开发必须掌握的技能之一.所以通过这个系列的随 ...

  9. 【redis 学习系列】API的理解与使用(一)

    Redis提供了5种数据结构,以下介绍一些预备知识以及Redis的5种数据结构 1.预备知识 1.1 全局命令 Redis的5种数据结构,它们是键值对中的值,对于键来说有一些通用的命令. (1)查看所 ...

  10. 【redis 学习系列】API的理解与使用(二)

    3.哈希 几乎所有的语言都支持了哈希(hash)类型.在Redis中,哈希类型是指键值本身又是一个键值对结构,形如:value = {{field, value} ... {field, value} ...

随机推荐

  1. 4、Wepy-Redux基本使用 参考自https://blog.csdn.net/baidu_32377671/article/details/86708019

    摘抄自https://juejin.im/post/5b067f6ff265da0de02f3887 wepy 框架本身是支持 Redux 的,我们在构建项目的时候,将 是否安装 Redux 选择 y ...

  2. 前端性能优化-Vue代码层面

    1.v-if 和 v-show 区分使用场景 v-if 是 真正 的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建:也是惰性的:如果在初始渲染时条件为假,则什么也不做 ...

  3. Linux软链接创建及删除

    1.创建软链接 具体用法是:ln  -s   [源文件]   [软链接文件]. [root@localhost folder]# pwd /tmp/folder [root@localhost fol ...

  4. ie11浏览器不显示vbs脚本

    最初接触学习vbs在浏览器上运行,老不显示vbscript脚本语言,所以找了很久,最后就用这个方法吧,比较简单有效 原因:新版IE不再支持 VBScript,就是因为微软已经放弃把VBScript作为 ...

  5. Caffe---Pycaffe 绘制loss和accuracy曲线

    Caffe---Pycaffe 绘制loss和accuracy曲线 <Caffe自带工具包---绘制loss和accuracy曲线>:可以看出使用caffe自带的工具包绘制loss曲线和a ...

  6. linux命令 - nohup

    nohup command & nohup scrapy crawl eeo > /home/wangliang/eeo.log & nohou 需要后台的命令 打印的日志位置 ...

  7. 关于SendMessage和PostMessage的理解的例子

    对于SendMessage 和 PostMessage 平时口头的解释是 SendMessage 发送消息后等待返回, PostMessage 发送消息后立即返回 . 但是这样解释还是不具体,什么叫等 ...

  8. Mybatis一对一和一对多配置

    作者:夕下奕林 问题描述 现在有三张数据表,表名为orders,orderdetail,items,分别表示订单,订单详情,商品. 其中一个订单包含多个订单详情,表示订单中的不同个具体的商品,订单详情 ...

  9. git命令行提交流程

    一.顺利提交无冲突情况(diff->add->fetch->pull->commit->push) 1.git  status 查看状态 2. git diff head ...

  10. 使用memocache

    直接cmd下运行 pip3 install python-memcached serializer.py 里的特别应用 如果一个表模型一些字段用到了跨表.可以这样取值 跨表字段 coach_nickn ...