掌握redis-cli:连接与基本命令 – wiki基地


掌握 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.1localhost)的默认端口(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)中的 bindport 设置。
  • 防火墙阻止了连接。确保客户端和服务器之间的端口是开放的。
  • 服务器达到了最大连接数限制。

检查这些常见问题通常可以解决连接故障。

4. 退出交互模式

redis-cli 的交互模式下,您可以输入 exitquit 命令来断开连接并退出程序。

127.0.0.1:6379> exit

或者直接按下 Ctrl + C 组合键也可以退出。

第二章:Redis 命令基础:键 (Keys) 的管理

成功连接到Redis后,我们就可以开始发送命令了。Redis命令的基本格式通常是:COMMAND key [argument1] [argument2] ...。命令名称和键是必须的,后面的参数取决于具体的命令。Redis命令不区分大小写(SETset 是等效的),但是键名是区分大小写的(mykeyMyKey 是不同的键)。

首先,我们从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 memoryINFO 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实例。
  • 执行常用的数据存储、获取、删除和管理操作。
  • 与字符串、列表、哈希、集合、有序集合等核心数据结构交互。
  • 检查键的类型和是否存在,管理键的过期时间。
  • 利用 INFOCLIENT LIST 命令获取服务器状态和客户端信息。
  • 使用 MONITOR 进行实时命令流监控(需谨慎)。

本文仅仅触及了 redis-cli 和 Redis 命令世界的冰山一角。Redis拥有数百个命令,涵盖了事务、发布/订阅、Lua脚本、模块等等更高级的功能。但是,牢固掌握连接方式和本文介绍的基础命令,是您深入学习和高效使用Redis的基石。

现在,打开您的终端,启动 redis-cli,开始您的Redis探索之旅吧!通过实践,您将越来越熟练地运用这些命令,释放Redis的强大潜能。


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部