Redis 的列表相当于 Java 语言里面的 LinkedList,注意它是链表而不是数组。这意味着 list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n),这点让人非常意外。
当列表弹出了最后一个元素之后,该数据结构自动被删除,内存被回收。
Redis 的列表结构常用来做异步队列使用。将需要延后处理的任务结构体序列化成字符串塞进 Redis 的列表,另一个线程从这个列表中轮询数据进行处理。
右边进左边出:队列
> rpush books python java golang
(integer) 3
> llen books
(integer) 3
> lpop books
"python"
> lpop books
"java"
> lpop books
"golang"
> lpop books
(nil)
右边进右边出:栈
> rpush books python java golang
(integer) 3
> rpop books
"golang"
> rpop books
"java"
> rpop books
"python"
> rpop books
(nil)
慢操作
lindex 相当于 Java 链表的get(int index)方法,它需要对链表进行遍历,性能随着参数index增大而变差。
ltrim 和字面上的含义不太一样,个人觉得它叫 lretain(保留) 更合适一些,因为 ltrim 跟的两个参数start_index和end_index定义了一个区间,在这个区间内的值,ltrim 要保留,区间之外统统砍掉。我们可以通过ltrim来实现一个定长的链表,这一点非常有用。
index 可以为负数,index=-1表示倒数第一个元素,同样index=-2表示倒数第二个元素。
> rpush books python java golang
(integer) 3
> lindex books 1 # O(n) 慎用
"java"
> lrange books 0 -1 # 获取所有元素,O(n) 慎用
1) "python"
2) "java"
3) "golang"
> ltrim books 1 -1 # O(n) 慎用
OK
> lrange books 0 -1
1) "java"
2) "golang"
> ltrim books 1 0 # 这其实是清空了整个列表,因为区间范围长度为负
OK
> llen books
(integer) 0
快速列表
如果再深入一点,你会发现 Redis 底层存储的还不是一个简单的 linkedlist,而是称之为快速链表 quicklist 的一个结构。
首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是 ziplist,也即是压缩列表。它将所有的元素紧挨着一起存储,分配的是一块连续的内存。当数据量比较多的时候才会改成 quicklist。因为普通的链表需要的附加指针空间太大,会比较浪费空间,而且会加重内存的碎片化。比如这个列表里存的只是 int 类型的数据,结构上还需要两个额外的指针 prev 和 next 。所以 Redis 将链表和 ziplist 结合起来组成了 quicklist。也就是将多个 ziplist 使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余
- 大小: 119.9 KB
- 大小: 11.8 KB
分享到:
相关推荐
在很多时候,人们只是将Redis视为Key/Value数据库服务器,然而事实并非如此,在目前的版本中,Redis除了Key/Value之外还支持List、Hash、Set和Ordered Set等数据结构,因此它的用途也更为宽泛。对于此种误解,Redis...
它支持多种数据结构,如字符串、哈希、列表、集合、有序集合,以及更复杂的地理空间索引等。本教程将深入探讨Redis的基础知识、核心特性和实际应用。 一、Redis简介 Redis作为一个内存数据存储,具有极快的数据读写...
Redis支持多种数据类型,本篇文章将对Redis的基础数据结构进行讲解,包括string(字符串)、list(列表)、set(集合)、hash(哈希)以及zset(有序集合)。掌握这些基础数据结构对使用Redis至关重要。 首先,字符...
此外,理解Redis的数据结构(如String、Hash、List、Set、Sorted Set)和它们的适用场景,有助于优化存储和查询性能。 10. **错误处理和异常安全**:在C++中,良好的错误处理和异常安全代码是必要的。当Redis操作...
Redis是一款高性能的键值存储系统,它以其丰富的数据结构、高效的数据操作以及强大的持久化机制在现代互联网架构中扮演着重要角色。本篇文章主要探讨Redis的核心数据结构和核心原理,以及如何利用IO多路复用技术处理...
在C#中使用Redis,首先要理解Redis的数据结构,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。这些数据结构对应于C#中的不同对象类型,例如字符串可以映射为string,...
对于Redis,Python的`redis`库提供了一套完整的API来操作各种数据结构;而对于MySQL,`pymysql`或`mysql-connector-python`等库则提供了SQL操作的接口。在实际应用中,这样的组合常常用于实现数据缓存、数据库读写...
Redis是一个开源的,基于键值对的NoSQL数据库,支持多种数据结构如字符串、哈希、列表、集合和有序集合。它的内存存储特性使其能够提供极快的数据读写速度,适合处理高并发场景下的数据访问。 在C#中,我们通常使用...
Redis 支持多种数据结构,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。这些数据结构为应用程序提供了丰富的操作,比如存储用户信息、缓存页面内容、实现队列功能等。 ...
Redis是一款开源的高性能键值对存储数据库,它支持五种基础数据结构:字符串(string)、列表(list)、集合(set)、哈希(hash)和有序集合(zset)。这些数据结构为Redis提供了丰富多样的数据操作方式,使其广泛...
4. **队列服务**:利用Redis的发布/订阅模式或list数据结构,实现任务队列,处理异步任务。 三、DTcms 4.0、5.0 Redis插件安装与配置 安装DTcms的Redis插件通常涉及以下几个步骤: 1. **下载插件**:根据提供的...
Redis 是一款高性能的键值数据库,其基础数据结构包括字符串(string)、列表(list)、集合(set)、哈希(hash)和有序集合(zset)。这些数据结构在 Redis 中有着广泛的应用,下面将详细介绍它们的特点和用途。 1. 字符串...
Redis 是一个高性能的内存数据结构服务器,常被用作数据库、缓存和消息中间件。它的特点是速度快,因为它将所有数据存储在内存中,并通过异步持久化到磁盘以保证数据安全性。Redis 支持丰富的数据类型,包括字符串...
5. **数据结构与操作**:Redis支持的数据结构包括: - 字符串(String):基本类型,可以存储文本或二进制数据。 - 哈希(Hash):键值对的集合,用于存储对象。 - 列表(List):按顺序存储元素,支持两端插入和删除。...
1. **Redis的数据类型**:Redis提供了多种数据结构,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。这些数据类型使得Redis在处理各种应用场景时非常灵活。 2. **持久化...
1. 字符串(String):这是最基础的数据类型,对应数据结构是简单的字符串。在Redis中,字符串可以用来存储各种类型的数据,例如数字、文本等。 2. 列表(List):列表可以存储一组数据,有两种实现方式:压缩列表...
Redis使用多种自定义的数据结构来存储和操作数据,如字符串(String)、哈希表(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。这些数据结构在源码中都有对应的实现,例如` SDS (Simple Dynamic ...
在本资料"05-Redis 核心数据结构 & Redis 6 新特性详解-郭嘉.zip"中,我们将深入探讨Redis的核心数据结构以及最新的Redis 6版本的新特性。 一、Redis核心数据结构 1. 字符串(String):Redis最基础的数据类型,可...
3. **数据结构优化**:Redis内置丰富的数据结构,如String、Hash、List、Set、Sorted Set,这些数据结构的实现都经过优化,适合高效的操作。 4. **命令级原子性**:Redis的所有操作都是原子性的,这意味着在一个命令...