掌握 Redis CLI:常用命令及高级技巧 – wiki大全

掌握 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 10
    • INCR 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: 执行所有在 MULTIEXEC 之间排队的命令。
  • 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
``
如果
mykeyWATCHEXEC之间被修改,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 的强大潜力。

滚动至顶部