Redis 五种常见的数据结构:List

要说清楚列表数据类型,最好先讲一点儿理论背景,在信息技术界List这个词常常被使用不当。例如”Python Lists”就名不副实(名为Linked Lists),但他们实际上是数组(同样的数据类型在Ruby中叫数组)

一般意义上讲,列表就是有序元素的序列:10,20,1,2,3就是一个列表。但用数组实现的List和用Linked
List实现的List,在属性方面大不相同。 Redis lists基于Linked Lists实现。这意味着即使在一个list中有数百万个元素,在头部或尾部添加一个元素的操作,其时间复杂度也是常数级别的。用LPUSH命令在十个元素的list头部添加新元素,和在千万元素list头部添加新元素的速度相同。

那么,坏消息是什么?在数组实现的list中利用索引访问元素的速度极快,而同样的操作在linked list实现的list上没有那么快。

Redis Lists用linkedlist实现的原因是:对于数据库系统来说,至关重要的特性是:能非常快的在很大的列表上添加元素。另一个重要因素是,正如你将要看到的:Redis lists能在常数时间取得常数长度。

上面的一段话来自:redis 中文网 对于list的介绍,从中我们知道了list 的实现方式是 Linked Lists。

List 数据结构

Redis列表是简单的字符串列表,按照插入顺序排序。 你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

LPUSH 命令插入一个新元素到列表头部,而RPUSH命令 插入一个新元素到列表的尾部。当 对一个空key执行其中某个命令时,将会创建一个新表。 类似的,如果一个操作要清空列表,那么key会从对应的key空间删除。这是个非常便利的语义, 因为如果使用一个不存在的key作为参数,所有的列表命令都会像在对一个空表操作一样。

一些列表操作及其结果:

127.0.0.1:6379> rpush mylist A B C
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "A"
2) "B"
3) "C"
127.0.0.1:6379> lpush mylist first
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "first"
2) "A"
3) "B"
4) "C"

注意:LRANGE 带有两个索引,一定范围的第一个和最后一个元素。这两个索引都可以为负来告知Redis从尾部开始计数,因此-1表示最后一个元素,-2表示list中的倒数第二个元素,以此类推。也可以理解:从 左边数是 0 开头,从右边数是-1开头。

List 常用命令

命令描述
RPUSH key value [value …]向存于 key 的列表的尾部插入所有指定的值
LPUSH key value [value …]向存于 key 的列表的头部插入所有指定的值
127.0.0.1:6379> rpush mylist A B C
(integer) 3
127.0.0.1:6379> lpush mylist first
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "first"
2) "A"
3) "B"
4) "C"
命令描述
LINSERT key BEFORE & AFTER pivot value把 value 插入存于 key 的列表中在基准值 pivot 的前面或后面。
127.0.0.1:6379> linsert mylist before A "A before"
(integer) 5
127.0.0.1:6379> lrange mylist 0 -1
1) "first"
2) "A before"
3) "A"
4) "B"
5) "C"
127.0.0.1:6379> linsert mylist after A "A after"
(integer) 6
127.0.0.1:6379> lrange mylist 0 -1
1) "first"
2) "A before"
3) "A"
4) "A after"
5) "B"
6) "C"
命令描述
LPOP key移除并且返回 key 对应的 list 的第一个元素。
RPOP key移除并返回存于 key 的 list 的最后一个元素。
LREM key count value从存于 key 的列表里移除前 count 次出现的值为 value 的元素。

注:这个 count 参数通过下面几种方式影响这个操作:
count > 0: 从头往尾移除值为 value 的元素。
count < 0: 从尾往头移除值为 value 的元素。
count = 0: 移除所有值为 value 的元素。
比如, LREM list -2 “hello” 会从存于 list 的列表里移除最后两个出现的 “hello”。

127.0.0.1:6379> lpop mylist
"first"
127.0.0.1:6379> rpop mylist
"C"
127.0.0.1:6379> lrange mylist 0 -1
1) "A before"
2) "A"
3) "A after"
4) "B"
127.0.0.1:6379> rpush mylist A B B C D E A C C
(integer) 9
127.0.0.1:6379> lrem mylist 1 B
(integer) 1
127.0.0.1:6379> lrange mylist 0 -1
1) "A"
2) "B"
3) "C"
4) "D"
5) "E"
6) "A"
7) "C"
8) "C"
127.0.0.1:6379> lrem mylist -1 A
(integer) 1
127.0.0.1:6379> lrange mylist 0 -1
1) "A"
2) "B"
3) "C"
4) "D"
5) "E"
6) "C"
7) "C"
127.0.0.1:6379> lrem mylist 0 C
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "A"
2) "B"
3) "D"
4) "E"

从上面的演示中可以看出,当count 不等于 0 的是后,只会匹配一个元素进行删除。当 count 等于 0 的时候,会把所有相同的元素进行删除。

命令描述
LTRIM key start stop修剪(trim)一个已存在的 list,这样 list 就会只包含指定范围的指定元素。

注:start 和 stop 都是由0开始计数的, 这里的 0 是列表里的第一个元素(表头),1 是第二个元素,以此类推。

例如: LTRIM foobar 0 2 将会对存储在 foobar 的列表进行修剪,只保留列表里的前3个元素。

127.0.0.1:6379> lrange mylist 0 -1
1) "A"
2) "B"
3) "D"
4) "E"
127.0.0.1:6379> ltrim mylist 0 2
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "A"
2) "B"
3) "D"

mylist 中的 E 元素被删掉了。

命令描述
LRANGE key start stop返回存储在 key 的列表里指定范围内的元素。

注:start 和 end 偏移量都是基于0的下标,即list的第一个元素下标是0(list的表头),第二个元素下标是1,以此类推。

偏移量也可以是负数,表示偏移量是从list尾部开始计数。 例如, -1 表示列表的最后一个元素,-2 是倒数第二个,以此类推。

注:这里偏移量是包头包尾的。不像java是包头不包尾,这点需要注意。

127.0.0.1:6379> lrange mylist 0 -1
1) "A"
2) "B"
3) "D"

start 为 0,end 为 -1 ,则为显示mylist 中从头到尾的数据。

命令描述
LINDEX key index返回列表里的元素的索引 index 存储在 key 里面

注:下标是从 0 开始的

127.0.0.1:6379> lrange mylist 0 -1
1) "A"
2) "B"
3) "D"
127.0.0.1:6379> lindex mylist 1
"B"
命令描述
LLEN key返回存储在 key 里的list的长度
127.0.0.1:6379> llen mylist
(integer) 3
命令描述
LSET key index value设置 index 位置的list元素的值为 value
127.0.0.1:6379> lset mylist 2 "B set update "
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "A"
2) "B"
3) "B set update "
命令描述
BLPOP key [key …] timeoutBLPOP 是阻塞式列表的弹出原语
BRPOP key [key …] timeoutBRPOP 是阻塞式列表的弹出原语
127.0.0.1:6379> rpush mylist a b c
(integer) 3
127.0.0.1:6379> brpop mylist list 0
1) "mylist"
2) "c"
127.0.0.1:6379> brpop mylist list 20
1) "mylist"
2) "b"

List 还有很多其他的命令,大家可以看下这个链接:
List 命令大全

之前准备学习的时候写博客,可是都没有坚持下去,希望这次可以有始有终。
Redis 坚持第一天 :为什么要使用 redis ?
Redis 坚持第二天 :Redis 的安装与启动
Redis 坚持第三天 :Redis 使用配置文件启动,常见配置学习。
Redis 坚持第四天 :

  1. Redis 五种常见的数据结构:String
  2. Redis 五种常见的数据结构:Hash
  3. Redis 五种常见的数据结构:List
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java小小星星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值