2_list(列表)
2023/7/3...大约 2 分钟
Redis基础类型——list(列表)
Java方法基于redisTemplate.opsForList()。
介绍基本概念
Redis的列表相当于Java语言的LinkedList,是链表而不是数组。意味着插入和删除操作非常快,时间复杂度O(1),但索引定位慢,时间复杂度O(n)。
当列表弹出最后一个元素之后,该数据结构被自动删除,内存被回收。
Redis的列表结构常用来做异步队列使用。将需要延后的处理的任务结构体序列化成字符串,塞进Redis的列表,另一个线程从这个列表中轮询数据进行处理。
理解可以,但是Redis底层存储的不是一个简单的LinkedList,而是称之为“快速链表”(quicklist)的一个结构。
列表元素比较少的情况下,会使用一块连续的内存存储,这个结构是压缩列表(ziplist)。当数据量较多的时候才会改成quicklist。
因为普通的链表需要的附加指针空间太大,会浪费空间,还会加重内存的碎片化。所以Redis将链表和ziplist结合起来组成了quicklist,也就是将多个ziplist使用双向指针串起来使用。 这样quicklist既满足快速的插入删除性能,又不会出现太大的空间冗余。
命令与Java方法对应关系
命令 | Java方法 | 描述 |
---|---|---|
LPUSH | leftPush(key, value) | 将一个或多个值 value 插入到列表 key 的表头 |
LPOP | leftPop(key) | 移除并返回列表 key 的头元素 |
RPUSH | rightPush(key, value) | 将一个或多个值 value 插入到列表 key 的表尾 |
RPOP | rightPop(key) | 移除并返回列表 key 的尾元素 |
linde | index(key,index) | 相当于Java链表的get(int index)方法,需要对链表进行遍历,性能会随着index的增大而变差。index可以为负,表示倒数第几个元素 |
ltrim | trim(K key, long start, long end) | 保留,ltrim的两个参数start_index和end_index定义了一个区间,在这个区间内的值ltrim要保留,区间之外砍掉。可以通过ltrim实现一个定长的链表 |
LINDEX | 通过索引获取列表中的元素;可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推;如果指定索引值不在列表的区间范围内,返回 nil | |
LRANGE key start stop | 获取列表指定范围内的元素 |