列表用来存储多个有序的字符串,列表中元素是能够重复的,最多能够存储2^32-1个元素redis
经常使用命令:数据结构
lrange key start end 获取指定范围内的元素列表,索引从0开始 0,-1取出全部的元素app
lindex key index 获取列表指定下标的元素负载均衡
ltrim key start end 截取数据异步
lrem key count value :从列表中找到等于value的元素进行删除,根据count来进行区分,count >0 从左到右,最多删除count元素,count =0 删除全部,count <0,从右到左ui
lset key index value 修改数据编码
rpush(从右边插入元素),rpop(从右边取出元素并删除),lpush,rpushspa
阻塞操做:线程
blpop和brpol是lpop和rpop阻塞版本,timeout 阻塞时间索引
1)列表为空:若是timeout =3,那么客户端等到3秒后返回,为0,一直阻塞等待
2)列表不为空:客户端当即返回
注意事项:
若是有多个健,brpop会从左到右遍历健,一但有一个健能弹出,当即返回
若是多个客户端对同一个健brpop操做,那么最早执行的brpop客户端获取弹出的值,若是是一直阻塞,未获取到的就一直等待
内部编码:
1.ziplist(压缩列表),当列表类型元素小于list-max-ziplist-entries配置(默认521个),同时全部值都小于list-max-ziplist-value配置(默认64字节),redis会使用ziplist做为内部实现,全部在节约内存方面比linkedlist优秀
2.linkedlist(链表),当没法知足ziplist条件时候,redis会使用linkedlist做为列表的内部实现(redis 3.2使用的quicklist)
使用场景:
消息队列:lpush brpop 命令组合便可实现阻塞队列,多个消费者客户端使用brpop命令阻塞式的抢列表尾部的元素,多个客户端保证了消费的高可用和负载均衡
文章列表:lpush +lrang key start end 获取前多少文章
使用场景还有不少,小提示:
lpush+lpop = stack(栈)
lpush+rpop=quene(队列)
lpush+ltrim = capped collection(有限集合)
lpush+brpop = message quene(消息队列)
list 数据结构经常使用来做为异步消息队列使用,使用rpush/lpush 操做入队列,使用lpop/rpop来出队列
队列空了怎么办?
客户端是经过队列pop获取消息,而后进行处理,处理完后再接着获取消息,再进行处理,如此循环往复,这即是做为队列消费者的客户端的生命周期。
若是队列空了,客户端就会陷入pop的死循环,不停的pop,没有数据,接着在pop,又没有数据,这就是浪费生命的空轮询。空轮询不断拉高客户端的cpu,redis的qps也会拉高。blpop/brpop阻塞读,阻塞读在队列没有数据的时候,会当即进入休眠状态,一旦数据到来,则马上醒过来,消费的延迟几乎为0.
空链接自动断开
若是线程一直阻塞,redis客户端链接变成闲置链接,闲置太久,服务端通常会主动断开链接,减小闲置资源占用,这个时候blpop/brpop会抛出异常,因此编写客户端消费者注意捕获异常,还要重试。