烟台网站设计,英语ppt模板免费下载 素材,免费中文WordPress主题,东平县建设局网站Redis#xff1a;list类型 list命令非阻塞LPUSHLRANGELPUSHXRPUSHRPUSHXLPOPRPOPLINDEXLINSERTLLENLREMLTRIMLSET 阻塞BLPOPBRPOP 内部编码ziplistlinkedlistquicklist 几乎每种语言都有顺序表、数组、链表这样的顺序结构#xff0c;Redis也做出了相应的支持。 如图#xff… Redislist类型 list命令非阻塞LPUSHLRANGELPUSHXRPUSHRPUSHXLPOPRPOPLINDEXLINSERTLLENLREMLTRIMLSET 阻塞BLPOPBRPOP 内部编码ziplistlinkedlistquicklist 几乎每种语言都有顺序表、数组、链表这样的顺序结构Redis也做出了相应的支持。 如图Redis的value值可以是一个列表list其支持头尾的插入删除下标访问等功能。也支持正负数下标正数下标从0开始负数下标从-1开始。 list命令
非阻塞
LPUSH
头插元素到list中如果key不存在就创建
lpush key element [element ...]返回list插入后的长度。如果一开始key不存在就创建一个key。 LRANGE
获取指定范围的list元素
lrange key start stop访问区间为[start, end]的闭区间支持负数下标。
示例
接下来通过lrange测试刚刚的lpush接口 由于lpush是头部插入所以按顺序插入1 2 3 4 5最后存储顺序为5 4 3 2 1。
如果在Redis中数组越界Redis不会报错而是尽可能输出范围内存在的数据。 第一次查询0 - 100但是list中只有0 - 4那么此时把0 - 4全部输出。第二次查询50 -60list内没用这部分数据但是它不报错而是输出empty表示空。 LPUSHX
当key存在头插元素到list中
lpushx key element [element ...]返回插入后list中元素的个数。
示例 第一次插入list1由于已经存在此时插入成功返回9表示当前有九个元素。第二次插入了一个不存在的list2但是它不存在返回0表示插入后一个元素也没有也就是插入失败。 RPUSH
尾插元素到list中如果key不存在就创建
rpush key element [element ...]返回插入后list元素个数。
示例 同样插入1 2 3 4 5顺序与之前lpush插入刚好是反着的因为rpush是尾插。
此处list有一个命名上的注意点
lpushleft push从左侧插入即头插rpushright push从右侧插入即尾插lrangelist range输出列表指定范围
同样是l开头有时候表示list有时候表示left这个要注意。
另外的
lpushxleft push exists存在时插入
此处的x是选用了exsis中的一个字母表示只有key存在才插入。 RPUSHX
当key存在尾插元素到list中
rpushx key element [element ...]返回插入后list中元素的个数。 LPOP
头删list元素
lpop key [count]返回被删除的头部count个元素如果list为空没有可以删的元素了返回nil。
示例 先创建一个1 2 3 4 5的列表第一次lpop不带任何参数只输出一个头部元素。第二次带参数4此时输出剩余的四个元素。最后一次lpop由于已经没有元素了返回nil。 RPOP
尾删list元素
rpop key [count]返回被删除的尾部count个元素如果list为空没有可以删的元素了返回nil。 LINDEX
获取指定下标的元素
lindex key index返回指定下标的元素支持负数下标。
示例 LINSERT
在指定位置插入元素
linsert key before|after pivot element在元素pivot的前面或者后面插入element元素。
示例 此处指令的作用是在元素c前面插入hello。
如果有多个pivot元素那么只在第一个元素的位置插入。 LLEN
获取list的长度
llen key返回list长度如果不存在则返回0。 LREM
删除元素
lrem key count element删除count个element元素。
此处count的取值有三种
count 0从左往右删除count 0从右往左删除count 0删除所有元素
示例 此处插入了1 2 3 hello循环四次删除3 hello即从左往右删除三个hello每次出只有最后一个hello被保留。 如果传入-3 hello此时从右往左删除只有第一个hello被保留。 LTRIM
指定范围内元素保留剩余的元素删除
ltrim key start stop只保留[start, stop]闭区间内部的元素其余的元素全部删除。
示例 LSET
修改指定下标的元素
lset key index element将下标为index的元素改为element支持负数下标。如果下标越界会返回一个报错。
示例 第一次修改将下标为3的元素修改为666。第二次插入操作下标为100的元素由于不存在报错了。 阻塞
先前的所有的命令都是非阻塞的直接操作就可以得到结果而list还提供了一些阻塞性质的命令。
在多线程中有一个生产消费模型其可以基于阻塞队列实现主要满足以下两个性质
如果阻塞队列满了那么生产者阻塞如果阻塞队列空了那么消费者阻塞
在Redis中list只考虑队列为空的情况也就是消费者。用户读取数据时队列为空那么用户陷入阻塞直到队列有数据。
BLPOP
读取并删除list头部元素如果没有元素则陷入阻塞
blpop key [key ...] timeoutblpop可以同时指定多个key也就是多个list只要任何一个list有数据就返回结果。还可以设置超时时间timeout以秒为单位如果超过时间了返回nil。
如果超时时间设置为0则一直阻塞不会超时。
另外的此处的阻塞不是Redis阻塞而是客户端阻塞。如果阻塞Redis将指令放到后台去等待自己去执行其他指令。
示例 此处list8有元素而list9为空返回了list8的元素。此时会同时返回两个内容list8表示该数据是从哪一个列表中拿到的3则是拿到的数据。 此处启用了两个客户端左侧客户端blpop一个空列表等待20s随后陷入阻塞。接着右侧客户端插入一个元素到list9随后左侧客户端立刻拿到数据并输出并且输出了自己的阻塞市场18.15s。 BRPOP
读取并删除list尾部元素如果没有元素则陷入阻塞
brpop key [key ...] timeout总结
操作类型命令添加rpush、lpush、insert查找lrange、lindex、llen删除lpop、rpop、lrem、ltrim修改lset阻塞blpop、brpop 内部编码
ziplist
压缩列表是一种内存紧凑的存储方式适合存储数量较少且元素较小的列表。具体来说当list类型的元素个数小于 list-max-ziplist-entries 默认 512 个并且所有值的长度都小于 list-max-ziplist-value 默认 64 字节时Redis 会使用 ziplist 作为列表的内部实现。
这些配置在/etc/redis/redis.conf内修改。
优点
内存节省 ziplist 使用连续的内存块来存储数据这种紧凑的存储方式可以有效地减少内存碎片和开销。结构简单适合小规模数据尤其是在内存资源有限的情况下。
缺点
操作效率随着数据量的增加ziplist 的读写效率会下降。尤其是在需要频繁更新的场景中ziplist 的线性查找特性使得操作复杂度较高。扩展性差不适合大规模数据存储。 linkedlist
当列表类型无法满足ziplist的条件时会使用linkedlist链表作为list的内部实现。这就是一个基本的双向链表。
优点
头尾的插入删除非常高效
缺点
中间部分的插入删除时间复杂度较高 quicklist
linkedlist 与 ziplist 编码在 Redis 4.0 版本之后不再是默认的列表编码方式因为引入了更高效的 quicklist 编码它是基于压缩列表和双向链表的组合旨在结合两者的优点。
对于quicklist其外层列表依然是linkedlist双链表结构但是每一个链表节点都是一个quicklist对于中间部分的节点会进行一定程度的压缩提高效率。