redis-list

列表用来存储多个有序的字符串,列表中元素是能够重复的,最多能够存储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会抛出异常,因此编写客户端消费者注意捕获异常,还要重试。

相关文章
相关标签/搜索