Redis开发与运维读书笔记之6
Redis开发与运维读书笔记之六
第2章 API的理解和使用 第4部分
列表List
List用来存储多个有序的字符串。列表中每个字符串称为元素element.
一个List最多可以存储2^32 - 1个元素。
可以在List两端插入push或弹出pop
List可以充当栈和队列的角色
List的特点:
命令
[list]添加
从右边添加Element
从左到右列出List的所有Element
从左边添加Element
向某个Element前或后插入Element
pivot为指定的某个元素
查找
指定范围内的Element List
索引下标从左到右为从0到N-1,从右到左是-1到-N,end包含了自身
获取List指定索引下标的Element
获取List长度
删除
从List左侧pop Element
从List右侧pop Element
删除指定Element
从List中找到值为value的element删除,根据count不同分为三种情况
按照索引范围修剪List
修改
修改指定索引下标的element
阻塞
timeout的单位为秒
如果使用brpop时:
[/list]
内部编码
使用场景
注意:如果每次分页获取文章个数较多,使用hgetall效率较低,可以考虑使用pipeline批量获取,或者将文章数据序列化,使用mget批量获取。
lrange在List两端性能较好,List中间性能较差,可以考虑使用Redis3.2的quicklist内部编码实现,效率较高。
[/list]
第2章 API的理解和使用 第4部分
列表List
List用来存储多个有序的字符串。列表中每个字符串称为元素element.
一个List最多可以存储2^32 - 1个元素。
可以在List两端插入push或弹出pop
List可以充当栈和队列的角色
List的特点:
- List中的Element是有序的,可以通过索引下标获取某个Element或某个范围内的Element List
- List中的Element是可以重复的
命令
[list]
rpush key value [value ...]
从左到右列出List的所有Element
lrange listkey 0 -l
从左边添加Element
lpush key value [value ...]
向某个Element前或后插入Element
linsert key before|after pivot value
pivot为指定的某个元素
lrange key start end
索引下标从左到右为从0到N-1,从右到左是-1到-N,end包含了自身
获取List指定索引下标的Element
lindex key index
获取List长度
llen key
lpop key
从List右侧pop Element
rpop key
删除指定Element
lrem key count value
从List中找到值为value的element删除,根据count不同分为三种情况
- count>0:从左到右,最多删除count个Element
- count<0:从右到左,最多删除count个element
- count=0:删除所有
按照索引范围修剪List
ltrim key start end
lset key index newValue
blpop key [key ...] timeout brpop key [key ...] timeout
timeout的单位为秒
- List为空:timeout=0,客户端会一直阻塞;timeout=3,会等待3秒后返回
- List不为空:timeout=0,客户端立即返回
如果使用brpop时:
- 如果是多个键,brpop会从左到右遍历所有键,一旦有一个键能弹出element,客户端立即返回
- 如果多个客户端对同一个键执行brpop,最先执行brpop命令的客户端可以获取到pop的值
[/list]
内部编码
- ziplist:当list的element个数少于list-max-ziplist-entries配置(默认512个),同时列表中每个element的值都小于list-max-ziplist-value配置(默认64个字节),Redis会选用ziplist作为List的内部实现来减少内存的使用
- linkedlist:当List类型无法满足ziplist的条件,Redis会选用linkedlist作为List的内部实现
- quicklist:Redis3.2采用,是一个ziplist为节点的linkedlist,结合了两者的优势
使用场景
- 消息队列:lpush+brpop组合可以实现阻塞队列,生产者客户端使用lrpush从List左侧插入Element,多个消费者客户端使用brpop命令阻塞式抢List右侧的element,多个客户端保证了消费的负载均衡和高可用
- 文章列表:每个用户都有属于自己的文章列表,需要分页展示文章列表,可以使用List,因为List不但是有序的,还支持按照索引范围获取element: [list]
- 每篇文章使用Hash结构存储
- 向用户文章列表添加文章使用lpush
- 分页获取用户文章列表使用lrange
注意:如果每次分页获取文章个数较多,使用hgetall效率较低,可以考虑使用pipeline批量获取,或者将文章数据序列化,使用mget批量获取。
lrange在List两端性能较好,List中间性能较差,可以考虑使用Redis3.2的quicklist内部编码实现,效率较高。
[/list]
- lpush+lpop = Stack(栈)
- lpush+rpop = Queue(队列)
- lpush+ltrim = Capped Collection(有限集合)
- lpush+brpop = Message Queue(消息队列)