Redis CLI 基础与高级命令:一篇搞定
Redis(Remote Dictionary Server)是一个开源的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息代理。Redis 以其高性能、灵活性和对多种数据结构的支持而闻名。与 Redis 交互最常见的方式之一就是通过其命令行接口(CLI),即 redis-cli。
本文将详细介绍 redis-cli 的基础和高级用法,帮助你全面掌握 Redis 的操作。
1. redis-cli 连接与基本操作
1.1 连接 Redis 服务器
redis-cli 命令默认连接到本地主机 127.0.0.1 的 6379 端口。
-
默认连接:
bash
redis-cli -
连接指定主机和端口:
bash
redis-cli -h <host> -p <port>
例如:
bash
redis-cli -h 192.168.1.100 -p 6380 -
使用密码认证:
如果你的 Redis 服务器设置了密码,可以使用-a或--askpass参数。
bash
redis-cli -a <password>
# 或者
redis-cli --askpass
--askpass会在连接时提示你输入密码,这更安全,因为密码不会保留在你的 shell 历史记录中。 -
选择数据库:
Redis 支持多个数据库(默认为 16 个,编号 0-15)。你可以使用-n参数指定连接的数据库。
bash
redis-cli -n <db_number>
例如,连接到数据库 1:
bash
redis-cli -n 1
连接后也可以使用SELECT <db_number>命令切换数据库。
1.2 redis-cli 模式
redis-cli 可以运行在两种模式下:
-
交互模式 (Interactive Mode):
这是最常用的模式。当你直接运行redis-cli时进入此模式,可以在命令行中输入 Redis 命令,并实时看到结果。
bash
redis-cli
127.0.0.1:6379> PING
PONG
127.0.0.1:6379> SET mykey "Hello Redis"
OK
127.0.0.1:6379> GET mykey
"Hello Redis"
输入EXIT或QUIT退出交互模式。 -
命令行模式 (Command Line Mode):
你可以在单个redis-cli命令中直接执行一个 Redis 命令,然后程序退出。这对于脚本化操作非常有用。
bash
redis-cli PING
PONG
redis-cli GET mykey
"Hello Redis"
2. 基础数据类型与命令
Redis 支持五种主要的基础数据类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)和 Sorted Set(有序集合)。
2.1 String(字符串)
SET key value: 设置指定键的值。
bash
SET name "Alice"GET key: 获取指定键的值。
bash
GET name
# "Alice"DEL key: 删除指定键。
bash
DEL nameEXISTS key: 检查键是否存在。
bash
EXISTS name # 返回 0 或 1INCR key/DECR key: 将键存储的整数值递增/递减 1。
bash
SET counter 10
INCR counter # 11
DECR counter # 10MSET key1 value1 [key2 value2 ...]: 同时设置多个键值对。
bash
MSET user:1:name "Bob" user:1:age 30MGET key1 [key2 ...]: 同时获取多个键的值。
bash
MGET user:1:name user:1:age
# 1) "Bob"
# 2) "30"SETEX key seconds value: 设置键值并指定过期时间(秒)。
bash
SETEX mykey 10 "will expire in 10s"GETSET key value: 设置新值并返回旧值。
bash
SET mykey "old value"
GETSET mykey "new value" # "old value"
GET mykey # "new value"
2.2 Hash(哈希)
Hash 是一种键值对的集合,适用于存储对象。
HSET key field value [field value ...]: 设置哈希表中指定字段的值。
bash
HSET user:1 name "Alice" age 30 email "[email protected]"HGET key field: 获取哈希表中指定字段的值。
bash
HGET user:1 name # "Alice"HMGET key field1 [field2 ...]: 获取哈希表中多个字段的值。
bash
HMGET user:1 name age
# 1) "Alice"
# 2) "30"HGETALL key: 获取哈希表中所有字段和值。
bash
HGETALL user:1
# 1) "name"
# 2) "Alice"
# 3) "age"
# 4) "30"
# 5) "email"
# 6) "[email protected]"HDEL key field1 [field2 ...]: 删除哈希表中一个或多个字段。
bash
HDEL user:1 emailHLEN key: 获取哈希表中字段的数量。
bash
HLEN user:1 # 2HINCRBY key field increment: 哈希表中指定字段的整数值增加指定量。
bash
HINCRBY user:1 age 1 # 31
2.3 List(列表)
List 是一个字符串元素组成的有序序列,可以从两端添加或删除元素。
LPUSH key value1 [value2 ...]: 将一个或多个值插入到列表的头部。
bash
LPUSH mylist "itemC" "itemB" "itemA"RPUSH key value1 [value2 ...]: 将一个或多个值插入到列表的尾部。
bash
RPUSH mylist "itemD"LRANGE key start stop: 获取列表中指定范围的元素。
bash
LRANGE mylist 0 -1 # 获取所有元素
# 1) "itemA"
# 2) "itemB"
# 3) "itemC"
# 4) "itemD"LPOP key: 移除并返回列表的第一个元素。
bash
LPOP mylist # "itemA"RPOP key: 移除并返回列表的最后一个元素。
bash
RPOP mylist # "itemD"LLEN key: 获取列表的长度。
bash
LLEN mylist # 2LINDEX key index: 通过索引获取列表中的元素。
bash
LINDEX mylist 0 # "itemB"LREM key count value: 从列表中移除指定数量的指定值元素。
bash
RPUSH tasks "task1" "task2" "task1"
LREM tasks 1 "task1" # 移除一个 "task1"
2.4 Set(集合)
Set 是一个无序的、不重复的字符串元素集合。
SADD key member1 [member2 ...]: 将一个或多个成员添加到集合中。
bash
SADD myset "apple" "banana" "orange" "apple" # "apple" 只会添加一次SMEMBERS key: 获取集合中的所有成员。
bash
SMEMBERS myset
# 1) "apple"
# 2) "banana"
# 3) "orange"SISMEMBER key member: 检查成员是否是集合的成员。
bash
SISMEMBER myset "apple" # 1
SISMEMBER myset "grape" # 0SCARD key: 获取集合的成员数量。
bash
SCARD myset # 3SPOP key [count]: 随机移除并返回集合中的一个或多个成员。
bash
SPOP myset # "banana" (每次可能不同)SREM key member1 [member2 ...]: 移除集合中的一个或多个成员。
bash
SREM myset "orange"SUNION key1 [key2 ...]: 返回给定所有集合的并集。SINTER key1 [key2 ...]: 返回给定所有集合的交集。SDIFF key1 [key2 ...]: 返回给定所有集合的差集。
2.5 Sorted Set(有序集合)
Sorted Set 与 Set 类似,也是不重复的字符串元素集合,但每个成员都关联一个分数(score),集合中的成员根据分数进行排序。
ZADD key score1 member1 [score2 member2 ...]: 将一个或多个成员及其分数添加到有序集合。
bash
ZADD myzset 100 "Alice" 90 "Bob" 80 "Charlie"ZRANGE key start stop [WITHSCORES]: 返回有序集合中指定范围内的成员。
bash
ZRANGE myzset 0 -1 WITHSCORES
# 1) "Charlie"
# 2) "80"
# 3) "Bob"
# 4) "90"
# 5) "Alice"
# 6) "100"ZREVRANGE key start stop [WITHSCORES]: 逆序返回有序集合中指定范围内的成员。
bash
ZREVRANGE myzset 0 1 WITHSCORES
# 1) "Alice"
# 2) "100"
# 3) "Bob"
# 4) "90"ZSCORE key member: 返回有序集合中指定成员的分数。
bash
ZSCORE myzset "Bob" # "90"ZREM key member1 [member2 ...]: 移除有序集合中的一个或多个成员。
bash
ZREM myzset "Charlie"ZCARD key: 获取有序集合的成员数量。
bash
ZCARD myzset # 2ZINCRBY key increment member: 增加有序集合中指定成员的分数。
bash
ZINCRBY myzset 5 "Bob" # 95ZRANK key member: 返回有序集合中成员的排名(从 0 开始)。
bash
ZRANK myzset "Bob" # 0 (因为 Alice 现在分数最高,Bob 次之)ZCOUNT key min max: 返回有序集合中分数在指定范围内的成员数量。
3. 高级命令与特性
3.1 键管理
KEYS pattern: 查找所有符合给定模式的键。
注意: 在生产环境中应谨慎使用KEYS命令,因为它可能会阻塞服务器,尤其是在键数量庞大的情况下。
bash
KEYS * # 所有键
KEYS user:* # 所有以 "user:" 开头的键TYPE key: 返回键存储的数据类型。
bash
TYPE mykey # string
TYPE mylist # listTTL key: 返回键的剩余生存时间(秒)。
bash
SETEX mykey 60 "expire soon"
TTL mykey # 返回剩余秒数PERSIST key: 移除键的过期时间,使其变为永久性。
bash
PERSIST mykeyEXPIRE key seconds: 为现有键设置过期时间(秒)。
bash
EXPIRE mykey 30RENAME key newkey: 重命名键。
bash
RENAME oldname newnameRANDOMKEY: 从当前数据库中随机返回一个键。
3.2 事务 (Transactions)
Redis 事务允许你在一个单独的、隔离的步骤中执行一组命令。
MULTI: 标记一个事务块的开始。EXEC: 执行所有在MULTI之后排队的命令。DISCARD: 取消事务,放弃所有在MULTI之后排队的命令。WATCH key [key ...]: 监视一个或多个键。如果在EXEC执行之前,被监视的键被其他客户端修改,则事务被取消。
示例:
bash
MULTI
SET mykey "value1"
GET mykey
LPUSH mylist "item"
EXEC
如果 mykey 在 WATCH 之后 EXEC 之前被修改,那么整个事务将失败。
3.3 发布/订阅 (Pub/Sub)
Redis 的 Pub/Sub 机制允许客户端订阅频道,并接收发布到这些频道的消息。
PUBLISH channel message: 将消息发布到指定频道。
bash
PUBLISH news "Breaking News: Redis is awesome!"SUBSCRIBE channel1 [channel2 ...]: 订阅一个或多个频道。
当一个客户端执行SUBSCRIBE命令后,它将进入订阅模式,只能接收消息,不能执行其他 Redis 命令。
bash
SUBSCRIBE newsPSUBSCRIBE pattern1 [pattern2 ...]: 订阅符合给定模式的频道。
例如PSUBSCRIBE news.*会订阅所有以news.开头的频道。UNSUBSCRIBE [channel1 ...]: 取消订阅指定频道。PUNSUBSCRIBE [pattern1 ...]: 取消订阅符合指定模式的频道。
3.4 持久化
Redis 支持 RDB (Redis Database) 和 AOF (Append Only File) 两种持久化方式。
SAVE: 阻塞式保存,在主进程中执行,会阻塞所有客户端请求。BGSAVE: 非阻塞式保存,在后台进程中执行,不会阻塞客户端请求。
bash
BGSAVE # 返回 OK,表示后台保存开始BGREWRITEAOF: 对 AOF 文件进行重写,使其更紧凑。
bash
BGREWRITEAOF
3.5 脚本 (Lua Scripting)
Redis 允许你使用 Lua 脚本在服务器端原子性地执行多个命令,这有助于减少网络延迟和保证操作的原子性。
EVAL script numkeys key [key ...] arg [arg ...]: 执行 Lua 脚本。
bash
EVAL "return redis.call('set', KEYS[1], ARGV[1])" 1 mykey "hello lua"SCRIPT LOAD script: 将脚本加载到 Redis 脚本缓存中,返回 SHA1 校验和。EVALSHA sha1 numkeys key [key ...] arg [arg ...]: 通过 SHA1 校验和执行缓存中的脚本。SCRIPT EXISTS sha1 [sha1 ...]: 检查脚本是否已加载。SCRIPT FLUSH: 清空脚本缓存。SCRIPT KILL: 杀死正在执行的 Lua 脚本(如果它没有执行写操作)。
3.6 慢查询日志
Redis 可以记录执行时间超过指定阈值的命令。
SLOWLOG GET [count]: 获取慢查询日志。SLOWLOG LEN: 获取慢查询日志的长度。SLOWLOG RESET: 清空慢查询日志。
3.7 服务器信息与管理
INFO [section]: 获取 Redis 服务器的各种信息和统计数据。
bash
INFO # 获取所有信息
INFO Memory # 获取内存信息
INFO Clients # 获取客户端连接信息MONITOR: 实时打印 Redis 服务器接收到的所有命令。
注意: 在生产环境中应谨慎使用MONITOR,因为它可能会影响性能。CLIENT LIST: 列出所有连接到服务器的客户端。CLIENT KILL [ip:port]: 关闭指定客户端连接。SHUTDOWN [NOSAVE] [SAVE]: 关闭 Redis 服务器。SHUTDOWN: 默认会进行SAVE操作。SHUTDOWN NOSAVE: 不保存数据即关闭。SHUTDOWN SAVE: 保存数据后关闭。
CONFIG GET parameter/CONFIG SET parameter value: 获取或设置 Redis 配置参数。
bash
CONFIG GET maxmemory
CONFIG SET maxmemory 1gbFLUSHALL: 清空所有数据库的所有键。
警告: 这是一个非常危险的命令,在生产环境中务必小心使用!FLUSHDB: 清空当前数据库的所有键。
警告: 这是一个非常危险的命令,在生产环境中务必小心使用!
4. redis-cli 实用功能
4.1 pipelining (管道)
redis-cli 支持管道功能,可以将多个命令一次性发送到服务器,然后一次性接收所有回复,从而减少网络往返时间(RTT)。
你可以将命令列表写入文件,然后通过管道将其发送给 redis-cli:
bash
(echo "SET key1 value1"; echo "GET key1"; echo "INCR counter") | redis-cli --pipe
或者直接在命令行中使用 here-string/here-document:
bash
redis-cli --pipe <<EOF
SET mykey "pipelined value"
GET mykey
PING
EOF
4.2 --rdb 和 --scan
redis-cli --rdb <filename>: 将 Redis 数据库以 RDB 格式保存到指定文件。这对于备份和迁移很有用。redis-cli --scan: 结合SCAN命令,以流式方式迭代 Redis 数据库中的键,避免KEYS命令可能导致的阻塞问题。
bash
redis-cli --scan --pattern "user:*"
4.3 --latency 和 --stat
redis-cli --latency: 监测 Redis 服务器的延迟,提供实时统计信息。
bash
redis-cli --latencyredis-cli --stat: 实时显示 Redis 服务器的统计信息,如内存使用、连接数、QPS 等。
bash
redis-cli --stat
4.4 --intrinsic-latency <seconds>
测量 Redis 所在系统自身固有延迟的工具,有助于诊断性能问题。
bash
redis-cli --intrinsic-latency 5
总结
redis-cli 是一个功能强大且灵活的工具,无论是进行日常开发、调试还是系统管理,它都是与 Redis 交互不可或缺的。从基本的键值操作到高级的事务、发布/订阅和脚本,再到各种监控和管理命令,掌握这些 redis-cli 命令将大大提高你使用 Redis 的效率。
请记住,在生产环境中操作 Redis 时,尤其是涉及到 KEYS、FLUSHALL、FLUSHDB 等命令时,务必谨慎,以免造成数据丢失或性能问题。