3.4列表类型
3.4.1介绍
列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者
获得列表的某一片段.
优点:内部使用的是双向链表,所以向列表两端添加元素的时间复杂度为O(1),获取
越接近两端的元素速度越快.
- 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别
指向直接后继和直接前驱 - 时间复杂度是同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法
乃至程序的效率。O(1)为常数阶.
缺点:通过索引访问元素比较慢
所以列表适合的应用于:
1. 社交网站的新鲜事
2. 记录日志
- 和散列类型键相同,最多能容纳232-1个元素
3.4.2命令
- 向列表两端增加元素
lpush key value [value...]
向列表左边增加元素
rpush key value [value...]
向列表右边增加元素 - 从列表两端弹出元素
lpop key
将列表左边的元素从列表中移除,并返回移除的元素值
rpop key
将列表左边的元素从列表中移除,并返回移除的元素值 - 获取列表中的元素个数
llen key
- 当键不存在时会返回0
- 获取列表片段
lrange key start stop
- redis获取列表片段方法:
- 所以从0开始,也支持负索引,表示从右边开始计算序数
- start的索引位置比stop的索引位置靠后,返回空列表
- 如果stop大于实际索引范围,则会返回到列表最右边的元素
- 片段包含stop元素(该处和python不同)
- redis获取列表片段方法:
- 删除列表中指定的值
lrem key count value
删除列表中前count个值为value的元素,返回值是实际删除的元素个数.- count>0,lrem命令从左边开始删除
count<0,lrem命令从右边开始删除
count=0,lrem删除所有值为value的元素
- count>0,lrem命令从左边开始删除
127.0.0.1:6379> lpush num 0 1 2 3
4
127.0.0.1:6379> rpush num -4 -5 -6
7
127.0.0.1:6379> lpop num
3
127.0.0.1:6379> rpop num
-6
127.0.0.1:6379> llen num
5
127.0.0.1:6379> lrange num 0 -1
2
1
0
-4
-5
127.0.0.1:6379> lpush num -4 2 0
8
127.0.0.1:6379> lrange num 0 -1
0
2
-4
2
1
0
-4
-5
127.0.0.1:6379> lrem num 1 2
1
127.0.0.1:6379> lrem num -1 5
0
127.0.0.1:6379> lrem num 0 -4
2
127.0.0.1:6379> lrange num 0 -1
0
2
1
0
-5
3.4.3实践
- 存储文章ID列表
我们使用列表型键posts:list记录文章ID列表.当发布新文章使用lpush命令
把新文章的ID加入到这个列表中,删除文章时也要把列表中文章ID删除
有了文章ID,可以使用lrange实现文章的分页,伪代码:
该方法缺陷:$postsPerPage = 10 $start = ($currentPage-1) * $postsPerPage $end = $currentPage * $postsPerPage -1 $postsID = lrange posts:list,$start,$end # 获得了此页需要显示的文章ID,我们通过循环的方式读取文章 for each $id in $postsID: $post = hgetall post:$id print 文章标题: $post.title
1. 文章的发布时间不易修改
2. 当文章数量较多时访问中间的页面性能较差 - 存储评论列表
使用列表型键post:文章ID:comments来存储某个文章的所有评论,伪代码:# 将评论序列化字符串 $serializedComment = serialize($author,$email,$time,$content) lpush post:42:comments,$serializedComment
3.4.4命令拾遗
- 获得/设置指定索引的元素值
lindex key index
lset key index value
127.0.0.1:6379> rpush 诗人 李白 杜甫 白居易 3 127.0.0.1:6379> lindex 诗人 2 白居易 127.0.0.1:6379> lset 诗人 2 王维 OK 127.0.0.1:6379> lrange 诗人 0 -1 李白 杜甫 王维
- 只保留列表指定片段
ltrim key start end
127.0.0.1:6379> ltrim 诗人 0 1 OK 127.0.0.1:6379> lrange 诗人 0 -1 李白 杜甫
- 可应用于日志,只保留最近100条
- 向列表中插入元素
linsert key befor pivot value
向pivot前追加元素,返回值为列表长度
linsert key after pivot value
向pivot后追加元素,返回值为列表长度127.0.0.1:6379> linsert 诗人 before 李白 曹操 3 127.0.0.1:6379> linsert 诗人 after 杜甫 杜牧 4 127.0.0.1:6379> lrange 诗人 0 -1 曹操 李白 杜甫 杜牧
- 将元素从一个表转到另一个表
rpoplpush source destination
- 先执行rpop再执行lpush