掌握 redis-cli:连接与基本命令的艺术
在高速发展的互联网时代,数据存储和处理的速度变得前所未有的重要。Redis,作为一个高性能的键值对数据库,以其闪电般的速度和丰富的数据结构,赢得了无数开发者和系统管理员的青睐。而与Redis进行交互的最直接、最常用、也是最核心的工具,莫过于其自带的命令行界面——redis-cli
。
redis-cli
不仅仅是一个简单的客户端工具,它是我们探索Redis内部工作机制、执行管理任务、进行实时监控、乃至编写自动化脚本的强大接口。掌握 redis-cli
的使用,是成为一名合格的Redis用户的基础,也是深入理解Redis各项功能的前提。
本文将带您详细了解如何使用 redis-cli
连接到Redis服务器,并深入探讨Redis中最常用、最基础的命令,为您打开Redis世界的大门。
第一章:初识 redis-cli 与连接艺术
redis-cli
是Redis官方提供的命令行客户端程序。在安装Redis服务器时,redis-cli
通常也会一同被安装到系统的可执行路径下。它的主要作用是发送命令给Redis服务器并显示服务器返回的结果。
1. 启动 redis-cli
打开您的终端或命令行窗口,输入 redis-cli
,然后按回车键。
bash
redis-cli
在大多数情况下,如果Redis服务器运行在本地主机(127.0.0.1
或 localhost
)的默认端口(6379
)上,redis-cli
会尝试连接到这个默认地址。连接成功后,您将看到类似如下的提示符:
127.0.0.1:6379>
这个提示符表明您已成功连接到运行在本地、端口为6379的Redis服务器,并且当前操作的数据库是编号为0的数据库(Redis默认有16个数据库,编号从0到15)。
2. 连接指定服务器
如果您的Redis服务器不在本地,或者使用了非默认端口,您需要通过参数指定连接信息。
-
指定主机和端口: 使用
-h
参数指定主机名或IP地址,使用-p
参数指定端口号。bash
redis-cli -h 192.168.1.100 -p 6380这将尝试连接到IP地址为
192.168.1.100
,端口为6380
的Redis服务器。 -
连接需要密码认证的服务器: 如果您的Redis服务器配置了密码认证,您可以使用
-a
参数跟随密码。bash
redis-cli -h 192.168.1.100 -p 6380 -a your_password注意: 在命令行直接输入密码可能存在安全风险(例如,密码可能被终端历史记录或进程列表捕获)。更安全的方式是先连接,然后在交互模式下使用
AUTH password
命令进行认证:“`bash
redis-cli -h 192.168.1.100 -p 6380连接成功后,在提示符下输入:
AUTH your_password
“`如果密码正确,服务器会返回
OK
。如果错误,会返回错误信息。 -
连接指定数据库: Redis支持多数据库,默认连接的是DB 0。您可以使用
-n
参数指定要连接的数据库编号(0-15)。bash
redis-cli -h 192.168.1.100 -p 6380 -n 1这将连接到编号为1的数据库。在交互模式下,您也可以随时使用
SELECT db_index
命令切换数据库。127.0.0.1:6379> SELECT 2
OK
127.0.0.1:6381[2]>注意提示符的变化,它现在显示连接的是数据库2。
-
通过Unix域套接字连接: 在Linux/macOS等系统上,Redis也可以配置为通过Unix域套接字进行通信,这通常比TCP/IP连接更快且更安全(因为它只在本地文件系统可见)。使用
-s
参数指定套接字文件路径。bash
redis-cli -s /var/run/redis/redis.sock
3. 连接失败的处理
如果您尝试连接时遇到问题,redis-cli
会输出错误信息,例如:
Could not connect to Redis at 127.0.0.1:6379: Connection refused
这通常意味着:
- Redis服务器没有运行。
- Redis服务器正在运行,但监听的不是您尝试连接的地址和端口。检查Redis的配置文件(
redis.conf
)中的bind
和port
设置。 - 防火墙阻止了连接。确保客户端和服务器之间的端口是开放的。
- 服务器达到了最大连接数限制。
检查这些常见问题通常可以解决连接故障。
4. 退出交互模式
在 redis-cli
的交互模式下,您可以输入 exit
或 quit
命令来断开连接并退出程序。
127.0.0.1:6379> exit
或者直接按下 Ctrl + C
组合键也可以退出。
第二章:Redis 命令基础:键 (Keys) 的管理
成功连接到Redis后,我们就可以开始发送命令了。Redis命令的基本格式通常是:COMMAND key [argument1] [argument2] ...
。命令名称和键是必须的,后面的参数取决于具体的命令。Redis命令不区分大小写(SET
和 set
是等效的),但是键名是区分大小写的(mykey
和 MyKey
是不同的键)。
首先,我们从Redis最核心的概念——键(Key)开始,学习如何管理它们。
1. SET 和 GET:存取基本值
这是最基础的两个命令,用于存储和获取字符串类型的值。
-
SET key value: 设置指定键的值。如果键已存在,其旧值将被覆盖。
127.0.0.1:6379> SET mykey "hello redis"
OK -
GET key: 获取指定键的值。如果键不存在,返回
nil
(表示空值)。127.0.0.1:6379> GET mykey
"hello redis"
127.0.0.1:6379> GET anotherkey
(nil)
2. DEL:删除键
-
DEL key [key …]: 删除指定的键。可以删除一个或多个键。返回成功删除的键的数量。
127.0.0.1:6379> SET key1 "value1"
OK
127.0.0.1:6379> SET key2 "value2"
OK
127.0.0.1:6379> DEL key1 key2 anotherkey
(integer) 2
127.0.0.1:6379> GET key1
(nil)
3. EXISTS:检查键是否存在
-
EXISTS key [key …]: 检查指定的一个或多个键是否存在。返回存在的键的数量。
127.0.0.1:6379> SET mykey "hello"
OK
127.0.0.1:6379> EXISTS mykey
(integer) 1
127.0.0.1:6379> EXISTS anotherkey
(integer) 0
127.0.0.1:6379> EXISTS mykey anotherkey
(integer) 1
4. TYPE:获取键的数据类型
-
TYPE key: 返回键存储的值的数据类型。可能的返回值包括
string
,list
,set
,zset
(sorted set),hash
,stream
。如果键不存在,返回none
。127.0.0.1:6379> SET mykey "hello"
OK
127.0.0.1:6379> TYPE mykey
string
127.0.0.1:6379> LPUSH mylist 1 2 3
(integer) 3
127.0.0.1:6379> TYPE mylist
list
127.0.0.1:6379> TYPE non_existent_key
none
5. KEYS:查找所有符合给定模式的键
-
KEYS pattern: 查找所有符合给定模式的键。模式支持 glob 风格的通配符:
*
:匹配任意数量的任意字符(包括零个)。?
:匹配恰好一个任意字符。[chars]
:匹配字符集中的任意一个字符。[^chars]
:匹配不在字符集中的任意一个字符。
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> SET product:101:price "19.99"
OK
127.0.0.1:6379> KEYS *
1) "user:1:name"
2) "product:101:price"
3) "user:2:name"
127.0.0.1:6379> KEYS user:*
1) "user:1:name"
2) "user:2:name"
127.0.0.1:6379> KEYS user:?:name
1) "user:1:name"
2) "user:2:name"重要警告:
KEYS
命令会遍历数据库中的所有键,这在大生产环境的数据库中可能导致服务器阻塞,影响性能。 在生产环境中应尽量避免使用KEYS
命令,特别是对于大型数据库。 如果需要在生产环境中进行模式匹配查找,推荐使用SCAN
命令,它通过游标分步迭代,不会阻塞服务器。
6. EXPIRE / PEXPIRE / TTL / PTTL / PERSIST:设置和管理键的过期时间
Redis强大的特性之一是为键设置过期时间(TTL – Time To Live),过期后键会被自动删除,这在缓存场景中非常有用。
- EXPIRE key seconds: 设置键在指定的秒数后过期。
- PEXPIRE key milliseconds: 设置键在指定的毫秒数后过期。
- TTL key: 获取键剩余的过期时间,单位为秒。
- 返回正整数:键剩余的过期秒数。
- 返回
-1
:键存在但没有设置过期时间(永久有效)。 - 返回
-2
:键不存在。
- PTTL key: 获取键剩余的过期时间,单位为毫秒。
- 返回正整数:键剩余的过期毫秒数。
- 返回
-1
:键存在但没有设置过期时间(永久有效)。 - 返回
-2
:键不存在。
-
PERSIST key: 移除键的过期时间,使其变为永久有效。
127.0.0.1:6379> SET mykey "hello"
OK
127.0.0.1:6379> EXPIRE mykey 60 # 设置 mykey 60秒后过期
(integer) 1
127.0.0.1:6379> TTL mykey
(integer) 58 # 可能的值,会递减
127.0.0.1:6379> PTTL mykey
(integer) 58734 # 可能的值,会递减
127.0.0.1:6379> PERSIST mykey # 移除过期时间
(integer) 1
127.0.0.1:6379> TTL mykey
(integer) -1
127.0.0.1:6379> GET non_existent_key
(nil)
127.0.0.1:6379> TTL non_existent_key
(integer) -2
7. RENAME:重命名键
-
RENAME key newkey: 将键重命名为
newkey
。如果newkey
已经存在,其关联的值会被覆盖。127.0.0.1:6379> SET oldname "some value"
OK
127.0.0.1:6379> RENAME oldname newname
OK
127.0.0.1:6379> GET oldname
(nil)
127.0.0.1:6379> GET newname
"some value"
第三章:探索基本数据类型命令
Redis不仅仅是简单的键值存储,它支持多种复杂的数据结构。redis-cli
提供了与这些数据结构交互的丰富命令。我们将介绍最常用的五种:字符串 (String)、列表 (List)、哈希 (Hash)、集合 (Set) 和有序集合 (Sorted Set)。
1. 字符串 (String)
字符串是Redis最基本的数据类型,可以存储文本、数字(可以通过 INCR
等命令进行原子操作)或二进制数据。
SET key value
:设置键值。GET key
:获取键值。DEL key
:删除键。EXISTS key
:检查键是否存在。TYPE key
:获取类型,返回string
。- INCR key / DECR key: 对存储的数字字符串值进行原子递增/递减1。如果键不存在,会先设置为0再执行操作。
- INCRBY key increment / DECRBY key decrement: 对存储的数字字符串值进行原子递增/递减指定的增量/减量。
- APPEND key value: 如果键存在,将
value
追加到其值的末尾。如果键不存在,创建一个新的字符串键,其值为value
。 -
STRLEN key: 返回键存储的字符串值的长度。
127.0.0.1:6379> SET counter 10
OK
127.0.0.1:6379> INCR counter
(integer) 11
127.0.0.1:6379> INCRBY counter 5
(integer) 16
127.0.0.1:6379> APPEND greeting "Hello"
(integer) 5 # 返回新的字符串长度
127.0.0.1:6379> APPEND greeting " World!"
(integer) 12
127.0.0.1:6379> GET greeting
"Hello World!"
127.0.0.1:6379> STRLEN greeting
(integer) 12
2. 列表 (List)
列表是按照插入顺序排序的字符串元素的集合。可以在列表的两端进行快速的存取操作(类似于栈或队列)。
LPUSH key element [element ...]:
将一个或多个元素从列表的左侧(头部)插入。RPUSH key element [element ...]:
将一个或多个元素从列表的右侧(尾部)插入。LPOP key:
移除并返回列表最左侧(头部)的元素。RPOP key:
移除并返回列表最右侧(尾部)的元素。LRANGE key start stop:
获取列表中指定范围内的元素。索引从0开始,可以是负数(-1表示最后一个元素,-2表示倒数第二个)。LRANGE mylist 0 -1
返回列表的所有元素。LLEN key:
返回列表的长度。-
LINDEX key index:
获取列表中指定索引的元素。127.0.0.1:6379> RPUSH mylist "a" "b" "c"
(integer) 3
127.0.0.1:6379> LPUSH mylist "x"
(integer) 4
127.0.0.1:6379> LRANGE mylist 0 -1
1) "x"
2) "a"
3) "b"
4) "c"
127.0.0.1:6379> LLEN mylist
(integer) 4
127.0.0.1:6379> LPOP mylist
"x"
127.0.0.1:6379> RPOP mylist
"c"
127.0.0.1:6379> LRANGE mylist 0 -1
1) "a"
2) "b"
3. 哈希 (Hash)
哈希是一个将字段(field)映射到值(value)的无序散列表。类似于关系数据库中的一行记录,或者编程语言中的对象/字典。
HSET key field value [field value ...]:
设置哈希中一个或多个字段的值。如果哈希不存在,会创建一个新的。HGET key field:
获取哈希中指定字段的值。HGETALL key:
获取哈希中所有字段和值。HDEL key field [field ...]:
删除哈希中一个或多个字段。HEXISTS key field:
检查哈希中指定字段是否存在。HLEN key:
返回哈希中字段的数量。HKEYS key:
返回哈希中所有字段名。-
HVALS key:
返回哈希中所有字段值。127.0.0.1:6379> HSET user:1 name "Alice" age 30 city "New York"
(integer) 3
127.0.0.1:6379> HGET user:1 name
"Alice"
127.0.0.1:6379> HGETALL user:1
1) "name"
2) "Alice"
3) "age"
4) "30"
5) "city"
6) "New York"
127.0.0.1:6379> HEXISTS user:1 email
(integer) 0
127.0.0.1:6379> HLEN user:1
(integer) 3
127.0.0.1:6379> HDEL user:1 city
(integer) 1
127.0.0.1:6379> HGETALL user:1
1) "name"
2) "Alice"
3) "age"
4) "30"
4. 集合 (Set)
集合是无序的字符串元素的集合,集合中的元素是唯一的,不允许重复。集合非常适合存储不重复的成员,并可以进行成员关系测试、交集、并集、差集等操作。
SADD key member [member ...]:
将一个或多个成员添加到集合中。如果成员已存在,将被忽略。返回成功添加的新成员数量。SMEMBERS key:
返回集合中的所有成员。注意顺序是不确定的。SISMEMBER key member:
检查指定成员是否是集合的成员。是则返回1,否则返回0。SREM key member [member ...]:
移除集合中的一个或多个成员。-
SCARD key:
返回集合的成员数量(基数)。127.0.0.1:6379> SADD myset "apple" "banana" "cherry" "apple"
(integer) 3 # "apple" 添加了两次,但只算一次
127.0.0.1:6379> SMEMBERS myset
1) "cherry"
2) "apple"
3) "banana" # 顺序可能不同
127.0.0.1:6379> SISMEMBER myset "banana"
(integer) 1
127.0.0.1:6379> SISMEMBER myset "grape"
(integer) 0
127.0.0.1:6379> SCARD myset
(integer) 3
127.0.0.1:6379> SREM myset "banana" "grape"
(integer) 1 # "grape" 不存在,所以只移除了 "banana"
127.0.0.1:6379> SMEMBERS myset
1) "cherry"
2) "apple"
5. 有序集合 (Sorted Set)
有序集合(ZSet)类似于集合,但每个成员都会关联一个分数(score,浮点数)。集合中的成员是唯一的,但分数可以重复。有序集合中的元素总是按照其分数进行排序。这使得有序集合非常适合实现排行榜、带优先级队列等功能。
ZADD key score member [score member ...]:
将一个或多个成员及其分数添加到有序集合中。如果成员已存在,其分数会被更新。返回成功添加(或更新分数)的新成员数量。ZRANGE key start stop [WITHSCORES]:
按照元素的分数升序排列,获取指定排名范围内的成员。索引从0开始,可以是负数。WITHSCORES
参数可选,用于同时返回分数。ZREVRANGE key start stop [WITHSCORES]:
按照元素的分数降序排列,获取指定排名范围内的成员。ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]:
按照元素的分数升序排列,获取分数在指定范围[min, max]
内的成员。LIMIT
用于分页。ZREM key member [member ...]:
移除有序集合中的一个或多个成员。ZCARD key:
返回有序集合的成员数量。ZSCORE key member:
返回指定成员的分数。-
ZRANK key member / ZREVRANK key member:
返回指定成员在有序集合中的排名(索引),升序/降序。排名从0开始。127.0.0.1:6379> ZADD myzset 100 "Alice" 90 "Bob" 120 "Charlie"
(integer) 3
127.0.0.1:6379> ZADD myzset 105 "David" # 添加新成员
(integer) 1
127.0.0.1:6379> ZRANGE myzset 0 -1 WITHSCORES # 升序获取所有成员及分数
1) "Bob"
2) "90"
3) "Alice"
4) "100"
5) "David"
6) "105"
7) "Charlie"
8) "120"
127.0.0.1:6379> ZREVRANGE myzset 0 1 WITHSCORES # 降序获取排名前2的成员
1) "Charlie"
2) "120"
3) "David"
4) "105"
127.0.0.1:6379> ZSCORE myzset "Alice"
"100"
127.0.0.1:6379> ZCARD myzset
(integer) 4
127.0.0.1:6379> ZREM myzset "Bob"
(integer) 1
127.0.0.1:6379> ZCARD myzset
(integer) 3
第四章:redis-cli 的其他实用模式与命令
除了交互模式和数据结构命令,redis-cli
还有一些非常实用的模式和命令。
1. 执行单条命令
您可以在不进入交互模式的情况下,直接在命令行执行一条Redis命令:
bash
redis-cli GET mykey
这将连接到默认服务器,执行 GET mykey
命令,输出结果,然后立即退出。这种方式适合在脚本中执行少量命令。
2. 批量执行命令
可以使用 echo
或文件重定向将多条命令通过管道传递给 redis-cli
进行批量执行。
-
使用 echo:
bash
echo -e "SET key1 value1\nSET key2 value2\nGET key1" | redis-cli-e
参数用于启用转义字符(如\n
换行)。 -
使用文件: 将多条命令写入一个文件(例如
commands.txt
),每行一条命令。“`bash
commands.txt 内容
SET key1 value1
GET key1
DEL key1
GET key1
“`bash
redis-cli < commands.txt这种方式可以执行大量命令,但需要注意错误处理和输出解析。
3. 输出格式控制
-
–raw: 以原始格式输出服务器响应,不进行美化处理。这对于脚本处理输出非常有用。
“`bash
redis-cli –raw GET mykey输出:hello redis
“`
对比:
“`bash
redis-cli GET mykey输出:”hello redis”
“`
注意引号的区别。
-
–csv: 以CSV格式输出响应。
“`bash
redis-cli –csv KEYS “*”输出:user:1:name,product:101:price,user:2:name,…
“`
4. MONITOR 命令
MONITOR
命令用于实时监控服务器接收到的所有命令。这对于调试非常有用。
127.0.0.1:6379> MONITOR
OK
之后,任何发送到此Redis服务器的命令及其参数都将实时打印到 redis-cli
的终端上,例如:
1678886400.123456 [0 127.0.0.1:12345] "SET" "anotherkey" "somevalue"
1678886401.789012 [0 127.0.0.1:12346] "GET" "mykey"
警告: MONITOR
命令会向客户端发送大量数据,在高流量的生产环境中可能对服务器性能产生显著影响,甚至导致服务器变慢。应谨慎使用。
5. INFO 命令
INFO
命令用于获取Redis服务器的各种信息和统计数据,是诊断服务器状态的重要工具。
“`
127.0.0.1:6379> INFO
Server
redis_version:7.0.11
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:e2c8880007682186
…
Clients
connected_clients:1
client_recent_max_input_buf:26
client_recent_max_output_buf:0
…
Memory
used_memory:1048576
used_memory_human:1M
used_memory_rss:2097152
…
Stats
total_connections_received:100
total_commands_processed:500
…
“`
INFO
命令可以带参数,获取特定部分的信息,例如 INFO memory
, INFO stats
等。
6. CLIENT LIST 命令
CLIENT LIST
命令用于列出连接到Redis服务器的所有客户端的信息。
127.0.0.1:6379> CLIENT LIST
id=3 addr=127.0.0.1:54321 fd=7 name= age=10 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client list
输出包含每个客户端的ID、地址、文件描述符、名称、连接时长、空闲时长、标志、当前数据库、订阅/发布频道数、事务状态、缓冲区大小、内存使用、事件类型以及最后执行的命令等信息,对于排查连接问题或监控客户端活动非常有用。
第五章:使用 redis-cli 的最佳实践与提示
- 熟悉帮助命令: 在交互模式下,输入
HELP
可以查看所有命令的列表。输入HELP command_name
(例如HELP SET
) 可以查看特定命令的详细用法和参数说明。 - 避免在生产环境使用
KEYS *
: 重复强调,这个命令会阻塞服务器。如果需要查找键,考虑使用SCAN
命令族。 - 利用
--raw
进行脚本编程: 当您需要编写脚本解析redis-cli
的输出时,使用--raw
可以获得更易于解析的原始数据。 - 理解数据结构的复杂度: 不同的Redis命令具有不同的时间复杂度(O(1), O(log N), O(N) 等)。在设计数据模型时,需要考虑常用操作的时间复杂度,避免使用高复杂度命令处理大量数据,以免影响性能。例如,
LRANGE
的时间复杂度是 O(S+N),其中 S 是起始索引,N 是返回元素的数量,而LLEN
是 O(1)。 - 使用
AUTH
命令进行认证: 如果服务器配置了密码,优先在连接后使用AUTH
命令,而不是通过命令行参数-a
直接暴露密码。 - 合理使用数据库: Redis的数据库(DB 0-15)提供了一种简单的隔离机制,可以用于区分不同的应用或环境的数据。但更推荐在键名中使用命名空间(例如
app1:user:1
,app2:product:100
)来实现更好的隔离和管理。 - 为客户端命名: 使用
CLIENT SETNAME name
命令为您的客户端连接设置一个有意义的名称,这样在使用CLIENT LIST
命令时更容易识别不同的客户端。
总结
redis-cli
是连接和管理Redis服务器不可或缺的工具。通过掌握它的连接方式和基本命令,您可以:
- 轻松连接到本地或远程的Redis实例。
- 执行常用的数据存储、获取、删除和管理操作。
- 与字符串、列表、哈希、集合、有序集合等核心数据结构交互。
- 检查键的类型和是否存在,管理键的过期时间。
- 利用
INFO
和CLIENT LIST
命令获取服务器状态和客户端信息。 - 使用
MONITOR
进行实时命令流监控(需谨慎)。
本文仅仅触及了 redis-cli
和 Redis 命令世界的冰山一角。Redis拥有数百个命令,涵盖了事务、发布/订阅、Lua脚本、模块等等更高级的功能。但是,牢固掌握连接方式和本文介绍的基础命令,是您深入学习和高效使用Redis的基石。
现在,打开您的终端,启动 redis-cli
,开始您的Redis探索之旅吧!通过实践,您将越来越熟练地运用这些命令,释放Redis的强大潜能。