您的位置:首页 > 数据库 > Redis

redis之列表类型

2016-05-29 09:50 513 查看
列表类型类似我们java里面的双向链表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。

因为内部是使用双向链表来实现的,所以向列表两端添加元素的时间复杂度为O(1),获取越接近两端的元素速度就越快。就算你有千万级别的数据列表,我们获取头部和尾部的10条记录也是极快的。

当然链表也有可能会访问比较慢,如果我们使用索引访问的方式访问中间部分这样是及其的慢的。一般来说我们插入的时候比较快速度是O(1),所以适合用来记录日志,可以保证加入新日志的速度不会受到已有日志数量的影响。

借助列表类型,redis可以作为队列使用。

基本命令

lpush key value [value ...]
rpush key value [value ...]


测试如下:

127.0.0.1:6379> lpush mylist 1
(integer) 1
127.0.0.1:6379> lpush mylist 2 3
(integer) 3
加入完成之后就变成了 3 2 1 ,上面我们采用的是往左边加的方式。我们下面往右边加的方式会使用rpush命令,其用法和lpush类似:
127.0.0.1:6379> rpush mylist 0 -1
(integer) 5
接下来列表就变成 3 2 1 0 -1


上面演示了添加元素接下来看看如何弹出元素:

lpop key
rpop key


演示如下:

127.0.0.1:6379> lpop mylist
"3"
127.0.0.1:6379> rpop mylist
"-1"


上面展示了从左边和右边分别弹出一个元素。

我们也可以使用LLEN这个命令来查看长度。

127.0.0.1:6379> LLEN mylist
(integer) 3


如何获取列表段的值

lrange key start stop


我们利用lrange能够获得列表中的某以片段。lrange命令将返回索引从start和stop之间的所有元素。在redis中索引是从0开始,-1代表从右边的第一位也就是从左开始的倒数第一位。如果索引超过最大的就会返回最右边的第一个。

127.0.0.1:6379> lrange mylist 0 -1
1) "2"
2) "1"
3) "0"
127.0.0.1:6379> lrange mylist 0 1
1) "2"
2) "1"
127.0.0.1:6379> lrange mylist -2 -1
1) "1"
2) "0"
127.0.0.1:6379> lrange mylist 1 999
1) "1"
2) "0"


删除列表中指定的值

lrem key count value


lrem命令会删除列表中前count个值为value的元素,返回值是实际删除的元素个数。根据count值的不同,lrem命令的执行方式会略有差异。

1.当count>0时lrem命令会从列表左边开始删除钱count个值为value的元素。

2.当count<0时lrem命令会从列表右边开始删除前count的绝对值值为value的元素

3.当count=0就删除所有的值为value的元素。

127.0.0.1:6379> rpush mylist 2
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "2"
2) "1"
3) "0"
4) "2"
127.0.0.1:6379> lrem mylist -1 2
(integer) 1
127.0.0.1:6379> lrange mylist 0 -1
1) "2"
2) "1"
3) "0"


扩展命令

1.获得/设置指定索引的元素值

lindex key index
lset key index value


lindex命令用来获取指定索引的元素,索引从0开始,时间复杂度是O(n)。

127.0.0.1:6379> lindex mylist 0
"2"
127.0.0.1:6379> lindex mylist -1
"0"
127.0.0.1:6379> lset mylist 1 8
OK
127.0.0.1:6379> lindex mylist 1
"8"


2.只保留列表指定片段

ltrim key start end


作用是保留start-end之间的元数删除其它所有元素。

127.0.0.1:6379> lrange mylist 0 -1
1) "2"
2) "8"
3) "0"
127.0.0.1:6379> rpush mylist 4
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "2"
2) "8"
3) "0"
4) "4"
127.0.0.1:6379> ltrim mylist 1 2
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "8"
2) "0"


3.向列表中插入元素

linsert key before|after pivot value


这是一个比较有意思的插入命令它可以从列表中从左往右查找到pivot的元素,然后判断是以before还是after来决定将value插入到该元素的前面还是后面。

127.0.0.1:6379> lrange mylist 0 -1
1) "8"
2) "0"
127.0.0.1:6379> linsert mylist before 0 7
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "8"
2) "7"
3) "0"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  redis