跳到主要内容

列表

2024年04月08日
柏拉文
越努力,越幸运

一、认识


RedisList(列表) 允许你在列表的两端进行高效的插入和删除操作。具体来说,Redis 提供了 LPUSHRPUSH 命令用来在列表的头部或尾部插入元素。Redis List 可以实现队列(FIFO)和栈(LIFO)的功能。通过 LPUSHRPOP 可以构建一个栈,而通过 LPUSHLPOP 则可以构建一个队列。

Redis List 可以用于任务队列, 使用 LPUSHRPOP 实现 先进先出的队列(FIFO; 可以日志记录, 可以用 List 存储日志数据,利用 LTRIM 保持一定长度的日志记录; 可以用于缓存队列, 在需要缓存最新数据的场景下,可以利用 List 类型存储和移除数据; 可以用于消息队列, 使用 RPOPLPUSH 实现消息队列,确保消息处理的可靠性。

Redis 优化策略: Redis 会根据 List 的大小和元素的长度来自动选择编码方式。当列表包含的元素少于 512 个,每个元素的大小不超过 64 字节, 使用 ZipList 存储, ZipList 是压缩列表(连续内存区域), 更节省内存,适用于小数据量, 插入和删除效率较低,查询效率较高。当列表的元素个数或元素长度超出 ZipList 的限制时,Redis 会将其编码方式自动切换为 LinkedListLinkedList 为双向链表, 每个元素有一个指向前一个元素和后一个元素的指针,因此可以在 O(1) 时间复杂度内完成头部或尾部的插入和删除操作。 相比于 ZipList,占用更多内存,插入和删除效率较高,查询效率较低。注意, 在 Redis 早期版本中,List 数据结构是通过双向链表(LinkedList)实现的,但这种实现有一些潜在的问题和不足,尤其是在内存效率和性能上。具体来说,双向链表存储每个元素时需要额外的内存来存储指针(前后指针),而且链表在内存中的非紧凑存储方式会导致较高的内存开销。为了优化这些问题,Redis 在版本 3.2 引入了 QuickList,它通过将多种数据结构的优点结合起来,提供了更高效的内存利用和更好的性能。