掌握 Redis CLI:常用命令及高级技巧
Redis (Remote Dictionary Server) 是一个开源的、内存中的数据结构存储系统,可以用作数据库、缓存和消息代理。它以其卓越的性能、灵活的数据结构和丰富的功能集而闻名。掌握 Redis 命令行界面(CLI)是与 Redis 实例交互、管理数据和诊断问题的核心技能。
本文将详细介绍 Redis CLI 的常用命令,并深入探讨一些高级技巧,帮助您更高效、更安全地利用 Redis。
一、Redis CLI 基础
要启动 Redis CLI,只需在终端中输入 redis-cli。如果您的 Redis 服务器运行在非默认端口或主机上,可以使用 -h 和 -p 参数指定:
bash
redis-cli -h 127.0.0.1 -p 6379
连接成功后,您将看到 127.0.0.1:6379> 这样的提示符,表示您可以开始输入 Redis 命令了。
二、Redis CLI 常用命令
Redis 支持多种数据结构,每种结构都有其特定的命令集。
1. Keys (键) 命令
Keys 是 Redis 中最基本的概念,所有数据都通过键来存储和检索。
SET key value: 设置指定键的值。SET mykey "Hello Redis"
GET key: 获取指定键的值。GET mykey
DEL key [key ...]: 删除一个或多个键。DEL mykey anotherkey
EXISTS key [key ...]: 检查一个或多个键是否存在。返回存在的键的数量。EXISTS mykey
EXPIRE key seconds: 为键设置过期时间(秒)。EXPIRE mykey 60(mykey 将在 60 秒后过期)
TTL key: 返回键的剩余生存时间(秒)。如果键不存在,返回 -2;如果键没有设置过期时间,返回 -1。PERSIST key: 移除键的过期时间,使其变为永久键。TYPE key: 返回键存储的数据结构类型(如string,list,hash,set,zset)。KEYS pattern: 查找所有符合给定模式的键。注意:在生产环境中慎用此命令,尤其是在大数据量时,因为它会阻塞服务器。KEYS *(查找所有键)KEYS user:*(查找所有以user:开头的键)
SCAN cursor [MATCH pattern] [COUNT count]: 生产环境中更推荐使用SCAN命令来迭代遍历键,它是一个基于游标的迭代器,不会阻塞服务器。SCAN 0 MATCH user:* COUNT 100
2. Strings (字符串) 命令
字符串是 Redis 最基本的数据类型,可以存储文本、数字甚至二进制数据。
SET key value [EX seconds] [PX milliseconds] [NX|XX]: 高级SET命令,可设置过期时间(EX/PX)和存在条件(NX: 不存在才设置,XX: 存在才设置)。SET mykey "Hello" EX 10 NX
GET key: 获取字符串值。INCR key: 将存储在键中的数字值增一。SET counter 10INCR counter(返回 11)
DECR key: 将存储在键中的数字值减一。INCRBY key increment: 将存储在键中的数字值增加指定的增量。DECRBY key decrement: 将存储在键中的数字值减少指定的减量。APPEND key value: 将值追加到键的末尾。SET mykey "Hello"APPEND mykey " World"(mykey 变为 “Hello World”)
STRLEN key: 返回键值的长度。GETRANGE key start end: 获取字符串的子字符串。SETNX key value: 如果键不存在,则设置键的值。原子操作,常用于实现分布式锁。
3. Hashes (哈希) 命令
哈希是键值对的集合,适用于存储对象。
HSET key field value [field value ...]: 设置哈希中一个或多个字段的值。HSET user:1 name "Alice" age 30 city "New York"
HGET key field: 获取哈希中指定字段的值。HGET user:1 name(返回 “Alice”)
HGETALL key: 获取哈希中所有字段和值。HGETALL user:1
HDEL key field [field ...]: 删除哈希中一个或多个字段。HEXISTS key field: 检查哈希中是否存在指定字段。HLEN key: 返回哈希中字段的数量。HINCRBY key field increment: 增加哈希字段的整数值。
4. Lists (列表) 命令
列表是字符串元素的有序集合,可以从头部或尾部添加/删除元素。
LPUSH key value [value ...]: 将一个或多个值插入到列表的头部。LPUSH mylist "A" "B" "C"(列表为C, B, A)
RPUSH key value [value ...]: 将一个或多个值插入到列表的尾部。RPUSH mylist "X" "Y"(列表为C, B, A, X, Y)
LPOP key: 移除并返回列表的第一个元素(头部)。RPOP key: 移除并返回列表的最后一个元素(尾部)。LRANGE key start stop: 返回列表中指定范围内的元素。LRANGE mylist 0 -1(返回所有元素)
LINDEX key index: 返回列表中指定索引的元素。LLEN key: 返回列表的长度。BRPOP key [key ...] timeout: 阻塞式地移除并返回列表的最后一个元素。在指定超时时间内没有元素可弹出时,会一直阻塞。常用于实现队列。
5. Sets (集合) 命令
集合是字符串元素的无序集合,且不允许重复成员。
SADD key member [member ...]: 将一个或多个成员添加到集合。SADD myset "apple" "banana" "cherry"
SMEMBERS key: 返回集合中的所有成员。SREM key member [member ...]: 从集合中移除一个或多个成员。SISMEMBER key member: 检查成员是否是集合的成员。SCARD key: 返回集合的成员数量(基数)。SUNION key [key ...]: 返回多个集合的并集。SINTER key [key ...]: 返回多个集合的交集。SDIFF key [key ...]: 返回多个集合的差集。
6. Sorted Sets (有序集合) 命令
有序集合与集合类似,但每个成员都关联一个分数(score),Redis 根据分数对成员进行排序。
ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]: 将一个或多个成员添加到有序集合,或更新其分数。ZADD myzset 100 "member1" 200 "member2"
ZRANGE key start stop [WITHSCORES]: 返回有序集合中指定索引范围内的成员(按分数从小到大)。ZRANGE myzset 0 -1 WITHSCORES
ZREM key member [member ...]: 从有序集合中移除一个或多个成员。ZSCORE key member: 返回有序集合中成员的分数。ZCARD key: 返回有序集合的成员数量。ZCOUNT key min max: 返回有序集合中分数在指定范围内的成员数量。ZINCRBY key increment member: 增加有序集合中成员的分数。
三、Redis CLI 高级技巧
掌握了基础命令后,我们可以探索 Redis CLI 提供的一些高级功能,以优化性能、实现复杂逻辑。
1. Pipelining (管道)
当您需要发送多个命令到 Redis 服务器时,如果每个命令都单独发送并等待响应,会产生多次网络往返(RTT)延迟。Pipelining 允许您一次性发送多个命令,然后等待所有命令的响应,从而显著减少 RTT 开销,提高吞吐量。
用法:
在 redis-cli 中,您可以直接输入多个命令,它们会被自动进行管道化。或者,您可以通过文件重定向实现:
bash
(echo SET key1 value1; echo GET key1; echo INCR counter) | redis-cli
或者在一个脚本中:
“`bash
!/bin/bash
redis-cli <<EOF
SET user:1:name “Alice”
SET user:1:age 30
GET user:1:name
GET user:1:age
EOF
“`
2. Transactions (事务)
Redis 事务允许您将一组命令作为一个独立的、原子性的操作执行。事务中的所有命令要么全部执行,要么全部不执行。
MULTI: 标记一个事务块的开始。此后的命令都会被放入队列,而不是立即执行。EXEC: 执行所有在MULTI和EXEC之间排队的命令。DISCARD: 取消事务,放弃所有排队的命令。WATCH key [key ...]: 监控一个或多个键。如果在WATCH之后,EXEC之前,任何被WATCH的键被其他客户端修改了,那么当前事务将被打断,EXEC返回空值。这提供了一种乐观锁的机制。
示例:
MULTI
SET user:1:name "Bob"
INCR user:1:visits
EXEC
使用 WATCH 实现原子性操作:
“`
WATCH mykey
GET mykey
… 在这里进行一些业务逻辑判断 …
MULTI
SET mykey “new_value”
… 其他操作 …
EXEC
``mykey
如果在WATCH和EXEC之间被修改,EXEC将返回(nil)`。
3. Publish/Subscribe (发布/订阅)
Redis 可以作为一个高性能的消息代理,实现发布/订阅模式。
PUBLISH channel message: 将消息发布到指定频道。SUBSCRIBE channel [channel ...]: 订阅一个或多个频道,接收发布到这些频道的消息。PSUBSCRIBE pattern [pattern ...]: 订阅与给定模式匹配的所有频道。
示例:
在第一个 CLI 窗口:
SUBSCRIBE news_channel
在第二个 CLI 窗口:
PUBLISH news_channel "Hello everyone!"
第一个窗口将接收到消息。
4. Lua Scripting (Lua 脚本)
Redis 内置了 Lua 解释器,允许您在服务器端执行 Lua 脚本。这提供了强大的原子性操作能力,可以将多个 Redis 命令组合成一个原子脚本,减少网络延迟,并实现更复杂的逻辑。
EVAL script numkeys key [key ...] arg [arg ...]: 执行 Lua 脚本。script: Lua 脚本字符串。numkeys: 脚本中访问的键的数量。key: 键的名称,在脚本中通过KEYS[1],KEYS[2]等访问。arg: 参数,在脚本中通过ARGV[1],ARGV[2]等访问。
EVALSHA sha1 numkeys key [key ...] arg [arg ...]: 通过脚本的 SHA1 校验和执行已加载的 Lua 脚本。SCRIPT LOAD script: 将脚本加载到 Redis 服务器,并返回其 SHA1 校验和。
示例:实现原子性的 INCR 和 EXPIRE:
lua
-- script.lua
local current_value = redis.call('INCR', KEYS[1])
if tonumber(current_value) == 1 then
redis.call('EXPIRE', KEYS[1], ARGV[1])
end
return current_value
在 CLI 中执行:
EVAL "$(cat script.lua)" 1 mycounter 60
这个脚本会原子性地将 mycounter 增一,并且如果它是第一次被设置(即 current_value 为 1),则会设置其过期时间为 60 秒。
5. Monitoring (监控) 和 Debugging (调试)
MONITOR: 实时打印服务器接收到的所有命令。这对于调试客户端问题非常有用,但会增加服务器负担。INFO [section]: 返回 Redis 服务器的各种信息和统计数据,如内存使用、连接数、持久化状态等。INFO(所有信息)INFO memory(内存信息)INFO clients(客户端信息)
CLIENT LIST: 列出所有连接到 Redis 服务器的客户端信息。CONFIG GET parameter: 获取 Redis 服务器配置参数的值。DEBUG OBJECT key: 打印关于键的内部调试信息。SLOWLOG GET [count]: 获取慢查询日志。LASTSAVE: 返回最近一次成功保存到磁盘的时间戳。
四、Redis CLI 使用技巧与最佳实践
- 数据库选择: Redis 默认有 16 个数据库(从 0 到 15)。您可以使用
SELECT db_number切换数据库。SELECT 1
- 美化输出:
redis-cli --raw可以避免特殊字符的转义,使得输出更易读。 - 使用
redis-cli -a password: 如果 Redis 服务器需要密码认证,可以使用-a参数直接提供密码,而不是在连接后使用AUTH命令。 - 避免
KEYS命令: 在生产环境中,KEYS会阻塞 Redis 服务器,影响性能。请使用SCAN命令进行迭代遍历。 - 事务和 Lua 脚本的选择: 对于简单的原子性操作,事务可能足够。但对于包含条件逻辑或更复杂操作的场景,Lua 脚本是更好的选择。
- 安全性: 不要将 Redis 暴露在公网,并始终使用强密码进行认证。
总结
Redis CLI 是一个功能强大且直观的工具,无论您是作为开发者、运维人员还是系统架构师,掌握它都至关重要。从基础的键值操作,到高级的管道、事务、发布/订阅和 Lua 脚本,Redis CLI 提供了与 Redis 实例深度交互的各种能力。通过熟练运用这些命令和技巧,您将能够更有效地管理您的数据,优化应用程序性能,并充分发挥 Redis 的强大潜力。