3.3 列表类型
3.3.1 介绍
列表类型(list)可以存储一个
有序的字符串列表,常用的操作是向列表
两端添加元素,或者获得列表的某一个片段。列表类型内部是使用
双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的(和从只有20个元素的列表中获取头部或尾部的10条记录的速度是一样的)。
不过使用链表的代价是通过索引访问元素比较慢。
这种特性使列表类型能非常快速地完成关系数据库难以应付的场景:如社交网站的新鲜事,我们关心的只是
最新的内容,使用列表类型存储,即使新鲜事的总数达到几千万个,获取其中
最新的100条数据也是极快的。同样因为在两端插入记录的时间复杂度是0(1),列表类型也适合用来记录日志,可以保证加入新日志的速度不会受到已有日志数量的影响。
与散列类型键最多能容纳的字段数量相同,
一个列表类型键最多能容纳2^32-1个元素。
3.3.2 命令
1.向列表两端增加元素
LPUSH key value [value …]
RPUSH key value [value …]
LPUSH命令用来向列表左边增加元素,返回值表示增加元素后列表的长度。
redis>LPUSH numbers 1
(integer) 1
2.从列表两端弹出元素
LPOP key
RPOP key
有进有出,LPOP命令可以从列表
左边弹出一个元素。
LPOP命令执行两步操作:
第一步是将列表左边的元素从列表中
移除;
第二步是返回被移除的元素值。例如,从numbers列表左边弹出一个元素(也就是"3"):
redis>LPOP numbers
"3"
结合上面提到的4个命令可以使用列表类型来
模拟栈和队列的操作:如果想把列表当做栈,则搭配使用LPUSH和LPOP或RPUSH和RPOP,如果想当成队列,则搭配使用LPUSH和RPOP或RPUSH和LPOP。
3.获取列表中元素的个数
LLEN key
当键不存在时LLEN会返回0:
redis>LLEN numbers
(integer) 3
LLEN命令的功能类似SQL语句SELECT COUNT(*) FROM table_name,但是LLEN的
时间复杂度为0(1),使用时Redis会直接读取现成的值,而不需要像部分关系数据库(如使用InnoDB 存储引擎的MySQL表)那样需要遍历一遍数据表来统计条目数量。
4.获得列表片段
LRANGE key start stop
LRANGE命令是列表类型最常用的命令之一,它能够获得列表中的某一片段。LRANGE命令将返回索引从start到stop之间的所有元素(
包含两端的元素)。与大多数人的直觉相同,Redis的列表起始索引为0:
redis>LRANGE numbers 0 2
1) "2"
2) "1"
3) "0"
LRANGE命令在取得列表片段的同时
不会像LPOP一样删除该片段,另外LRANGE命令与很多语言中用来截取数组片段的方法slice有一点区别是LRANGE返回的值包含最右边的元素。
LRANGE命令
支持负索引,
表示从右边开始计算序数,如"-1"表示最右边第一个元素,"-2"表示最右边第二个元素,依次类推:
redis>LRANGE numbers -2 -1
1) "1"
2) "0"
显然,LRANGE numbers 0 -1可以获取列表中的所有元素。另外一些特殊情况如下。
(1)如果start的索引位置比stop的索引位置靠后,则会返回空列表。
(2)如果stop大于实际的索引范围,则会返回到列表最右边的元素
5.删除列表中指定的值
LREM key count value
LREM命令会删除列表中前count个值为value的元素,返回值是实际删除的元素个数。根据count值的不同,LREM命令的执行方式会略有差异:
- ●当count>0时LREM命令会从列表左边开始删除前count个值为value的元素;
- ●当count<0时LREM 命令会从列表右边开始删除前|count|个值为value的元素;
- ●当count=0是LREM命令会删除所有值为value的元素
#从右边开始删除第一个值为"2"的元素
redis>LREM numbers -1 2
(integer) 1
redis>LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
6. 获得/设置指定索引的元素值
LINDEX key index
LSET key index value
如果要将列表类型当作数组来用,LINDEX命令是必不可少的。LINDEX命令用来返回指定索引的元素,索引从0开始。如:
redis>LINDEX numbers 0
"2"
如果index是
负数则表示从右边开始计算的索引,最右边元素的索引是-1。例如:
redis>LINDEX numbers -1
"0"
LSET是另一个通过索引操作列表的命令,它会将索引为index的元素赋值为value。例如:
redis>LSET numbers 1 7
OK
redis>LINDEX numbers 1
"7"
注意,这个命令只能修改指定索引元素的值,不能新增。如果index超过了list的下标范围,则会返回错误提示:(error) ERR index out of range
7.只保留列表指定片段
LTRIM key start end
LTRIM命令可以
删除指定索引范围之外的所有元素,其指定列表范围的方法和LRANGE命令相同。
LTRIM命令常和LPUSH命令一起使用来限制列表中元素的数量,比如记录日志时我们希望只保留最近的100条日志,则每次加入新元素时调用一次LTRIM命令即可:
LPUSH logs newLog
LTRIM logs 0 99
8.向列表中插入元素
LINSERT key BEFORE|AFTER pivot value
LINSERT命令首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面。
LINSERT命令的返回值是插入后列表的元素个数。示例如下:
redis>LRANGE numbers 0 -1
1) "2"
2) "7"
3) "0"
redis>LINSERT numbers AFTER 7 3
(integer) 4
redis>LRANGE numbers 0 -1
1) "2"
2) "7"
3) "3"
4) "0"
redis>LINSERT numbers BEFORE 2 1
(integer) 5
redis>LRANGE numbers 0 -1
1) "1"
2) "2"
3) "7"
4) "3"
5) "0"
9.将元素从一个列表转到另一个列表R
RPOPLPUSH source destination
RPOPLPUSH是个很有意思的命令,从名字就可以看出它的功能:
先执行RPOP命令再执行LPUSH 命令。RPOPLPUSH命令会先从source列表类型键的右边弹出一个元素,然后将其加入到destination列表类型键的左边,并返回这个元素的值,整个过程是原子的。
分享到:
相关推荐
4. **丰富的数据类型**:Redis支持多种数据类型,包括字符串(string)、列表(list)、哈希(hash)、集合(set)、有序集合(sorted set)等。 5. **多功能实用工具**:Redis可以用于多种应用场景,如缓存、消息队列、计数器...
##### 3.4 Redis数据类型 Redis支持五种基本数据类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Sorted Set(有序集合)。 ##### 3.5 Redis常用数据操作命令 - **String类型**:`SET key ...
#### 三、Redis数据类型 **3.1 string类型** - 最基本的数据类型,可以存储简单的键值对。 **3.2 hash类型** - 一种键值对的集合,每个键都有对应的字段和值,适合存储复杂对象。 **3.3 list类型** - 有序的...
##### 3.3 操作列表类型 ```java import java.util.List; import redis.clients.jedis.Jedis; public class RedisListJava { public static void main(String[] args) { // 连接到本地的 Redis 服务 Jedis ...
由于其高效的数据结构和丰富的数据类型支持,如字符串(String)、列表(List)、集合(Set)、有序集合(ZSet)和哈希表(Hash),使得Redis在实际应用中非常灵活。与传统的基于磁盘的关系型数据库不同,Redis的...
- **定义与用途**:字符串是 Redis 最基础的数据类型之一,它本质上是一个键值对。字符串类型的值可以是任何格式的数据,如纯文本、图片编码数据或JSON文档等。这种简单灵活的数据类型非常适合用来存储普通的数据。 ...
- **`type`**: 用于表示对象的数据类型,如字符串(string)、哈希(hash)、列表(list)等。因为使用了4位存储,所以可以表示0到15的十进制数,足以覆盖 Redis 的所有基本数据类型。 - **`encoding`**: 表示对象的内部...
- **String(字符串)**: Redis中最基本的数据类型,可用于存储简单的键值对,支持`GET`和`SET`等命令。 - **List(链表)**: 双端链表,可以从两端插入或删除元素,适用于消息队列等场景,常用命令有`LPUSH`和`RPUSH`等...
- **小结**:对象处理机制确保了Redis数据类型的统一管理和高效内存利用。 ##### 3.2 字符串 - **字符串编码**:字符串可以采用多种编码方式,如sds、整数、压缩列表等,以适应不同的场景需求。 - **编码的选择**...
2. `opsForList()`:处理列表类型的键值对。 3. `opsForSet()`:处理集合类型的键值对。 4. `opsForZSet()`:处理有序集合类型的键值对。 5. `opsForHash()`:处理哈希表类型的键值对。 这些接口提供了丰富的操作...
- **作用:** 返回键的数据类型。 - **返回值:** 数据类型名称。 ##### 1.21 SCAN **命令格式:** `SCAN cursor [MATCH pattern] [COUNT count]` - **作用:** 迭代数据库中的键,同时不阻塞其他操作。 - **返回值...
- **选择合适的数据类型**: 不同的数据类型适用于不同的场景。例如,如果需要存储一系列有序的键值对,则可以选择使用hash;若需要存储一系列按分数排序的元素,则可以使用zset。 - **控制key的生命周期**: 设置适当...
#### 三、Redis数据类型 Redis 提供了五种基本的数据类型:字符串(Strings)、哈希表(Hashes)、列表(Lists)、集合(Sets)和有序集(ZSets)。每种数据类型都有其独特的应用场景,同时也支持一系列丰富的命令。 ##### ...
- **数据类型**:Redis支持更多的数据类型。 - **持久化**:Redis支持数据持久化。 - **性能**:Redis的性能略优于Memcached。 **11.2 如何保证缓存与数据库双写时的一致性** 通常采用“先更新数据库再删除缓存”...
2.2 Redis数据类型及其应用 2.3 Redis持久化机制 2.4 Redis高级特性和集群 3. MySQL数据库篇 3.1 MySQL简介和基本操作 3.2 数据库设计范式和优化 3.3 事务和并发控制 3.4 索引和优化技巧 4. 框架篇 4.1 ...
###### 3.7.3 Redis数据缓存组件 - **Redis简介**:了解Redis的基本概念和特点。 - **Redis的安装和配置**:掌握Redis的安装步骤和基本配置方法。 - **Redis支持的数据结构**:学习Redis支持的各种数据结构,如...