网站建设总体说明自己建个网站需要什么
网站建设总体说明,自己建个网站需要什么,卡盟网站建设,90设计网官网 登录文章目录 一、List 类型介绍二、List 类型相关命令2.1 LPUSH 和 RPUSH、LPUSHX 和 RPUSHX2.2 LPOP 和 RPOP、BLPOP 和 BRPOP2.3 LRANGE、LINDEX、LINSERT、LLEN2.4 列表相关命令总结 三、List 类型内部编码3.1 压缩列表#xff08;ziplist#xff09;3.2 链表#xff08;lin… 文章目录 一、List 类型介绍二、List 类型相关命令2.1 LPUSH 和 RPUSH、LPUSHX 和 RPUSHX2.2 LPOP 和 RPOP、BLPOP 和 BRPOP2.3 LRANGE、LINDEX、LINSERT、LLEN2.4 列表相关命令总结 三、List 类型内部编码3.1 压缩列表ziplist3.2 链表linkedlist 四、List 类型的应用场景4.1 消息队列4.2 微博列表 一、List 类型介绍
list 列表类型是用来存储多个有序的字符串列表中的每个字符串称为元素element一个列表最多可以存储 2^32 - 1 个元素。在 Redis 中可以对列表两端插人push和弹出pop还可以获取指定范围的元素列表、获取指定索引下标的元素等。列表是⼀种比较灵活的数据结构它可以充当栈和队列的角色在实际开发上有很多应用场景。
列表两端插入和弹出操作 列表的获取、删除等操作 列表类型的特点
列表中的元素是有序的这意味着可以通过索引下标获取某个元素或者某个范围的元素列表区分获取和删除的区别例上图 中的 lrem 1 b 是从列表中把从左数遇到的前 1 个 b 元素删除这个操作会导致列表的长度从 5 变成 4但是执行 lindex 4 只会获取元素但列表长度不会变化。列表中的元素是允许重复的例如下图中的列表中是包含了两个 a 元素的。
二、List 类型相关命令
2.1 LPUSH 和 RPUSH、LPUSHX 和 RPUSHX
LPUSH 和 RPUSH
LPUSH 命令的作用是将一个或多个元素从左侧头插插入到 list 中而 RPUSH 命令的作用则是将一个或多个元素从右侧尾插插入到 list 中。
语法
LPUSH key element [element ...]RPUSH key element [element ...]LPUSHX 和 RPUSHX
LPUSHX 命令的作用是当 key 存在时将⼀个或者多个元素从左侧放⼊头插到 list 中不存在则直接返回而 RPUSHX 命令的作用是是当 key 存在时将⼀个或者多个元素从右侧放⼊头插到 list 中不存在则直接返回。
语法
LPUSHX key element [element ...]RPUSHX key element [element ...]2.2 LPOP 和 RPOP、BLPOP 和 BRPOP
LPOP 和 RPOP
LPOP 命令的作用是从左侧删除一个元素头删并返回删除的值而 RPOP 则是从右侧删除尾删然后返回删除的值。
语法
LPOP keyRPOP keyBLPOP 和 BRPOP
BLPOP 和 BRPOP 命令的作用和LPOP 、 RPOP 一样只是需要指定一个超时时间如果没有元素可以删除的时候会进行阻塞如果在设定的超时时间内向 Redis 中插入元素则会立即执行否则超时则之间退出。
语法
BLPOP key [key ...] timeoutBRPOP key [key ...] timeout另外BLPOP 和 BRPOP 可以同时指定多个 key 进行删除。
2.3 LRANGE、LINDEX、LINSERT、LLEN
LRANGE LRANGE命令的作用是获取从 start 到 stop 区间的所有元素区间左闭右闭并且指定的位置可以是负数表示倒数第几个。
语法
LRANGE key start stopLINDEX
LINDEX 命令的作用是获取从左边开始第 index 位置的元素。
语法
LINDEX key indexLINSERT
LINSERT 命令的作用是在特定的位置插入元素。
语法
LINSERT key BEFORE|AFTER pivot element说明
BEFORE 表示插入到 pivot 元素之前AFTER 表示插入到 pivot 元素之后。
LLEN
LLEN 命令的作用是 获取 list 长度。
语法
LLEN key2.4 列表相关命令总结
以下是关于 Redis List 相关命令的总结包括命令、作用以及时间复杂度
命令作用时间复杂度LPUSH从列表左侧插入一个或多个元素O(N) N 为插入元素数量RPUSH从列表右侧插入一个或多个元素O(N) N 为插入元素数量LPUSHX如果列表存在从左侧插入一个或多个元素否则不执行操作O(1)RPUSHX如果列表存在从右侧插入一个或多个元素否则不执行操作O(1)LPOP从列表左侧删除并返回一个元素O(1)RPOP从列表右侧删除并返回一个元素O(1)BLPOP从左侧删除并返回元素如果列表为空则阻塞带有超时参数O(1) 或阻塞等待BRPOP从右侧删除并返回元素如果列表为空则阻塞带有超时参数O(1) 或阻塞等待LRANGE获取指定范围内的元素列表O(Slice Size)LINDEX获取指定位置的元素O(N) N 为索引位置LINSERT在指定元素前或后插入新元素O(N) N 为列表长度LLEN获取列表的长度O(1)
注意时间复杂度中的 “N” 表示操作的复杂度与列表的长度或插入元素的数量成线性关系而不是固定的常数时间。在实际使用中需要根据数据规模和性能要求选择适当的命令。
三、List 类型内部编码
Redis 中的 List 数据类型在内部可以使用不同的编码方式来存储数据具体的编码方式取决于列表的大小和元素的大小。下面将介绍两种常见的 List 内部编码方式
3.1 压缩列表ziplist
压缩列表ziplist是 Redis 中一种紧凑的、内存优化的列表编码方式适用于存储较小的列表或者列表中的元素都是较小的整数或字符串。压缩列表以连续的内存块的形式存储数据每个节点可以包含一个或多个元素这使得压缩列表在内存使用效率上有一定优势。
特点
压缩列表可以保存多个元素在一个节点中因此在元素较小的情况下它可以节省内存。压缩列表支持快速的元素访问因为可以通过索引直接访问元素。压缩列表适用于列表较小且元素较小的情况。
3.2 链表linkedlist
链表linkedlist是 Redis 中另一种列表的内部编码方式它更适合存储大型列表或者元素大小不一致的列表。链表中的每个节点包含一个元素以及指向前一个节点和后一个节点的指针这种结构使得链表在插入和删除元素时具有较高的效率。
特点
链表适用于列表较大或元素较大的情况因为它不需要连续的内存块可以更好地处理大型数据。链表对于插入和删除元素的操作更加高效因为只需要调整节点的指针而不需要移动大量数据。链表相对于压缩列表占用更多的内存因为需要额外的指针来维护节点之间的链接。
总之Redis 根据列表的大小和元素的大小自动选择使用压缩列表或链表来进行编码以平衡内存使用和操作效率。在选择数据结构和命令时需要考虑数据的规模和操作的性能需求。
示例
1当元素个数较少且没有大元素时内部编码为 ziplist
127.0.0.1:6379 rpush listkey e1 e2 e3
OK
127.0.0.1:6379 object encoding listkey
ziplist2当元素个数超过 512 时内部编码为 linkedlist
127.0.0.1:6379 rpush listkey e1 e2 e3 ... 省略 e512 e513
OK
127.0.0.1:6379 object encoding listkey
linkedlist3当某个元素的长度超过 64 字节时内部编码为 linkedlist
127.0.0.1:6379 rpush listkey one string is bigger than 64 bytes ... 省略 ...
OK
127.0.0.1:6379 object encoding listkey
linkedlist四、List 类型的应用场景
4.1 消息队列
Redis 可以使用 lpush brpop 命令组合实现经典的阻塞式生产者-消费者模型队列生产者客户端使用 lpush 从列表左侧插入元素多个消费者客户端使用 brpop命令阻塞式地从队列中 “争抢” 队首元素。通过多个客户端来保证消费的负载均衡和高可用性。
Redis 阻塞消息队列模型 分频道的消息队列
Redis 可以同样使用 lpush brpop 命令但通过不同的键模拟频道的概念不同的消费者可以通过 brpop 不同的键值实现订阅不同频道的理念。 4.2 微博列表
每个用户都有属于自己的微博列表 现需要分页展示文章列表。此时可以考虑使用列表类型因为列表不但是有序的同时支持按照索引范围获取元素。
1每篇微博使用哈希结构存储例如微博中 3 个属性title、timestamp、content
hmset mblog:1 title xx timestamp 1476536196 content xxxxx
...
hmset mblog:n title xx timestamp 1476536196 content xxxxx2向用户 的微博列表中添加微博使用 user:uid:mblogs 作为微博的键
lpush user:1:mblogs mblog:1 mblog:3
...
lpush user:k:mblogs mblog:93分页获取用户的微博列表例如获取用户1 的前 10 篇微博
keylist lrange user:1:mblogs 0 9
for key in keylist {hgetall key
}此外此方案在实际中可能存在两个问题
1 n 问题。即如果每次分页获取的微博个数较多需要执行多次 hgetall 操作此时可以考虑使用 pipeline流水线模式批量提交命令或者微博不采用哈希类型而是使用序列化的字符串类型使用 mget 获取。分页获取文章时lrange 在列表两端表现较好获取列表中间的元素表现较差此时可以考虑将列表做拆分。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/88786.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!