图解 Redis CLI 命令:直观理解与高效使用 – wiki基地


图解 Redis CLI 命令:直观理解与高效使用

Redis,作为一个高性能的键值存储系统,以其闪电般的速度和丰富的数据结构在现代应用开发中占据了举足轻重的地位。而与Redis交互最直接、最原始也最强大的方式,莫过于通过它的命令行接口(CLI)。Redis CLI 不仅仅是一个简单的客户端工具,它更是我们理解Redis内部工作机制、进行日常管理、调试乃至性能优化的得力助手。

本文将深入浅出地“图解”Redis CLI的各种命令,旨在帮助读者直观地理解其语法与功能,并通过丰富的示例,掌握高效使用Redis CLI的技巧。无论您是Redis新手,还是希望提升CLI使用效率的资深开发者,本文都将为您提供宝贵的洞察。

引言:Redis CLI——直通Redis大脑的命令之门

想象一下,你有一台超级跑车,但你却不知道如何驾驶它。Redis就是那台超级跑车,而Redis CLI则是它的方向盘、油门和刹车。熟练掌握Redis CLI,意味着你能够:

  1. 直观理解数据结构: 通过CLI操作,你能实时看到不同数据结构如何存储数据,并观察其变化。
  2. 高效调试与测试: 在开发和测试阶段,CLI是快速验证逻辑、排查问题的最佳工具。
  3. 日常管理与维护: 从数据备份、监控到配置修改,CLI提供了一站式的管理解决方案。
  4. 性能优化: 监控命令的执行时间、查看慢日志,为性能瓶颈定位提供依据。

我们将从最基础的连接与通用命令开始,逐步深入到各种数据结构的操作,最后探讨高级特性和高效使用技巧。

第一部分:走进Redis CLI的殿堂

1.1 连接Redis服务器

redis-cli 是Redis官方提供的命令行客户端。启动它非常简单:

bash
redis-cli

如果你在本地默认端口(6379)启动了Redis服务器,直接输入 redis-cli 即可连接。成功连接后,你将看到Redis的提示符 127.0.0.1:6379>

示例:连接到远程服务器或指定端口

“`bash

连接到指定主机和端口

redis-cli -h your_host -p your_port

如果Redis服务器需要密码认证

redis-cli -h your_host -p your_port -a your_password
“`

图解:连接成功界面

$ redis-cli
127.0.0.1:6379>

1.2 通用命令:理解Redis世界的基石

在深入特定数据结构之前,有一些命令适用于所有类型的键,它们是管理Redis数据的基石。

1.2.1 PING:心跳检测
用于测试客户端与Redis服务器的连接是否正常。

127.0.0.1:6379> PING
PONG

PONG 表示连接正常。

1.2.2 ECHO:回显消息
将给定的字符串回显给客户端,常用于测试或简单的消息传递。

127.0.0.1:6379> ECHO "Hello Redis CLI"
"Hello Redis CLI"

1.2.3 DEL:删除键
删除一个或多个键。如果键不存在,则忽略。

127.0.0.1:6379> SET mykey "hello"
OK
127.0.0.1:6379> DEL mykey
(integer) 1
127.0.0.1:6379> GET mykey
(nil)

返回的整数表示成功删除的键的数量。

1.2.4 EXISTS:检查键是否存在
检查一个或多个键是否存在。

127.0.0.1:6379> SET mykey "value"
OK
127.0.0.1:6379> EXISTS mykey
(integer) 1
127.0.0.1:6379> EXISTS non_existent_key
(integer) 0

返回1表示存在,0表示不存在。

1.2.5 TYPE:获取键的数据类型
返回键所存储值的类型。

127.0.0.1:6379> SET mystring "hello"
OK
127.0.0.1:6379> LPUSH mylist "a" "b"
(integer) 2
127.0.0.1:6379> TYPE mystring
string
127.0.0.1:6379> TYPE mylist
list
127.0.0.1:6379> TYPE non_existent_key
none

1.2.6 KEYS:查找所有符合给定模式的键
注意: KEYS 命令会遍历所有键,在大数据集上执行时可能会阻塞服务器,因此不建议在生产环境中使用。它主要用于开发和调试。

127.0.0.1:6379> SET user:1:name "Alice"
OK
127.0.0.1:6379> SET user:2:name "Bob"
OK
127.0.0.1:6379> KEYS user:*
1) "user:2:name"
2) "user:1:name"
127.0.0.1:6379> KEYS *name
1) "user:2:name"
2) "user:1:name"

1.2.7 EXPIRE / TTL / PERSIST:设置和管理键的生存时间
* EXPIRE key seconds:为键设置过期时间,单位秒。
* TTL key:查看键剩余的生存时间(Time To Live),单位秒。-1表示永久,-2表示键不存在。
* PERSIST key:移除键的过期时间,使其永久有效。

127.0.0.1:6379> SET myvolatilekey "temp_value"
OK
127.0.0.1:6379> EXPIRE myvolatilekey 60 # 设置60秒过期
(integer) 1
127.0.0.1:6379> TTL myvolatilekey
(integer) 58 # 剩余时间会不断减少
127.0.0.1:6379> PERSIST myvolatilekey
(integer) 1
127.0.0.1:6379> TTL myvolatilekey
(integer) -1 # 已永久有效

1.2.8 RENAME / RENAMENX:重命名键
* RENAME oldkey newkey:将 oldkey 重命名为 newkey。如果 newkey 已经存在,则会覆盖它。
* RENAMENX oldkey newkey:仅当 newkey 不存在时,才将 oldkey 重命名为 newkey

“`
127.0.0.1:6379> SET key1 “value1”
OK
127.0.0.1:6379> RENAME key1 key_new
OK
127.0.0.1:6379> GET key_new
“value1”

127.0.0.1:6379> SET key_another “value_another”
OK
127.0.0.1:6379> RENAMENX key_new key_another # key_another已存在,重命名失败
(integer) 0
127.0.0.1:6379> GET key_new # key_new仍然存在
“value1”
“`

1.2.9 FLUSHDB / FLUSHALL:清空数据库
* FLUSHDB:清空当前数据库的所有键。
* FLUSHALL:清空所有数据库的所有键。
警告: 这两个命令具有毁灭性,请在生产环境谨慎使用!

127.0.0.1:6379> SET testkey "123"
OK
127.0.0.1:6379> KEYS *
1) "testkey"
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> KEYS *
(empty array)

第二部分:核心数据结构命令详解

Redis之所以强大,很大程度上归功于其丰富而高效的数据结构。掌握这些数据结构的CLI操作,是发挥Redis潜力的关键。

2.1 字符串(String):最基础的数据类型

Redis的字符串可以存储任何形式的字节序列,包括文本、整数、浮点数,甚至是二进制数据。

主要用途: 缓存、计数器、存储序列化对象等。

图解:字符串命令

“`

设置键值对

127.0.0.1:6379> SET username “Alice”
OK

获取键的值

127.0.0.1:6379> GET username
“Alice”

设置带有过期时间的键(SETEX = SET EXpire)

127.0.0.1:6379> SETEX cache:data 60 “some_cached_data”
OK
127.0.0.1:6379> TTL cache:data
(integer) 58

仅当键不存在时才设置(SETNX = SET iN eXistence)

127.0.0.1:6379> SETNX product:id “P001”
(integer) 1 # 成功设置
127.0.0.1:6379> SETNX product:id “P002”
(integer) 0 # 失败,因为 product:id 已存在

批量设置和获取

127.0.0.1:6379> MSET key1 “val1” key2 “val2”
OK
127.0.0.1:6379> MGET key1 key2 non_existent_key
1) “val1”
2) “val2”
3) (nil)

原子性递增/递减(常用于计数器)

127.0.0.1:6379> SET page_views 100
OK
127.0.0.1:6379> INCR page_views
(integer) 101
127.0.0.1:6379> DECR page_views
(integer) 100
127.0.0.1:6379> INCRBY page_views 50
(integer) 150
127.0.0.1:6379> DECRBY page_views 20
(integer) 130

追加字符串

127.0.0.1:6379> APPEND greet “Hello”
(integer) 5
127.0.0.1:6379> APPEND greet ” World!”
(integer) 12
127.0.0.1:6379> GET greet
“Hello World!”

获取/设置子字符串

127.0.0.1:6379> GETRANGE greet 0 4 # 获取从索引0到4的子字符串
“Hello”
127.0.0.1:6379> SETRANGE greet 6 “Redis” # 从索引6开始替换
(integer) 11
127.0.0.1:6379> GET greet
“Hello Redis”

获取字符串长度

127.0.0.1:6379> STRLEN greet
(integer) 11
“`

2.2 哈希(Hash):对象的理想选择

哈希是键值对的集合,其中键是字符串,值也是字符串。它非常适合存储对象,例如用户的个人资料信息。

主要用途: 存储对象(如用户详情、商品信息),可以将一个对象的所有属性存储在一个键下。

图解:哈希命令

“`

设置哈希字段值

127.0.0.1:6379> HSET user:100 name “Alice” age 30 city “New York”
(integer) 3 # 返回新设置的字段数量

获取哈希字段值

127.0.0.1:6379> HGET user:100 name
“Alice”
127.0.0.1:6379> HGET user:100 email # 获取不存在的字段
(nil)

批量获取哈希字段值

127.0.0.1:6379> HMGET user:100 name age city
1) “Alice”
2) “30”
3) “New York”

获取哈希所有字段和值

127.0.0.1:6379> HGETALL user:100
1) “name”
2) “Alice”
3) “age”
4) “30”
5) “city”
6) “New York”

检查字段是否存在

127.0.0.1:6379> HEXISTS user:100 name
(integer) 1
127.0.0.1:6379> HEXISTS user:100 country
(integer) 0

获取所有字段名

127.0.0.1:6379> HKEYS user:100
1) “name”
2) “age”
3) “city”

获取所有字段值

127.0.0.1:6379> HVALS user:100
1) “Alice”
2) “30”
3) “New York”

获取哈希中字段的数量

127.0.0.1:6379> HLEN user:100
(integer) 3

删除哈希字段

127.0.0.1:6379> HDEL user:100 age
(integer) 1 # 成功删除的字段数量
127.0.0.1:6379> HGETALL user:100
1) “name”
2) “Alice”
3) “city”
4) “New York”

字段值原子性递增

127.0.0.1:6379> HSET product:sku:100 stock 10
(integer) 1
127.0.0.1:6379> HINCRBY product:sku:100 stock 5
(integer) 15
“`

2.3 列表(List):有序的集合

Redis列表是一个简单的字符串列表,按照插入顺序排序。你可以从列表的头部或尾部添加或删除元素。

主要用途: 消息队列、最新动态、任务列表等。

图解:列表命令

“`

从列表左侧(头部)推入元素

127.0.0.1:6379> LPUSH mylist “c” “b” “a”
(integer) 3

此时列表为 [a, b, c]

从列表右侧(尾部)推入元素

127.0.0.1:6379> RPUSH mylist “d” “e”
(integer) 5

此时列表为 [a, b, c, d, e]

获取列表指定范围内的元素

LRANGE key start stop (start 0是第一个元素,-1是最后一个,-2是倒数第二个)

127.0.0.1:6379> LRANGE mylist 0 -1 # 获取所有元素
1) “a”
2) “b”
3) “c”
4) “d”
5) “e”
127.0.0.1:6379> LRANGE mylist 0 1
1) “a”
2) “b”

从列表左侧(头部)弹出元素

127.0.0.1:6379> LPOP mylist
“a”

此时列表为 [b, c, d, e]

从列表右侧(尾部)弹出元素

127.0.0.1:6379> RPOP mylist
“e”

此时列表为 [b, c, d]

获取列表长度

127.0.0.1:6379> LLEN mylist
(integer) 3

获取指定索引的元素

127.0.0.1:6379> LINDEX mylist 0
“b”
127.0.0.1:6379> LINDEX mylist 10 # 索引超出范围
(nil)

设置指定索引的元素值

127.0.0.1:6379> LSET mylist 0 “B_new”
OK
127.0.0.1:6379> LRANGE mylist 0 -1
1) “B_new”
2) “c”
3) “d”

移除列表中指定数量的元素

LREM key count value

count > 0: 从头部开始移除与 value 相等的 count 个元素。

count < 0: 从尾部开始移除与 value 相等的 count 绝对值个元素。

count = 0: 移除所有与 value 相等的元素。

127.0.0.1:6379> RPUSH mylist “B_new” “B_new” “c”
(integer) 6
127.0.0.1:6379> LRANGE mylist 0 -1
1) “B_new”
2) “c”
3) “d”
4) “B_new”
5) “B_new”
6) “c”
127.0.0.1:6379> LREM mylist -2 “B_new” # 从尾部移除2个 “B_new”
(integer) 2
127.0.0.1:6379> LRANGE mylist 0 -1
1) “B_new”
2) “c”
3) “d”
4) “c”

阻塞式弹出(BRPOP, BLPOP)

当列表为空时,客户端会阻塞直到有新元素被推入,或达到超时时间。

在一个新的CLI窗口中:

127.0.0.1:6379> BLPOP myqueue 0 # 0表示永不超时

等待…

在另一个CLI窗口中:

127.0.0.1:6379> RPUSH myqueue “message1”

(integer) 1

此时第一个CLI窗口会立即返回:

1) “myqueue”

2) “message1”

“`

2.4 集合(Set):无序且唯一的集合

Redis集合是字符串的无序集合。它不允许有重复的成员。

主要用途: 标签系统、共同兴趣、用户去重、交集/并集/差集计算。

图解:集合命令

“`

添加一个或多个成员到集合

127.0.0.1:6379> SADD tags:article:1 “redis” “database” “nosql”
(integer) 3
127.0.0.1:6379> SADD tags:article:1 “database” # 添加重复成员,不会增加数量
(integer) 0

获取集合所有成员

127.0.0.1:6379> SMEMBERS tags:article:1
1) “redis”
2) “database”
3) “nosql”

注意:成员顺序不固定

检查成员是否存在于集合中

127.0.0.1:6379> SISMEMBER tags:article:1 “redis”
(integer) 1
127.0.0.1:6379> SISMEMBER tags:article:1 “web”
(integer) 0

获取集合的成员数量

127.0.0.1:6379> SCARD tags:article:1
(integer) 3

从集合中移除成员

127.0.0.1:6379> SREM tags:article:1 “nosql” “web”
(integer) 1 # 返回成功移除的成员数量
127.0.0.1:6379> SMEMBERS tags:article:1
1) “redis”
2) “database”

集合的交集、并集、差集

127.0.0.1:6379> SADD user:1:interests “music” “sports” “reading”
(integer) 3
127.0.0.1:6379> SADD user:2:interests “music” “movies” “sports”
(integer) 3

交集 (共同兴趣)

127.0.0.1:6379> SINTER user:1:interests user:2:interests
1) “music”
2) “sports”

并集 (所有兴趣)

127.0.0.1:6379> SUNION user:1:interests user:2:interests
1) “music”
2) “sports”
3) “reading”
4) “movies”

差集 (user1有但user2没有的兴趣)

127.0.0.1:6379> SDIFF user:1:interests user:2:interests
1) “reading”

随机获取/弹出集合成员

127.0.0.1:6379> SRANDMEMBER user:1:interests # 随机返回一个
“sports”
127.0.0.1:6379> SRANDMEMBER user:1:interests 2 # 随机返回两个 (不重复)
1) “reading”
2) “music”
127.0.0.1:6379> SPOP user:1:interests # 随机弹出一个,并从集合中移除
“reading”
127.0.0.1:6379> SMEMBERS user:1:interests
1) “music”
2) “sports”
“`

2.5 有序集合(Sorted Set / ZSet):带分数的集合

有序集合与集合类似,但每个成员都会关联一个浮点数分数(score)。集合中的成员是唯一的,但分数可以重复。成员总是按照分数从小到大排序。

主要用途: 排行榜、带有权重的标签、优先级队列等。

图解:有序集合命令

“`

添加成员和分数到有序集合

ZADD key score member [score member …]

127.0.0.1:6379> ZADD leaderboard 100 “Alice” 85 “Bob” 120 “Charlie”
(integer) 3

如果成员已存在,其分数会被更新

按照分数范围获取成员 (从小到大)

ZRANGE key start stop [WITHSCORES]

127.0.0.1:6379> ZRANGE leaderboard 0 -1 WITHSCORES
1) “Bob”
2) “85”
3) “Alice”
4) “100”
5) “Charlie”
6) “120”

按照分数范围获取成员 (从大到小)

ZREVRANGE key start stop [WITHSCORES]

127.0.0.1:6379> ZREVRANGE leaderboard 0 -1 WITHSCORES
1) “Charlie”
2) “120”
3) “Alice”
4) “100”
5) “Bob”
6) “85”

获取指定成员的分数

127.0.0.1:6379> ZSCORE leaderboard “Alice”
“100”

增加成员的分数

127.0.0.1:6379> ZINCRBY leaderboard 5 “Bob”
“90” # Bob 的分数从85增加到90
127.0.0.1:6379> ZRANGE leaderboard 0 -1 WITHSCORES
1) “Bob”
2) “90”
3) “Alice”
4) “100”
5) “Charlie”
6) “120”

移除有序集合中的成员

127.0.0.1:6379> ZREM leaderboard “Alice”
(integer) 1
127.0.0.1:6379> ZRANGE leaderboard 0 -1
1) “Bob”
2) “Charlie”

获取有序集合的成员数量

127.0.0.1:6379> ZCARD leaderboard
(integer) 2

获取成员的排名 (从小到大,0是第一个)

127.0.0.1:6379> ZRANK leaderboard “Bob”
(integer) 0
127.0.0.1:6379> ZRANK leaderboard “Charlie”
(integer) 1

获取成员的逆序排名 (从大到小,0是第一个)

127.0.0.1:6379> ZREVRANK leaderboard “Charlie”
(integer) 0

按照分数范围获取成员数量

ZCOUNT key min max

127.0.0.1:6379> ZADD scores 60 “student1” 75 “student2” 80 “student3” 95 “student4”
(integer) 4
127.0.0.1:6379> ZCOUNT scores 70 90 # 分数在70到90之间的成员数量
(integer) 2 # student2 (75), student3 (80)
“`

第三部分:高级特性与管理命令

除了核心数据结构操作,Redis CLI还提供了强大的高级功能和服务器管理命令。

3.1 发布/订阅(Pub/Sub):实时消息传递

发布/订阅模式允许客户端发送消息(PUBLISH)到特定频道,其他订阅了该频道的客户端(SUBSCRIBE)将能接收到这些消息。

主要用途: 实时聊天、消息通知、系统广播等。

图解:Pub/Sub命令

打开两个CLI窗口

窗口A(订阅者):
127.0.0.1:6379> SUBSCRIBE news_channel
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news_channel"
3) (integer) 1

订阅者会阻塞等待消息。

窗口B(发布者):
127.0.0.1:6379> PUBLISH news_channel "Hello everyone!"
(integer) 1 # 表示有1个订阅者收到了消息
127.0.0.1:6379> PUBLISH news_channel "New update: Redis 7 released!"
(integer) 1

窗口A将立即显示:
1) "message"
2) "news_channel"
3) "Hello everyone!"
1) "message"
2) "news_channel"
3) "New update: Redis 7 released!"

PSUBSCRIBE 支持模式匹配订阅,例如 PSUBSCRIBE news.* 将订阅所有以 news. 开头的频道。

3.2 事务(Transactions):原子性操作

Redis事务允许你在一个单独的、原子性的步骤中执行一组命令。这意味着要么所有命令都执行成功,要么所有命令都不执行。

主要用途: 需要原子性执行的多个操作,例如转账、库存扣减等。

图解:事务命令

“`

开启事务

127.0.0.1:6379> MULTI
OK

将命令加入队列

127.0.0.1:6379> INCR mycount
QUEUED
127.0.0.1:6379> RPUSH mylist “item1”
QUEUED
127.0.0.1:6379> GET mycount
QUEUED

执行所有命令

127.0.0.1:6379> EXEC
1) (integer) 1 # INCR mycount 的结果
2) (integer) 1 # RPUSH mylist 的结果
3) “1” # GET mycount 的结果

放弃事务

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET key_in_transaction “value”
QUEUED
127.0.0.1:6379> DISCARD
OK
127.0.0.1:6379> GET key_in_transaction # 键没有被设置
(nil)

WATCH:实现乐观锁

监控一个或多个键,如果在事务执行前这些键被其他客户端修改,事务将被取消。

127.0.0.1:6379> WATCH my_watched_key
OK
127.0.0.1:6379> GET my_watched_key
(nil)

假设另一个CLI窗口此时 SET my_watched_key “modified_by_other”

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET my_watched_key “new_value”
QUEUED
127.0.0.1:6379> EXEC
(nil) # 事务失败,因为 my_watched_key 被修改过
“`

3.3 持久化与管理

Redis提供了RDB和AOF两种持久化方式,以及丰富的管理和监控命令。

图解:持久化与管理命令

“`

手动保存RDB快照(阻塞)

127.0.0.1:6379> SAVE
OK

后台保存RDB快照(非阻塞)

127.0.0.1:6379> BGSAVE
Background saving started

重写AOF文件(非阻塞)

127.0.0.1:6379> BGREWRITEAOF
Background AOF rewriting started

获取服务器信息和统计数据

127.0.0.1:6379> INFO

Server

redis_version:7.0.11
redis_git_sha1:00000000

Clients

connected_clients:1

Memory

used_memory:826136

Persistence

rdb_last_save_time:1678886400
aof_enabled:0

… 省略大量输出

实时监控所有命令

在一个CLI窗口中输入:

127.0.0.1:6379> MONITOR
OK

另一个CLI窗口执行命令,例如:

127.0.0.1:6379> SET mykey “hello”

此时,MONITOR窗口会显示:

1678886400.123456 [0 127.0.0.1:50000] “SET” “mykey” “hello”

配置管理

获取所有配置项或指定项

127.0.0.1:6379> CONFIG GET *

127.0.0.1:6379> CONFIG GET save
1) “save”
2) “900 1 300 10 60 10000” # 示例输出

修改配置(临时,重启Redis会失效,除非写入配置文件)

127.0.0.1:6379> CONFIG SET maxmemory 1gb
OK

查看和管理慢查询日志

SLOWLOG GET [count]:获取指定数量的慢查询日志

127.0.0.1:6379> SLOWLOG GET 2

… 输出慢查询日志详情

SLOWLOG RESET:清空慢查询日志

127.0.0.1:6379> SLOWLOG RESET
OK
“`

3.4 脚本(Scripting):Lua的强大力量

Redis通过内置的Lua解释器支持服务器端脚本。使用Lua脚本可以将多个Redis命令封装成一个原子操作,减少网络往返,提高效率。

主要用途: 复杂业务逻辑的原子化、高性能批量操作。

图解:脚本命令

“`

EVAL script numkeys key [key …] arg [arg …]

脚本示例:原子性地判断一个键是否存在,如果不存在则设置,并返回一个值。

127.0.0.1:6379> EVAL “if redis.call(‘GET’, KEYS[1]) == ARGV[1] then return redis.call(‘DEL’, KEYS[1]) else return 0 end” 1 mykey “expected_value”
(integer) 0 # 键不存在或值不匹配,返回0

127.0.0.1:6379> SET mykey “expected_value”
OK
127.0.0.1:6379> EVAL “if redis.call(‘GET’, KEYS[1]) == ARGV[1] then return redis.call(‘DEL’, KEYS[1]) else return 0 end” 1 mykey “expected_value”
(integer) 1 # 键存在且值匹配,返回1,并删除键
127.0.0.1:6379> GET mykey
(nil)

SCRIPT LOAD:加载脚本并获取SHA1摘要

127.0.0.1:6379> SCRIPT LOAD “return redis.call(‘GET’, KEYS[1])”
“fa0a6125c11086a2f3f721e25e8a719c819001b6” # 返回脚本的SHA1摘要

EVALSHA:通过SHA1摘要执行脚本

127.0.0.1:6379> SET mykey “hello”
OK
127.0.0.1:6379> EVALSHA fa0a6125c11086a2f3f721e25e8a719c819001b6 1 mykey
“hello”
“`

第四部分:提升效率:CLI使用技巧与最佳实践

掌握了命令,如何更高效、更直观地使用它们呢?

4.1 管道(Pipelining):批量发送命令

Redis是一个基于请求/响应协议的TCP服务器。这意味着客户端每次发送命令,都会等待服务器响应,造成网络延迟。管道技术允许客户端一次性发送多个命令,然后等待所有响应。

图解:Pipelining

传统方式(多次网络往返):
Client: GET key1
Server: "value1"
Client: GET key2
Server: "value2"
Client: GET key3
Server: "value3"

管道方式(一次网络往返):
Client: GET key1 \n GET key2 \n GET key3
Server: "value1" \n "value2" \n "value3"

redis-cli --pipe 实现批量插入
redis-cli 工具自带了 —pipe 选项,可以实现高效的批量数据导入。

示例: 创建一个包含多条Redis命令的文件 commands.txt
SET user:1:name Alice
SET user:1:age 30
LPUSH events "user:1 logged in"
INCR total_users

然后执行:
bash
cat commands.txt | redis-cli --pipe

这将大大加快命令的执行速度,尤其是在导入大量数据时。

4.2 模糊查询与删除结合(谨慎使用)

虽然 KEYS 不推荐在生产环境使用,但在开发或维护时,结合 xargs 可以实现一些批处理操作。

示例:删除所有以 cache: 开头的键
bash
redis-cli KEYS "cache:*" | xargs redis-cli DEL

警告: 这仍然需要 KEYS 命令执行,在大数据集上仍有风险。更安全的做法是使用 SCAN 命令分批迭代。

4.3 SCAN 命令:安全地遍历键空间

SCAN 命令是 KEYS 命令的替代品,它提供了一种迭代遍历键空间的安全方式,不会阻塞服务器。

“`
127.0.0.1:6379> SET key:1 “a”
OK
127.0.0.1:6379> SET key:2 “b”
OK
127.0.0.1:6379> SET mykey “c”
OK

第一次迭代

127.0.0.1:6379> SCAN 0 MATCH key:* COUNT 10
1) “1” # 下次迭代的游标
2) 1) “key:2”
2) “key:1”

第二次迭代(使用上次返回的游标 “1”)

127.0.0.1:6379> SCAN 1 MATCH key:* COUNT 10
1) “0” # 游标为0表示迭代完成
2) (empty array)
``
通过脚本或程序,可以反复调用
SCAN` 直到游标为0,安全地获取所有符合模式的键。

4.4 别名与快捷键(Shell环境)

在你的Shell(如Bash或Zsh)中设置别名可以简化常用或复杂的Redis命令。
“`bash

例如,设置一个别名,快速连接到生产环境Redis

alias redis_prod=’redis-cli -h prod.redis.com -p 6379 -a your_prod_password’

或者一个清除开发库的别名

alias redis_dev_flush=’redis-cli -h dev.redis.com FLUSHDB’
“`
结合Shell的历史命令功能(上箭头键),也能大大提高效率。

4.5 命令行参数的妙用

  • redis-cli --latency:测试Redis的延迟。
  • redis-cli --stat:实时显示Redis的统计信息。
  • redis-cli --raw / redis-cli --no-raw:控制输出是否为原始格式(不带引号)。
  • redis-cli -n <db_number>:连接到指定的数据库(Redis默认有16个数据库,编号从0到15)。
    $ redis-cli -n 1
    127.0.0.1:6379[1]> SET foo bar
    OK
    127.0.0.1:6379[1]> GET foo
    "bar"
    # 切换回默认数据库0
    127.0.0.1:6379[0]> GET foo
    (nil)

4.6 帮助命令

如果你忘记了某个命令的用法,HELP 命令是你的好朋友。
“`
127.0.0.1:6379> HELP SET
SET key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds timestamp|KEEPTTL] [NX|XX] [GET]
summary: Set the string value of a key
since: 1.0.0
group: string

127.0.0.1:6379> HELP @string # 查看所有字符串相关的命令
“`

总结与展望

通过本文的“图解”和详细描述,我们全面回顾了Redis CLI的各种核心命令,从基础连接和通用操作,到字符串、哈希、列表、集合、有序集合等五大核心数据结构的具体用法,再到发布/订阅、事务、持久化、脚本等高级特性,以及一系列提升CLI使用效率的技巧。

Redis CLI是理解和驾驭Redis的强大工具。直观的命令格式、实时反馈的交互模式,使其成为开发者和运维人员不可或缺的伙伴。通过不断地实践和探索,你将能够更深入地理解Redis的内部机制,更高效地解决实际问题。

当然,Redis的功能远不止于此,集群模式、各种模块的集成、更复杂的Lua脚本编写等都是值得深入学习的领域。但无论如何,牢固掌握Redis CLI是迈向这些高级应用的第一步,也是最坚实的一步。愿您在Redis的奇妙世界中,畅游无阻,高效驰骋!


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部