四、各类型指令介绍
(三)List类型
1. 基本指令
lpush k1 1 2 3 4
lpush k1 5 6 7 8
# 两边都是闭区间 且 下标支持负数
lrange k1 0 -1
lrange k1 0 7
lrange k1 0 100 # 下标越界的话将尽可能获取
keys *
lpushx key 1 2 3 4 5 # 会检查 key 是否 exists
lpush key 1 2 3
rpush key 0 -1 -2
lrange key 0 -1
rpushx k2 1 2 3
lrange key 0 -1
lpop key
lpop key
lrange key 0 -1
rpop key
rpop key
lrange key 0 -1
rpush key 0 1 2 3 4 5 6 7
lrange key 0 -1
lindex key 3
lindex key -1
lindex key 100
# 找的是第一个出现的基准值
lrange key 0 -1
linsert key before 2 100 # 插入到下标是2的元素之前
lrange key 0 -1
linsert key after 2 100 # 插入到下标是2的元素之后
lrange key 0 -1
# 获取列表长度
llen k1
llen key
# lrem 指定元素删除
# count > 0 从左向右找删除 count 个 element
# count = 0 删除所有的 element
# count < 0 从右向左找删除 count 个 element
lrange key 0 -1
lrem key 2 1 # 删除 前2个 1
lrem key -2 1 # 删除 后2个 1
lrem key 0 2 # 删除所有 2
lrange key 0 -1
# ltrim 保留[start, stop]
rpush key 0 1 2 3 4 5 6 7 8 9 10
ltrim key 2 8 # 保留下标 [2, 8] 的数值
rpush key 0 1 2 3 4 5 6 7 8 9 10
lrange key 0 -1
lset key 5 50 # lindex访问下标越界会返回nil,lset则直接报错
lrange key 0 -1
# blpop brpop阻塞版本的命令
# (1)如果队列为空,尝试出队列,就会产生阻塞。直到队列不空,阻塞解除 √
# 如果队列为满,尝试入队列,也会产生阻塞。直到队列不满,阻塞解除 ×
# (2)但此处 Redis 在阻塞期间(也就说有超时时间)也可以正常处理其他请求
# (3)若有多个key,则会从左向右遍历,哪个列表先弹出就返回哪个
# (4)多个客户端对同一个key执行pop,最先执行命令的客户端会先弹出元素
rpush key 1 2 3 4
blpop key 0
lrange key 0 -1
# A窗口
blpop key 100
# B窗口
rpush key 1 2 3 4
# A窗口立即返回结果
# A窗口
blpop k1 k2 k3 k4 500
# B窗口
lrange k1 0 -1
lrange k2 0 -1
lrange k3 0 -1
lrange k4 0 -1
lpush k1 1 2 3
# A窗口立即返回结果
2. 内部编码
OBJECT encoding key
quicklist
快速列表,相当于是linkedlist
和ziplist
的结合。**quicklist**
还是一个链表,不过链表上的每个节点都是一个压缩列表。使用ziplist
能够把数据按照更紧凑的压缩形式进行表示,能够节省空间,同时再把多个ziplist
通过链式结构连起来又能提升查找效率。那么每个ziplist
的大小是多少呢?这个我们能够在配置文件中查看list-max-ziplist-size
这个参数。