这是我参与「第五届青训营 」伴学笔记创作活动的第11天
List
List是简单的字符串列表, 按照插入顺序进行排序, 但是可以进行头插或尾插. 最大长度为2^32 - 1
实现
早期Redis的实现是由双向链表和压缩链表完成的
- 列表元素少于
512个, 且每个元素的值都小于64Byte, Redis 使用压缩列表实现 List - 反之, Redis 使用双向链表实现 List
现在Redis中底层实现均由quickList实现.
使用场景
消息队列
消息队列实现时, 需要满足消息保序, 处理重复消息和保证消息的可靠性三点
-
消息保序
由于redis很类似java中的双端对列, 在消息保序这一块, 可以像双端队列一样, 只采用一个方向, 即将其视为单向队列, 满足先进先出的要求.
-
处理重复消息
我们需要为每一条消息都生成一个全局id, 在接收消息的一方收到消息时, 和已经处理过的消息ID比对, 判断有没有处理过该条消息
-
保证消息的可靠性
当List中存在大量消息, 并且消费者读出但并未来得及处理时, 如果此时消费者断电宕机, 会丢失该条的消息
为了避免此类情况的发生, Redis提供了
BROPLPUSH命令, 即在消费者取出消息时, Redis同步将该消息写入另一个列表用作备份
消息队列这块很类似生产者消费者模型, 可以将消息发送方视为生产者, 接收方视为消费者, 而消息队列视为仓库, 只是这里的仓库没有指定长度.
既然很类似生产者消费者模型, 那么就 面临一个问题, 就是当仓库为空时, 消费者必须时刻盯着仓库, 以在生产者发来消息时可以即使取出.
为了避免此类性能消耗, Redis提供了BRPOP命令, 即阻塞式读取, 消费者在仓库为空时自动阻塞, 直至生产者向仓库发来数据.