redis(6):数据结构-List列表类型

如果要将redis中文章进行分页展示到前端,但是中间有可能有的文章已经删除,若用hash存储,则需要判断改文章是否存在。现在继续看redis的第三种数据结构list,可以完全规避上面问题;


一、介绍

在这里插入图片描述
Redis将列表数据结构命名为list而不是array,是因为列表的存储结构用的是链表而不是数组,而且链表还是双向链表。因为它是链表,所以随机定位性能较弱,首尾插入删除性能较优。如果list的列表长度很长,使用时我们一定要关注链表相关操作的时间复杂度。

这种特性使列表类型能非常快速地完成关系数据库难以应付的场景:如社交网站的新鲜事,我们关心的只是最新的内容,使用列表类型存储,即使新鲜事的总数达到几千万个,获 取其中最新的100条数据也是极快的。同样因为在两端插入记录的时间复杂度是O(1),列表类型也适合用来记录日志,可以保证加入新日志的速度不会受到已有日志数量的影响。 借助列表类型,Redis还可以作为队列使用.

与散列类型键最多能容纳的字段数量相同,一个列表类型键最多能容纳2的32次方−1个元素。


二、命令

1.向列表两端增加元素

LPUSH key value [value …]
RPUSH key value [value …] 

LPUSH命令用来向列表左边增加元素,返回值表示增加元素后列表的长度。
redis> LPUSH numbers 1
(integer) 1
在这里插入图片描述

LPUSH命令还支持同时增加多个元素,例如:
redis> LPUSH numbers 2 3
(integer) 3

在这里插入图片描述

2.从两端弹出元素

LPOP key  从列表左边弹出第一个(1将列表左边元素移除,2返回被移除的元素值)
RPOP key 从列表右侧弹出第一个

3.获取列表中元素个数

LLEN numbers 类似SQL中count

4.获得列表片段

LRANGE key start stop 从key列表中获取下标从start到stop的元素(包含两端,下标从零开始)

5.删除指定的值

LREM key count value

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

  1. 当 count > 0时 LREM 命令会从列表左边开始删除前 count 个值为 value的元素。
  2. 当 count < 0时 LREM 命令会从列表右边开始删除前|count|个值为 value 的元素。
  3. 当 count = 0是 LREM命令会删除所有值为 value的元素。

三、实践

1.存储文章ID列表

设计key=posts:list记录文章ID列表,发布新文章时候lpush即可加入,删除文章lrem posts:list 1 即可;
注意:如果文章过多,要修改中间文章,性能较差(链表中找到中间元素性能慢)

2.存储评论列表

读取评论时需要获得评论的全部数据(评论者姓名,联系方式,评 论时间和评论内容),不像文章一样有时只需要文章标题而不需要文章正文。所以适合将一 条评论的各个元素序列化成字符串后作为列表类型键中的元素来存储。
我们使用列表类型键 post:文章ID:comments来存储某个文章的所有评论。发布评论的伪 代码如下(以ID为42的文章为例):

//将评论序列化成字符串 
$serializedComment = serialize($author, $email, $time, $content) 
LPUSH post:42:comments, $serializedComment 

读取评论时同样使用LRANGE命令即可


四、命令拾遗

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

LINDEX key index 
LSET key index value

如果要将列表类型当作数组来用,LINDEX命令是必不可少的。LINDEX命令用来返回 指定索引的元素,索引从0开始

2.只保留列表指定片段

LTRIM key start end 

LTRIM 命令可以删除指定索引范围之外的所有元素,其指定列表范围的方法和LRANGE 命令相同。
LTRIM命令常和LPUSH命令一起使用来限制列表中元素的数量,比如记录日志时我们希 望只保留最近的100条日志,则每次加入新元素时调用一次LTRIM命令即可;

3.向列表中插入元素

LINSERT key BEFORE|AFTER pivot value 

LINSERT 命令首先会在列表中从左到右查找值为 pivot 的元素,然后根据第二个参数是 BEFORE还是AFTER来决定将value插入到该元素的前面还是后面。 LINSERT命令的返回值是插入后列表的元素个数;

4.将元素从一个列表转到另一个列表

 RPOPLPUSH source destination 

RPOPLPUSH是个很有意思的命令,从名字就可以看出它的功能:先执行RPOP命令再 执行LPUSH命令
RPOPLPUSH命令会先从source列表类型键的右边弹出一个元素,然后将 其加入到destination列表类型键的左边,并返回这个元素的值,整个``过程是原子的。其具体实 现可以表示为伪代码:

def rpoplpush ($source, $destination) 
	$value = RPOP $source 
	LPUSH $destination, $value 
	return $value 

当把列表类型作为队列使用时,RPOPLPUSH 命令可以很直观地在多个队列中传递数据
当source和destination相同时,RPOPLPUSH命令会不断地将队尾的元素移到队首,借助 这个特性我们可以实现一个网站监控系统:使用一个队列存储需要监控的网址,然后监控程序不断地使用 RPOPLPUSH 命令循环取出一个网址来测试可用性。这里使用RPOPLPUSH命令的好处在于在程序执行过程中仍然可以不断地向网址列表中加入新网址,而且整个系统容易扩展,允许多个客户端同时处理队列。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页