【Redis笔记(四)】 Redis数据结构 - list链表
原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/50573605
经过前面的介绍,我们学习了Redis中string字符串、hash哈希这两种数据结构的常用命令。这篇文章将介绍Redis中的list – 列表的相关操作。
如果你还不知道string和hash是什么(插播一条“小广告”),可以先看看我的前两篇文章:
list类型介绍
Redis中的list类型其实就是string类型的双向链表。学过数据结构的童鞋都知道,既然是双向链表,就很容易找到从头部或尾部插入、删除元素。这样,list就可以当做栈或队列来使用。在Redis中,list的最大长度为2^32-1。
list相关命令
1、lpush命令
lpush命令将一个或多个元素插入到列表的头部,如果指定的key不存在,则先创建一个空列表,如果指定的key不是一个list类型,则返回一个错误。具体格式为:
lpush key value...
- 1
示例1:
127.0.0.1:6379> lpush mylist a b c
(integer) 3
127.0.0.1:6379> set mystr not_a_list
OK
127.0.0.1:6379> lpush mystr d
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
2、lrange命令
上面,我们使用lpush命令往列表中添加了元素,那么我们怎么知道指定的元素已经插入列表中呢?这是,我们可以使用lrange命令来查看列表中指定范围的元素。该命令的的具体格式如下:
lrange key start stop
- 1
对于lrange命令,我们需要知道一下几点:
- lrange返回列表中下标范围在[start, stop]中的元素。
- 列表的下标偏移量是基于0的,也就是从0开始。这跟我们编程语言中的数组下标的计算方式一致。
- 偏移量可以是负数,表示该偏移量是从列表的尾部开始计数。比如-1表示列表的最后一个元素。
如果给定的下标超出列表下标的范围,Redis不会产生错误。如果start大于列表尾部下标,返回一个空列表,如果stop大于列表尾部下标,则Redis会把列表的尾部下标当做实际的stop值。
示例2:
127.0.0.1:6379> lpush mylist a b c
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "c"
2) "b"
3) "a"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
3、lpushx命令
lpushx命令也用于在列表头部插入元素。与lpush不同的是,当指定key不存在时,该命令并不会创建一个空列表,二是不进行任何操作,直接返回。具体格式如下:
lpushx key value
- 1
示例3:
127.0.0.1:6379> lpushx mylist a
(integer) 0
127.0.0.1:6379> lrange mylist 0 -1
(empty list or set)
127.0.0.1:6379> lpush mylist a
(integer) 1
127.0.0.1:6379> lpushx mylist b
(integer) 2
127.0.0.1:6379> lrange mylist 0 -1
1) "b"
2) "a"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
4、rpush命令
前面我们介绍了,list实际上是一个双向链表,我们可以使用rpush命令从列表的尾部插入一个或多个元素。该命令操作成功后返回列表的长度。具体格式如下:
rpush key value
- 1
示例4:
127.0.0.1:6379> lpush mylist a b c
(integer) 3
127.0.0.1:6379> rpush mylist d e f
(integer) 6
127.0.0.1:6379> lrange mylist 0 -1
1) "c"
2) "b"
3) "a"
4) "d"
5) "e"
6) "f"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
5、rpushx命令
rpushx命令从列表尾部插入元素。与rpush不同的是,当指定列表不存在时,该命令并不会创建一个空列表,而是直接返回。具体格式如下:
rpushx key value
- 1
示例5:
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> rpushx mylist a
(integer) 0
127.0.0.1:6379> lrange mylist 0 -1
(empty list or set)
127.0.0.1:6379> lpush mylist a
(integer) 1
127.0.0.1:6379> rpushx mylist b
(integer) 2
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
6、lpop命令
lpop命令移除并返回list的表头元素。如果列表为空,则返回nil。具体格式如下:
lpop key
- 1
示例6:
127.0.0.1:6379> lpush mylist a
(integer) 1
127.0.0.1:6379> lpop mylist
"a"
127.0.0.1:6379> lpop mylist
(nil)
- 1
- 2
- 3
- 4
- 5
- 6
7、rpop命令
rpop命令移除并返回列表的尾部元素,如果列表为空,则返回nil。具体格式如下:
rpop key
- 1
示例7:
127.0.0.1:6379> lpush mylist a b
(integer) 2
127.0.0.1:6379> rpop mylist
"a"
127.0.0.1:6379> rpop mylist
"b"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
8、lrem命令
lrem命令从列表中移除前count次出现的值为value的元素,返回被移除的元素个数。具体格式如下:
lrem key count value
- 1
其中count的含义如下:
- count = 0:移除所有值为value的元素
- count > 0:从头部往尾部移除count个值为value的元素
count < 0:从尾部往头部移除|count|(绝对值)个值为count的元素
示例8:
127.0.0.1:6379> lpush mylist a b a b c a e f
(integer) 8
127.0.0.1:6379> lrem mylist 0 a
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "f"
2) "e"
3) "c"
4) "b"
5) "b"
127.0.0.1:6379>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
9、ltrim命令
ltrim命令用于剪切指定列表,并保留下标范围为[start, stop]的元素。其中,start、stop均是从0开始计数的,也支持用负数来表示与列表尾部的偏移量。具体格式如下:
ltrim key start stop
- 1
示例9:
127.0.0.1:6379> lpush mylist a b c d e f // 插入后列表为f e d c b a
(integer) 6
127.0.0.1:6379> ltrim mylist 0 2
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "f"
2) "e"
3) "d"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
10、lindex命令
lindex命令返回列表中指定下标的元素,下标从0开始计数,也可以使用负数表示从列表尾部开始的偏移值。如果指定的下标超出了列表的下标范围则返回nil。具体格式如下:
lindex key index
- 1
示例10:
127.0.0.1:6379> lpush mylist a b c d e f
(integer) 6
127.0.0.1:6379> lindex mylist 2
"d"
- 1
- 2
- 3
- 4
11、llen命令
llen命令返回列表的长度,如果指定列表不存在,Redis会将其当做空列表并返回长度0。具体格式如下:
llen key
- 1
示例11:
127.0.0.1:6379> lpush mylist 1 2 3
(integer) 3
127.0.0.1:6379> llen mylist
(integer) 3
- 1
- 2
- 3
- 4
12、linsert命令
linsert是插入命令,它会在列表中查找指定元素,并在该元素之前或之后插入一个元素。如果指定的列表不存在,则不进行任何操作。该命令的返回值为执行插入操作后列表的长度,如果没有找到指定的值,则返回-1。具体格式如下:
linsert key after|before search value
- 1
示例12:
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> rpush mylist a b c d
(integer) 4
127.0.0.1:6379> linsert mylist before b b1
(integer) 5
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b1"
3) "b"
4) "c"
5) "d"
127.0.0.1:6379> linsert mylist before z no
(integer) -1
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
13、rpoplpush命令
rpoplpush命令对两个列表进行原子操作:将列表source的尾部元素拿出来放到dest列表的头部。如果列表source不存在,则返回nil值,并不进行任何操作。具体格式如下:
rpoplpush source dest:
- 1
示例13:
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> rpush mylist1 a b
(integer) 2
127.0.0.1:6379> rpush mylist2 c d
(integer) 2
127.0.0.1:6379> rpoplpush mylist1 mylist2
"b"
127.0.0.1:6379> lrange mylist1 0 -1
1) "a"
127.0.0.1:6379> lrange mylist2 0 -1
1) "b"
2) "c"
3) "d"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
14、lset命令
lset命令用来设置指定下标元素的值。具体格式如下:
lset key index value
1
示例14:
127.0.0.1:6379> rpush mylist a b
(integer) 2
127.0.0.1:6379> lset mylist 0 c
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "c"
2) "b"
除此之外,list的pop操作还有阻塞版本:
blpop key timeout
brpop key timeout
brpoplpush source destination timeout
timeout为等待超时时间,如果timeout为0则一直等待下去
【Redis笔记(四)】 Redis数据结构 - list链表的更多相关文章
- spring boot 自学笔记(四) Redis集成—Jedis
上一篇笔记Reddis集成,操作Redis使用的是RedisTemplate,但实际中还是有一大部分人习惯使用JedisPool和Jedis来操作Redis, 下面使用Jedis集成示例. 修改Red ...
- Redis系列四 Redis常见配置
redis.conf常见配置 参数说明redis.conf 配置项说明如下:1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no2. ...
- redis相关笔记(三.redis设计与实现(笔记))
redis笔记一 redis笔记二 redis笔记三 1.数据结构 1.1.简单动态字符串: 其属性有int len:长度,int free:空闲长度,char[] bur:字符数组(内容) 获取字符 ...
- Redis学习笔记一:数据结构与对象
1. String(SDS) Redis使用自定义的一种字符串结构SDS来作为字符串的表示. 127.0.0.1:6379> set name liushijie OK 在如上操作中,name( ...
- [redis读书笔记] 第一部分 数据结构与对象 对象类型
- 从前面redis的基本数据结构来看,可以看出,redis都是在基本结构(string)的基础上,封装了一层统计的结构(SDS),这样让对基本结构的访问能够更快更准确,提高可控制度. - redis ...
- [redis读书笔记] 第一部分 数据结构与对象 简单动态字符串
本读书笔记主要来自于<<redis设计与实现>> -- 黄键宏(huangz) redis主要设计了字符串,链表,字典,跳跃表,整数集合,压缩列表来做为基本的数据结构,实现键值 ...
- Redis 详解 (四) redis的底层数据结构
目录 1.演示数据类型的实现 2.简单动态字符串 3.链表 4.字典 5.跳跃表 6.整数集合 7.压缩列表 8.总结 上一篇博客我们介绍了 redis的五大数据类型详细用法,但是在 Redis 中, ...
- Redis学习笔记之Redis中5种数据结构的使用场景介绍
原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码.目前目标是吃透 redis 的数据结构.我们都知道,在 redis 中一共有5种数据结构 ...
- 深入理解Redis 数据结构—双链表
在 Redis 数据类型中的列表list,对数据的添加和删除常用的命令有 lpush,rpush,lpop,rpop,其中 l 表示在左侧,r 表示在右侧,可以在左右两侧做添加和删除操作,说明这是一个 ...
随机推荐
- .net 哈希
using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptograph ...
- java高级编程-使用反射强制给private字段赋值
转自:http://blog.csdn.net/yaerfeng/article/details/7103397 今天项目中遇到了一个问题,要调用一个类,并获取这个类的属性进行赋值然后将这个类传递到方 ...
- CapIp.pas
unit CapIp; interface uses Windows, Messages,Classes,winsock,sysutils; const WM_CapIp = WM_USER + ; ...
- solr 最佳实践
管理页面 页面地址:http://{ip}:{port}/solr/#/ 管理页面的data-import页可以手动重建索引,configuration指定了数据源,重建索引也可以通过http请求触发 ...
- sql的一些知识_高级
1.视图 http://www.cnblogs.com/wang666/p/7885934.html 2.存储过程 http://www.cnblogs.com/wang666/p/7920748.h ...
- d3js 获取元素以及设置属性
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- [Android5 系列—] 1. 构建一个简单的用户界面
前言 安卓应用的用户界面是构建在View 和ViewGroup 这两个物件的层级之上的. View 就是一般的UI组件.像button,输入框等. viewGroup 是一些不可见的view的容器,用 ...
- 用算法求N(N>=3)之内素数的个数
首先.我们谈一下素数的定义.什么是素数?除了1和它本身外,不能被其它自然数整除(除0以外)的数 称之为素数(质数):否则称为合数. 依据素数的定义,在解决问题上,一開始我想到的方法是从3到N之间每一个 ...
- nginx使用指南
1.执行nginx 能够执行nginx命令开启nginx: nginx 假设nginx已经开启了,能够执行nginx命令加-s 參数来控制nginx的执行 nginx -s signal signal ...
- caffe训练自己的图片进行分类预测--windows平台
caffe训练自己的图片进行分类预测 标签: caffe预测 2017-03-08 21:17 273人阅读 评论(0) 收藏 举报 分类: caffe之旅(4) 版权声明:本文为博主原创文章,未 ...