redis之List类型常用方法总结

本文深入解析Redis中List类型的使用方法,包括LPUSH、LRANGE、BLPOP等常见操作的使用场景及实例,帮助读者掌握List类型的数据管理和操作技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

redis之List类型常用方法总结

格式:

存---LPUSH key value [value ...]
取--LRANGE key start stop
  1. lpush key value [value ...] 将一个或多个值插入到列表头部

    127.0.0.1:6379> lpush plf panlifu 
    (integer) 1
    127.0.0.1:6379> lpush plf lt
    (integer) 2
    127.0.0.1:6379> lpush plf xs
    (integer) 3
    127.0.0.1:6379> lpush plf cd
    (integer) 4
    127.0.0.1:6379> lrange plf 0 1
    1) "cd"
    2) "xs"
    127.0.0.1:6379> lrange plf 0 3
    1) "cd"
    2) "xs"
    3) "lt"
    4) "panlifu"
  2. lrange key start stop 获取列表指定范围内的元素

    127.0.0.1:6379> lpush plf panlifu 
    (integer) 1
    127.0.0.1:6379> lpush plf lt
    (integer) 2
    127.0.0.1:6379> lpush plf xs
    (integer) 3
    127.0.0.1:6379> lpush plf cd
    (integer) 4
    127.0.0.1:6379> lrange plf 0 1
    1) "cd"
    2) "xs"
    127.0.0.1:6379> lrange plf 0 3
    1) "cd"
    2) "xs"
    3) "lt"
    4) "panlifu"
  3. blpop key [key ...] timeout 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止

    127.0.0.1:6379> blpop plf  timeout 1
    1) "plf"
    2) "cd"
    127.0.0.1:6379> lrange plf 0 4
    1) "xs"
    2) "lt"
    3) "panlifu"
  4. brpop key [key ...] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

    127.0.0.1:6379> lrange plf 0 4
    1) "xs"
    2) "lt"
    3) "panlifu"
    127.0.0.1:6379> brpop plf timeout 1
    1) "plf"
    2) "panlifu"
    127.0.0.1:6379> lrange plf 0 4
    1) "xs"
    2) "lt"
  5. brpoplpush source destination timeout 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。?

    127.0.0.1:6379> brpoplpush plf lt timeout 10
    (error) ERR wrong number of arguments for 'brpoplpush' command
    127.0.0.1:6379> 
    
  6. lindex key index 通过索引获取列表中的元素

    127.0.0.1:6379> lrange plf 0 3
    1) "xs"
    2) "lt"
    127.0.0.1:6379> lindex plf 1
    "lt"
    127.0.0.1:6379> lindex plf 0
    "xs"
    127.0.0.1:6379> 
  7. linsert key BEFORE|AFTER pivot value 在列表的元素前或者后插入元素

    
    127.0.0.1:6379> lrange plf 0 3
    1) "xs"
    2) "lt"
    127.0.0.1:6379> linsert plf after lt hehe
    (integer) 3
    127.0.0.1:6379> lrange plf 0 3
    1) "xs"
    2) "lt"
    3) "hehe"
    127.0.0.1:6379> linsert plf before lt hehe
    (integer) 4
    127.0.0.1:6379> lrange plf 0 3
    1) "xs"
    2) "hehe"
    3) "lt"
    4) "hehe"
  8. llen key 获取列表长度

    127.0.0.1:6379> lrange plf 0 3
    1) "xs"
    2) "hehe"
    3) "lt"
    4) "hehe"
    127.0.0.1:6379> llen plf
    (integer) 4
  9. lpop key 移出并获取列表的第一个元素

    127.0.0.1:6379> lrange plf 0 3
    1) "xs"
    2) "hehe"
    3) "lt"
    4) "hehe"
    127.0.0.1:6379> llen plf
    (integer) 4
    127.0.0.1:6379> lpop plf
    "xs"
    127.0.0.1:6379> lrange plf 0 3
    1) "hehe"
    2) "lt"
    3) "hehe"
  10. lpushx key value 将一个值插入到已存在的列表头部

```shell
127.0.0.1:6379> lpushx hehe hello
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> lpushx plf hello
(integer) 4
127.0.0.1:6379> lrange plf 0 5
1) "hello"
2) "hehe"
3) "lt"
4) "hehe"
```
  1. lrem key count value 移除列表元素,count次数

    127.0.0.1:6379> lrange plf 0 5
    1) "hello"
    2) "hehe"
    3) "lt"
    4) "hehe"
    127.0.0.1:6379> lrem plf 2 hehe
    (integer) 2
    127.0.0.1:6379> lrange plf 0 5
    1) "hello"
    2) "lt"
  2. lset key index value 通过索引设置列表元素的值

    127.0.0.1:6379> lrange plf 0 5
    1) "hello"
    2) "lt"
    127.0.0.1:6379> lset plf 0 gunkai
    OK
    127.0.0.1:6379> lrange plf 0 5
    1) "gunkai"
    2) "lt"
  3. ltrim key start stop 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。

    127.0.0.1:6379> lrange plf 0 10
     1) "gunkai"
     2) "lt"
     3) "1"
     4) "2"
     5) "3"
     6) "4"
     7) "5"
     8) "6"
     9) "7"
    10) "8"
    127.0.0.1:6379> ltrim plf 0 3
    OK
    127.0.0.1:6379> lrange plf 0 10
    1) "gunkai"
    2) "lt"
    3) "1"
    4) "2"
  4. rpop key 移除列表的最后一个元素,返回值为移除的元素。

    127.0.0.1:6379> lrange plf 0 10
    1) "gunkai"
    2) "lt"
    3) "1"
    4) "2"
    127.0.0.1:6379> rpop plf
    "2"
    127.0.0.1:6379> lrange plf 0 10
    1) "gunkai"
    2) "lt"
    3) "1"
  5. rpoplpush source destination 移除列表的最后一个元素,并将该元素添加到另一个列表并返回

    127.0.0.1:6379> lrange plf 0 10
    1) "gunkai"
    2) "lt"
    3) "1"
    127.0.0.1:6379> rpoplpush plf lt
    "1"
    127.0.0.1:6379> lrange plf 0 10
    1) "gunkai"
    2) "lt"
    127.0.0.1:6379> lrange lt 0 10
     1) "1"
  6. rpush key value [value ...] 在列表中添加一个或多个值

    127.0.0.1:6379> lrange plf 0 5
    1) "gunkai"
    2) "lt"
    127.0.0.1:6379> rpush plf  1 2 3 4 5 6 7 8
    (integer) 10
    127.0.0.1:6379> lrange plf 0 10
     1) "gunkai"
     2) "lt"
     3) "1"
     4) "2"
     5) "3"
     6) "4"
     7) "5"
     8) "6"
     9) "7"
    10) "8"
  7. rpushx key value 为已存在的列表添加值

    127.0.0.1:6379> rpushx test_key 1
    (integer) 0
    127.0.0.1:6379> lrange test_key 0 1
    (empty list or set)

总结:以x结尾都是判断 key是否存在,不存在就不能设置,存在才能设置。以r开头表示可以同时添加多个值

转载于:https://www.cnblogs.com/plf-Jack/p/11080463.html

<think>我们正在讨论Redis常用数据类型及其使用示例。根据引用内容,Redis支持多种数据类型,包括字符串(String)、列表(List)、哈希(Hash)、集合(Set)、有序集合(Sorted Set)等,此外还有Bitmap、HyperLogLog、Geospatial和Stream等高级类型。下面将逐一介绍这些数据类型及其基本使用示例。 ### 1. 字符串(String) 字符串是Redis最基本的数据类型,可以存储文本、整数或浮点数。最大能存储512MB的数据。 **常用命令:** - `SET key value`:设置键值对。 - `GET key`:获取键对应的值。 - `INCR key`:将键存储的整数值增加1。 - `DECR key`:将键存储的整数值减少1。 - `APPEND key value`:将值追加到现有字符串的末尾。 **使用示例:** ```bash # 设置键为"name"的值为"John" SET name "John" # 获取"name"的值 GET name # 返回 "John" # 设置计数器 SET counter 10 INCR counter # 计数器变为11 DECR counter # 计数器变回10 ``` 字符串类型适用于缓存、计数器、分布式锁等场景[^1][^3]。 ### 2. 列表(List) 列表是简单的字符串列表,按照插入顺序排序。可以在列表的头部(左边)或尾部(右边)添加元素。 **常用命令:** - `LPUSH key value1 [value2 ...]`:将一个或多个值插入到列表头部。 - `RPUSH key value1 [value2 ...]`:将一个或多个值插入到列表尾部。 - `LPOP key`:移除并返回列表的第一个元素。 - `RPOP key`:移除并返回列表的最后一个元素。 - `LRANGE key start stop`:返回列表中指定区间内的元素。 **使用示例:** ```bash # 在列表头部插入多个元素 LPUSH mylist "world" LPUSH mylist "hello" # 获取列表所有元素(0到-1表示全部) LRANGE mylist 0 -1 # 返回 ["hello", "world"] # 在尾部插入元素 RPUSH mylist "!" # 列表变为 ["hello", "world", "!"] ``` 列表类型适用于消息队列、最新消息排行等场景[^4]。 ### 3. 哈希(Hash) 哈希是一个键值对集合,适合存储对象。每个哈希可以存储多达 $2^{32}-1$ 个字段-值对。 **常用命令:** - `HSET key field value`:设置哈希字段的值。 - `HGET key field`:获取哈希字段的值。 - `HGETALL key`:获取哈希中所有字段和值。 - `HDEL key field1 [field2 ...]`:删除一个或多个哈希字段。 **使用示例:** ```bash # 设置用户对象 HSET user:1000 name "Alice" HSET user:1000 age 30 HSET user:1000 email "alice@example.com" # 获取单个字段 HGET user:1000 name # 返回 "Alice" # 获取所有字段和值 HGETALL user:1000 # 返回 name="Alice", age="30", email="alice@example.com" ``` 哈希类型适用于存储对象信息,如用户信息、商品信息等[^4]。 ### 4. 集合(Set) 集合是字符串的无序集合,元素唯一,不允许重复。支持交集、并集、差集等操作。 **常用命令:** - `SADD key member1 [member2 ...]`:向集合添加一个或多个成员。 - `SMEMBERS key`:返回集合中的所有成员。 - `SISMEMBER key member`:判断成员是否在集合中。 - `SINTER key1 key2`:返回多个集合的交集。 **使用示例:** ```bash # 添加多个成员到集合 SADD tags "redis" "database" "nosql" # 获取集合所有成员 SMEMBERS tags # 返回 ["redis", "database", "nosql"](无序) # 检查成员是否存在 SISMEMBER tags "redis" # 返回1(存在) # 求两个集合的交集 SADD tags2 "redis" "newtag" SINTER tags tags2 # 返回 ["redis"] ``` 集合类型适用于标签系统、共同好友等需要去重和集合运算的场景[^4]。 ### 5. 有序集合(Sorted Set) 有序集合类似于集合,但每个成员关联一个分数(score),用于排序。成员唯一,但分数可以重复。 **常用命令:** - `ZADD key score1 member1 [score2 member2 ...]`:向有序集合添加一个或多个成员。 - `ZRANGE key start stop [WITHSCORES]`:按分数从小到大的顺序返回区间内的成员。 - `ZREVRANGE key start stop [WITHSCORES]`:按分数从大到小的顺序返回区间内的成员。 - `ZRANK key member`:返回成员在有序集合中的排名(从小到大)。 **使用示例:** ```bash # 添加三个成员,并指定分数 ZADD leaderboard 100 "Alice" 200 "Bob" 150 "Charlie" # 按分数升序获取排名(0到-1表示全部) ZRANGE leaderboard 0 -1 WITHSCORES # 返回:1) "Alice" 2) "100" 3) "Charlie" 4) "150" 5) "Bob" 6) "200" # 获取成员的排名(从0开始) ZRANK leaderboard "Charlie" # 返回1(第二名) ``` 有序集合适用于排行榜、带权重的消息队列等场景[^4]。 ### 6. 其他高级类型 - **Bitmap(位图)**:通过字符串的位操作实现二值状态统计,如用户签到。 ```bash SETBIT sign:user:202405 1 1 # 用户在第1天签到 BITCOUNT sign:user:202405 # 统计签到天数 ``` - **HyperLogLog**:用于基数统计(去重计数),误差率约0.81%,占用内存固定。 ```bash PFADD visitors "user1" "user2" "user1" # 添加元素(自动去重) PFCOUNT visitors # 返回2 ``` - **Geospatial(地理空间)**:存储地理位置坐标,支持距离计算、半径搜索等。 ```bash GEOADD cities 116.405285 39.904989 "Beijing" GEODIST cities "Beijing" "Shanghai" km # 计算北京到上海的距离 ``` - **Stream**:用于消息队列,支持多消费者组和消息回溯。 ```bash XADD mystream * field1 value1 # 添加消息 XREAD COUNT 1 STREAMS mystream 0 # 读取消息 ``` ### 总结 Redis的数据结构丰富且强大,合理选择数据类型能极大提升系统性能: - 简单键值存储 → String - 对象存储 → Hash - 无序不重复集合 → Set - 有序不重复集合 → Sorted Set - 列表/队列 → List - 二值统计 → Bitmap - 去重计数 → HyperLogLog - 地理位置 → Geospatial - 消息流 → Stream 更多细节可参考:[小林coding-Redis](https://xiaolincoding.com/redis/) [^2]。 §§相关问题§§ 1. Redis 的持久化机制有哪些?各有什么优缺点? 2. Redis 如何实现分布式锁? 3. Redis 的过期策略和内存淘汰机制是怎样的?</think>### Redis 常用数据类型及使用示例 Redis 支持多种高效的数据结构,每种类型针对特定场景优化。以下是核心数据类型及其使用示例(基于 Redis CLI 命令): --- #### 1. **字符串(String)** **用途**:缓存、计数器、分布式锁 **特点**:可存储文本、整数或浮点数(最大 512MB) **常用命令**: ```bash # 设置/获取值 SET user:1 "Alice" # 存储字符串 GET user:1 # 返回 "Alice" # 自增操作(计数器) SET counter 10 INCR counter # 值变为 11 DECR counter # 值变回 10 ``` **应用场景**: - 用户会话缓存 - 商品库存计数(`INCR/DECR`) - 分布式锁(`SET lock_key 1 EX 30 NX`)[^1][^3] --- #### 2. **哈希(Hash)** **用途**:存储对象属性 **特点**:键值对集合,适合存储结构化数据 **常用命令**: ```bash # 存储用户对象 HSET user:1000 name "Bob" age 30 email "bob@example.com" HGET user:1000 name # 返回 "Bob" HGETALL user:1000 # 返回所有字段 ``` **应用场景**: - 用户信息存储(避免序列化整个对象) - 商品属性管理(如价格、库存)[^4] --- #### 3. **列表(List)** **用途**:消息队列、最新动态 **特点**:双向链表,支持头部/尾部操作 **常用命令**: ```bash # 消息队列实现 LPUSH messages "task1" # 左侧插入 RPUSH messages "task2" # 右侧插入 LPOP messages # 取出左侧第一个任务 LRANGE messages 0 -1 # 查看所有任务 ``` **应用场景**: - 最新文章列表(`LPUSH` + `LTRIM` 限制长度) - 任务队列(配合 `BRPOP` 阻塞获取)[^4] --- #### 4. **集合(Set)** **用途**:去重、交集/并集计算 **特点**:无序、元素唯一 **常用命令**: ```bash # 标签系统 SADD article:1000_tags "tech" "redis" "database" SMEMBERS article:1000_tags # 查看所有标签 # 共同关注计算 SADD user:A_follows "userB" "userC" SADD user:B_follows "userC" "userD" SINTER user:A_follows user:B_follows # 返回共同关注 ["userC"] ``` **应用场景**: - 用户标签系统 - 共同好友/兴趣推荐[^4] --- #### 5. **有序集合(Sorted Set)** **用途**:排行榜、优先级队列 **特点**:元素按分数(score)排序 **常用命令**: ```bash # 游戏排行榜 ZADD leaderboard 2500 "Alice" 1800 "Bob" 3000 "Charlie" ZREVRANGE leaderboard 0 2 WITHSCORES # 返回前三名 ZRANK leaderboard "Bob" # 返回 Bob 的排名 ``` **应用场景**: - 实时排行榜(如游戏积分) - 延迟任务调度(用时间戳作 score)[^4] --- #### 6. **高级数据类型** | 类型 | 用途 | 示例命令 | |---------------|-------------------------------|------------------------------| | **Bitmap** | 二值统计(如签到) | `SETBIT sign:2024 100 1` | | **HyperLogLog**| 海量数据去重计数(误差 <1%) | `PFADD visitors "user1"` | | **Geospatial**| 地理位置计算 | `GEOADD cities 116.40 39.90 Beijing` | | **Stream** | 消息队列(类 Kafka) | `XADD orders * product "Book"` | --- ### 数据类型选择建议 1. **简单键值** → **String** 2. **对象存储** → **Hash** 3. **队列/栈** → **List** 4. **去重集合** → **Set** 5. **排行榜** → **Sorted Set** 6. **签到统计** → **Bitmap** 7. **UV 统计** → **HyperLogLog** > 更多细节参考:[小林coding-Redis 图解](https://xiaolincoding.com/redis/) [^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值