Redis CLI 基础与高级命令:一篇搞定 – wiki词典

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.16379 端口。

  • 默认连接:
    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"

    输入 EXITQUIT 退出交互模式。

  • 命令行模式 (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 name
  • EXISTS key 检查键是否存在。
    bash
    EXISTS name # 返回 0 或 1
  • INCR key / DECR key 将键存储的整数值递增/递减 1。
    bash
    SET counter 10
    INCR counter # 11
    DECR counter # 10
  • MSET key1 value1 [key2 value2 ...] 同时设置多个键值对。
    bash
    MSET user:1:name "Bob" user:1:age 30
  • MGET 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 email
  • HLEN key 获取哈希表中字段的数量。
    bash
    HLEN user:1 # 2
  • HINCRBY 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 # 2
  • LINDEX 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" # 0
  • SCARD key 获取集合的成员数量。
    bash
    SCARD myset # 3
  • SPOP 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 # 2
  • ZINCRBY key increment member 增加有序集合中指定成员的分数。
    bash
    ZINCRBY myzset 5 "Bob" # 95
  • ZRANK 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 # list
  • TTL key 返回键的剩余生存时间(秒)。
    bash
    SETEX mykey 60 "expire soon"
    TTL mykey # 返回剩余秒数
  • PERSIST key 移除键的过期时间,使其变为永久性。
    bash
    PERSIST mykey
  • EXPIRE key seconds 为现有键设置过期时间(秒)。
    bash
    EXPIRE mykey 30
  • RENAME key newkey 重命名键。
    bash
    RENAME oldname newname
  • RANDOMKEY 从当前数据库中随机返回一个键。

3.2 事务 (Transactions)

Redis 事务允许你在一个单独的、隔离的步骤中执行一组命令。

  • MULTI 标记一个事务块的开始。
  • EXEC 执行所有在 MULTI 之后排队的命令。
  • DISCARD 取消事务,放弃所有在 MULTI 之后排队的命令。
  • WATCH key [key ...] 监视一个或多个键。如果在 EXEC 执行之前,被监视的键被其他客户端修改,则事务被取消。

示例:
bash
MULTI
SET mykey "value1"
GET mykey
LPUSH mylist "item"
EXEC

如果 mykeyWATCH 之后 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 news
  • PSUBSCRIBE 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 1gb
  • FLUSHALL 清空所有数据库的所有键。
    警告: 这是一个非常危险的命令,在生产环境中务必小心使用!
  • 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 --latency
  • redis-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 时,尤其是涉及到 KEYSFLUSHALLFLUSHDB 等命令时,务必谨慎,以免造成数据丢失或性能问题。

滚动至顶部