Redis命令学习—List(列表)

本文详细介绍了Redis中的列表命令,包括BLPOP、BRPOP、BRPOPLPUSH等阻塞式命令,以及LINDEX、LINSERT、LLEN等常用操作。通过实例展示了如何使用这些命令进行数据操作。

本文参考:http://redisdoc.com/list/index.html

BLPOP

    BLPOP key[key ...] timeout:BLPOP是列表的阻塞式(blocking)弹出原语。是LPOP命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将会被BLPOP    命令阻塞,直到等待超时,会有可弹出元素为止。
    当给定多个key参数的时候,按参数key的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。
    
  1. DEl job command request#删除元素
  2. 0
  1. LPUSH command "update system"#添加元素
  2. 1
  3. LPUSH request "visit page"
  4. 1
  5. BLPOP job command request 0#弹出存在元素的第一个非空列表
  6. command#表名
  7. update system#第一个元素
    如果所有给定的key都为空列表会不存在,那么BLPOP命令将阻塞连接,直到等待超时会其他客户端调用LPUSH或RPUSH命令为列表添加元素。
    
  1. redis> EXISTS job # 确保两个 key 都不存在
  2. (integer) 0
  3. redis> EXISTS command
  4. (integer) 0
  5. redis> BLPOP job command 300 # 因为key一开始不存在,所以操作会被阻塞,直到另一客户端对 job 或者 command 列表进行 PUSH 操作。
  6. 1) "job" # 这里被 push 的是 job
  7. 2) "do my home work" # 被弹出的值
  8. (26.26s) # 等待的秒数
  9. redis> BLPOP job command 5 # 等待超时的情况
  10. (nil)
  11. (5.66s) # 等待的秒数
相同的key可以被多个客户端阻塞。客户端被放进一个队列中,按照先进先出的方式,为key执行BLPOP命令。
一个被包裹在MULTI/EXEC块内的BLPOP命令,行为变现的和LPOP一样,对空列表返回nil,非空列表弹出对应元素。
  1. RPUSH job programming
  2. 1
  3. MULTI
  4. OK
  5. BLPOP job 10
  6. QUEUED
  7. EXEC#执行非空列表,立即返回
  8. job
  9. programming
  10. LLEN job
  11. 0
  12. MULTI
  13. OK
  14. BLPOP job 5
  15. QUEUED
  16. EXEC#执行空列表,返回nil
  17. (nil)

BRPOP

    BRPOP key[key ...] timeout:BRPOP是列表的阻塞式弹出原语。他是RPOP命令的阻塞式。和BLPOP使用基本相同。

BRPOPLPUSH 

    BRPOPLPUSH source destination timeout:BRPOPLPUSH是RPOPLPUSH的阻塞版本,当给定列表source不为空 时,两者表现相同。当列表为空时,BRPOPLPUSH命令将阻塞连接,知道等待超时,会有其他客户端执行push操作。
    返回值:在指定时间没有任何元素被弹出,则返回一个nil和等待时长。反之,返回一个两个元素列表,包含弹出元素的值和等待时长。
  1. BRPOPLPUSH msg reciver 10#空列表
  2. (nil)
  3. (10.33s)
  4. LPUSH msg "hello"
  5. 1
  6. BRPOPLPUSH msg reciver 10#非空 列表
  7. hello
  8. LLEN reciver
  9. 1

LINDEX

    LINDEX key index:返回列表key中,下表为index的元素。
    返回值:列表中下标为index的元素。如果index参数的值不在列表的区间范围内,返回nil。
    
  1. LPUSH mylist "World"
  2. 1
  3. LPUSH mylist "HELLO"
  4. 2
  5. LINDEX mylist 0
  6. HELLO
  7. LINDEX mylist -1
  8. World

LINSERT

    LINSERT key BEFORE|AFTER pivot value:将值value插入到列表key当中,位于值pivot之前或之后。
    当pivot不存在时,不执行任何操作。当key不存在时,不执行任何操作。
    当key不是列表类型,返回一个错误。
    返回值:执行成功,返回操作后的列表长度。如果找不到pivot,返回-1。key不存在,返回0。
  1. LINSERT mylist BEFORE "World" "Three"
  2. 3
  3. LRANGE mylist 0 -1
  4. HELLO
  5. Three
  6. World

LLEN

    LLEN key:返回列表的长度,如果列表不存在返回0.如果key不是列表类型,返回一个错误。
    返回值:列表长度。
  1. LLEN job
  2. 1
  3. LPUSH job "sda"
  4. 2
  5. LLEN job
  6. 2

LPOP

    LPOP key:移除并返回列表key的头元素。
    返回值:列表的头元素。当key不存在时,返回nil。
  1. LLEN course
  2. 0
  3. RPUSH course 01
  4. 1
  5. RPUSH course 02
  6. 2
  7. LPOP course
  8. 01
  9. LLEN course
  10. 1

LPUSH

    LPUSH key value [value ...]:将一个或多个value插入到列表的表头。如果有多个value。那么value值按照从左到右的顺序依次插入。
    如果key不存在,那么一个空列表会被创建并执行LPUSH操作。
    返回值:执行后列表的长度。
    
  1. LPUSH languages python
  2. 1
  3. LPUSH languages python
  4. 2
  5. LRANGE languages 0 -1
  6. python
  7. python
  8. LPUSH languages a b c
  9. 5
  10. LRANGE languages 0 -1
  11. c
  12. b
  13. a
  14. python
  15. python

LPUSHX

LPUSHX key value:将值value插入到列表的表头,当且仅当key存在并且是一个列表。与LPUSH命令相反,当key不存在时,LPUSHX命令什么也不做。
    返回值:LPUSHX命令执行后,表的长度。
  1. LLEN greet
  2. 0
  3. LPUSHX greet "hello"
  4. 0
  5. LPUSH greet "hello"
  6. 1
  7. LPUSHX greet "hello"
  8. 2
  9. LRANGE greet 0 -1
  10. hello
  11. hello

LRANGE

LRANGE key start stop:返回列表区间内元素,区间偏移量以start stop指定。start stop闭区间内的元素会返回,比如 0 10 返回11个元素。
  1. RPUSH language lisp
  2. 1
  3. RPUSH language java
  4. 2
  5. LRANGE language 0 0
  6. lisp
  7. LRANGE language 0 1
  8. lisp
  9. java

LREM

    LREM key count value:根据参数count的值,移除列表中与参数value相等的元素。
    count大于0,从表头移除。
    count小于0,从表尾移除。
    count等于0,移除所有与value相等的值。
    返回值:被移除的元素的数量。

  1. LPUSH greet "morning"
  2. 1
  3. LPUSH greet "hello"
  4. 2
  5. LPUSH greet "morning"
  6. 3
  7. LPUSH greet "hello"
  8. 4
  9. LPUSH greet "morning"
  10. 5
  11. LRANGE greet 0 4
  12. morning
  13. hello
  14. morning
  15. hello
  16. morning
  17. LREM greet 2 morning
  18. 2
  19. LLEN morning
  20. 0
  21. LLEN greet
  22. 3
  23. LREM greet -1 morning
  24. 1
  25. LLEN greet
  26. 2
  27. LRANGE greet 0 -1
  28. hello
  29. hello

LSET

    LSET key index value:将列表key下标index的元素值设为value。
    返回值:操作成功返回ok,否则返回错误信息。
  1. EXISTS list
  2. 0
  3. LSET list 0 item
  4. ERR no such key
  5. LPUSH job "cook"
  6. 1
  7. LRANGE job 0 0
  8. cook
  9. LSET job 0 "play game"
  10. OK
  11. LRANGE job 0 -1
  12. play game

LTRIM

 LTRIM key start stop:对一个列表进行修剪操作,让列表只保留指定区域内的元素,不在区域内的元素将被删除。
    返回值:命令执行成功,返回ok。

  1. LPUSH alpha a b c d e f g
  2. 7
  3. LTRIM alpha 1 -1
  4. OK
  5. LRANGE alpha 0 -1
  6. f
  7. e
  8. d
  9. c
  10. b
  11. a
  12. LTRIM alpha 1 -1
  13. OK
  14. LRANGE alpha 0 -1
  15. e
  16. d
  17. c
  18. b
  19. a

RPOP

RPOP key:移除并返回列表的尾元素。
    返回值:列表的尾元素。
  1. LRANGE alpha 0 -1
  2. e
  3. d
  4. c
  5. b
  6. a
  7. RPOP alpha
  8. a
  9. LRANGE alpha 0 -1
  10. e
  11. d
  12. c
  13. b

RPOPLPUSH

RPOPLPUSH source destination:在一个原子时间内执行:1)将列表source中的最后一个元素弹出,并返回给客户端。将source元素弹出的元素插入列表destination,作为destination列表的头元素。
    返回值:被弹出的元素。
  1. LRANGE alpha 0 -1
  2. e
  3. d
  4. c
  5. b
  6. RPOPLPUSH alpha reciver
  7. b
  8. LRANGE alpha 0 -1
  9. e
  10. d
  11. c
  12. LRANGE reciver 0 -1
  13. b
  14. RPOPLPUSH alpha reciver
  15. c
  16. LRANGE alpha 0 -1
  17. e
  18. d
  19. LRANGE reciver 0 -1
  20. c
  21. b

RPUSH

    RPUSH key value[value .. ]:将一个或多个值value插入到列表key的表尾。如果多个key,那么按照从左到右的顺序插入到列表。
    返回值:执行操作后,表的长度。
  1. RPUSH language c
  2. 1
  3. LRANGE language 0 -1
  4. c
  5. RPUSH language a b c
  6. 4
  7. LRANGE language 0 -1
  8. c
  9. a
  10. b
  11. c

RPUSHX

RPUSHX key value:将值插入列表key的表尾,当且仅当key存在并且是一个列表。当key不存在时,不进行任何操作。
    返回值:表的长度。

  1. LLEN greet
  2. 0
  3. RPUSHX greet "hello"
  4. 0
  5. RPUSH greet a
  6. 1
  7. RPUSHX greet "hello"
  8. 2


<think>好的,用户现在问的是关于Redis命令学习的内容。我需要先回顾之前的对话历史,确保回答符合用户的需求。之前用户询问过高并发测试,现在转向Redis,可能是因为他们需要优化高并发场景下的数据存储和缓存,而Redis在这方面很常用。 首先,我应该确定用户的学习层次。用户可能刚开始接触Redis,需要基础命令的介绍,但也不排除他们已经有基础,想深入一些高级命令。不过根据问题“redis命令学习”,推测用户可能希望从基础到进阶的系统性介绍。 接下来要考虑的是如何组织内容。用户之前的高并发测试回答结构清晰,分点说明,所以这次也应该保持类似的格式。可能需要分基础命令、数据结构相关命令、进阶功能、学习建议等部分。 需要注意Redis的版本,不同版本支持的命令可能不同,但用户可能使用的是较新版本,所以可以默认介绍常用且广泛支持的命令,必要时指出版本差异。比如Streams是在5.0引入的,如果用户用的是旧版本可能需要注意。 还要考虑用户的实际应用场景。比如在高并发下,事务、管道、Lua脚本这些功能对于性能优化很重要,应该重点介绍。同时,数据持久化和集群管理命令也是运维中常遇到的,需要提及。 用户可能想知道如何高效学习这些命令,所以学习建议部分可以推荐官方文档、在线实验环境,以及常用场景的命令应用,比如缓存、排行榜等。 另外,用户可能对某些命令的具体使用例子感兴趣,比如如何使用ZSET实现排行榜,或者如何使用PUB/SUB实现消息队列。因此,在数据结构部分给出具体例子会更有帮助。 需要检查是否覆盖了Redis的主要数据结构:字符串、哈希、列表、集合、有序集合,以及新增的Streams。同时,事务、持久化、集群管理等重要模块也不能遗漏。 最后,确保使用正确的中文术语,避免直译英文带来的理解困难。例如,解释“EXPIRE”命令时,用“设置键的过期时间”更易懂。 总结,回答结构大致分为基础命令、数据结构命令、进阶功能、学习建议,每部分用清晰的标题和示例代码,保持与之前回答一致的格式,帮助用户逐步学习和应用Redis命令。</think>以下是关于Redis命令学习的系统性介绍,采用分层结构帮助您从基础到进阶逐步掌握: --- ### 一、Redis命令基础特性 1. **命令格式** `COMMAND KEY [参数]` 例如:`SET user:001 "Alice" EX 60`(设置键值,并60秒后过期) 2. **通用规则** - 所有操作基于**键值对**,键名需唯一(如`user:001`) - 多数命令时间复杂度为$O(1)$,部分复杂操作如`SORT`为$O(n)$ - 支持批量操作(`MSET`/`MGET`)和管道(Pipeline)优化性能 --- ### 二、核心数据结构与对应命令 #### 1. **字符串(String)** - `SET key value [EX seconds]`:存储值(带过期时间) - `GET key`:获取值 - `INCR key`:原子性增加数值(适用于计数器) **示例**: ```bash SET page_views 0 INCR page_views # 结果:1 ``` #### 2. **哈希(Hash)** - `HSET key field value`:存储字段值(适合对象存储) - `HGETALL key`:获取所有字段和值 - `HINCRBY key field increment`:字段数值增减 **示例**: ```bash HSET user:001 name "Alice" age 30 HGET user:001 name # 输出:"Alice" ``` #### 3. **列表List)** - `LPUSH key value`:左侧插入元素(实现队列/栈) - `LRANGE key start end`:范围查询 - `BLPOP key timeout`:阻塞式弹出元素(消息队列) #### 4. **集合(Set)** - `SADD key member`:添加元素(去重) - `SINTER key1 key2`:求交集(共同好友功能) - `SMEMBERS key`:获取所有成员 #### 5. **有序集合(Sorted Set)** - `ZADD key score member`:按分数排序(排行榜实现) - `ZRANGE key start end [WITHSCORES]`:按范围获取成员 - `ZREVRANK key member`:获取逆序排名 **应用场景**: ```bash ZADD leaderboard 100 "PlayerA" 85 "PlayerB" ZREVRANGE leaderboard 0 2 WITHSCORES # 显示前三名 ``` #### 6. **流(Stream,Redis 5.0+)** - `XADD stream * field value`:添加事件(日志系统) - `XREAD COUNT 10 STREAMS stream 0`:读取最新事件 --- ### 三、进阶功能命令 #### 1. **事务控制** - `MULTI`:开启事务 - `EXEC`:执行事务块 - `WATCH key`:监控键变化(乐观锁) **示例**: ```bash WATCH balance MULTI DECRBY balance 50 EXEC # 若balance未被修改则执行 ``` #### 2. **持久化与备份** - `SAVE`:同步保存数据到磁盘(阻塞式) - `BGSAVE`:后台异步保存 - `LASTSAVE`:获取最后一次保存时间戳 #### 3. **集群管理** - `CLUSTER SLOTS`:查看集群分片信息 - `CLUSTER FAILOVER`:手动触发故障转移 --- ### 四、学习建议与资源 1. **学习路径** - **Step 1**:掌握基础数据结构的增删改查命令 - **Step 2**:学习事务、管道、Lua脚本等进阶操作 - **Step 3**:实践组合命令解决实际问题(如分布式锁) 2. **推荐工具** - **`redis-cli`**:官方命令行工具(支持`--stat`实时监控) - **RedisInsight**:图形化管理工具(可视化命令执行) 3. **常用场景命令速查** | 场景 | 关键命令 | |-----------------|-----------------------------------| | 缓存 | `SETEX`/`GET`/`DEL` | | 分布式锁 | `SET key value NX EX 30` | | 限流 | `INCR` + `EXPIRE` | 4. **官方文档** - 访问 [Redis Commands](https://redis.io/commands/) 获取完整命令列表与示例 --- ### 五、注意事项 1. **危险命令慎用** - `FLUSHALL`:清空所有数据库 - `KEYS *`:生产环境避免使用(改用`SCAN`分批次查询) 2. **性能优化** - 使用`PIPELINE`减少网络往返时间 - 高频读取场景优先选择`HGET`替代`HGETALL` 通过系统化学习与实践,可快速掌握Redis命令体系,灵活应用于缓存、队列、实时统计等场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值