Redis 命令参考 -- Server

2015-04-21 13:08:17   最后更新: 2015-04-21 13:08:17   访问数量:1024




BGREWRITEAOF

 

执行一个 AOF文件 重写操作。重写会创建一个当前 AOF 文件的体积优化版本。

即使 BGREWRITEAOF 执行失败,也不会有任何数据丢失,因为旧的 AOF 文件在 BGREWRITEAOF 成功之前不会被修改。

 

重写操作只会在没有其他持久化工作在后台执行时被触发,也就是说:

如果 Redis 的子进程正在执行快照的保存工作,那么 AOF 重写的操作会被预定(scheduled),等到保存工作完成之后再执行 AOF 重写。在这种情况下, BGREWRITEAOF 的返回值仍然是 OK ,但还会加上一条额外的信息,说明 BGREWRITEAOF 要等到保存操作完成之后才能执行。在 Redis 2.6 或以上的版本,可以使用 INFO 命令查看 BGREWRITEAOF 是否被预定。

如果已经有别的 AOF 文件重写在执行,那么 BGREWRITEAOF 返回一个错误,并且这个新的 BGREWRITEAOF 请求也不会被预定到下次执行。

从 Redis 2.4 开始, AOF 重写由 Redis 自行触发, BGREWRITEAOF 仅仅用于手动触发重写操作。

请移步 持久化文档(英文) 查看更多相关细节。

 

可用版本:

>= 1.0.0

 

时间复杂度:

O(N), N 为要追加到 AOF 文件中的数据数量。

 

返回值:

反馈信息。

 

redis> BGREWRITEAOF Background append only file rewriting started

 

 

 

在后台异步(Asynchronously)保存当前数据库的数据到磁盘。

BGSAVE 命令执行之后立即返回 OK ,然后 Redis fork 出一个新子进程,原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出。

客户端可以通过 LASTSAVE 命令查看相关信息,判断 BGSAVE 命令是否执行成功。

请移步 持久化文档 查看更多相关细节。

 

可用版本:

>= 1.0.0

 

时间复杂度:

O(N), N 为要保存到数据库中的 key 的数量。

 

返回值:

反馈信息。

 

redis> BGSAVE Background saving started

 

 

 

CLIENT GETNAME

 

返回 CLIENT SETNAME 命令为连接设置的名字。

因为新创建的连接默认是没有名字的,

对于没有名字的连接,

CLIENT GETNAME 返回空白回复。

可用版本

>= 2.6.9

时间复杂度

O(1)

返回值

如果连接没有设置名字,那么返回空白回复;

如果有设置名字,那么返回名字。

 

# 新连接默认没有名字 redis 127.0.0.1:6379> CLIENT GETNAME (nil) # 设置名字 redis 127.0.0.1:6379> CLIENT SETNAME hello-world-connection OK # 返回名字 redis 127.0.0.1:6379> CLIENT GETNAME "hello-world-connection"

 

 

 

CLIENT KILL ip:port

 

关闭地址为 ip:port 的客户端。

ip:port 应该和 CLIENT LIST 命令输出的其中一行匹配。

因为 Redis 使用单线程设计,所以当 Redis 正在执行命令的时候,不会有客户端被断开连接。

如果要被断开连接的客户端正在执行命令,那么当这个命令执行之后,在发送下一个命令的时候,它就会收到一个网络错误,告知它自身的连接已被关闭。

可用版本

>= 2.4.0

时间复杂度

O(N) , N 为已连接的客户端数量。

返回值

当指定的客户端存在,且被成功关闭时,返回 OK 。

 

# 列出所有已连接客户端 redis 127.0.0.1:6379> CLIENT LIST addr=127.0.0.1:43501 fd=5 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 # 杀死当前客户端的连接 redis 127.0.0.1:6379> CLIENT KILL 127.0.0.1:43501 OK # 之前的连接已经被关闭,CLI 客户端又重新建立了连接 # 之前的端口是 43501 ,现在是 43504 redis 127.0.0.1:6379> CLIENT LIST addr=127.0.0.1:43504 fd=5 age=0 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

 

 

 

CLIENT LIST

 

以人类可读的格式,返回所有连接到服务器的客户端信息和统计数据。

 

redis> CLIENT LIST addr=127.0.0.1:43143 fd=6 age=183 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 addr=127.0.0.1:43163 fd=5 age=35 idle=15 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping addr=127.0.0.1:43167 fd=7 age=24 idle=6 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=get

 

 

可用版本

>= 2.4.0

时间复杂度

O(N) , N 为连接到服务器的客户端数量。

返回值

 

命令返回多行字符串,这些字符串按以下形式被格式化:

每个已连接客户端对应一行(以 LF 分割)

每行字符串由一系列 属性=值 形式的域组成,每个域之间以空格分开

 

以下是域的含义:

addr : 客户端的地址和端口

fd : 套接字所使用的文件描述符

age : 以秒计算的已连接时长

idle : 以秒计算的空闲时长

flags : 客户端 flag (见下文)

db : 该客户端正在使用的数据库 ID

sub : 已订阅频道的数量

psub : 已订阅模式的数量

multi : 在事务中被执行的命令数量

qbuf : 查询缓冲区的长度(字节为单位, 0 表示没有分配查询缓冲区)

qbuf-free : 查询缓冲区剩余空间的长度(字节为单位, 0 表示没有剩余空间)

obl : 输出缓冲区的长度(字节为单位, 0 表示没有分配输出缓冲区)

oll : 输出列表包含的对象数量(当输出缓冲区没有剩余空间时,命令回复会以字符串对象的形式被入队到这个队列里)

omem : 输出缓冲区和输出列表占用的内存总量

events : 文件描述符事件(见下文)

cmd : 最近一次执行的命令

 

客户端 flag 可以由以下部分组成:

O : 客户端是 MONITOR 模式下的附属节点(slave)

S : 客户端是一般模式下(normal)的附属节点

M : 客户端是主节点(master)

x : 客户端正在执行事务

b : 客户端正在等待阻塞事件

i : 客户端正在等待 VM I/O 操作(已废弃)

d : 一个受监视(watched)的键已被修改, EXEC 命令将失败

c : 在将回复完整地写出之后,关闭链接

u : 客户端未被阻塞(unblocked)

A : 尽可能快地关闭连接

N : 未设置任何 flag

 

文件描述符事件可以是:

r : 客户端套接字(在事件 loop 中)是可读的(readable)

w : 客户端套接字(在事件 loop 中)是可写的(writeable)

Note

为了 debug 的需要,经常会对域进行添加和删除,一个安全的 Redis 客户端应该可以对 CLIENT LIST 的输出进行相应的处理(parse),比如忽略不存在的域,跳过未知域,诸如此类。

 

CLIENT SETNAME connection-name

 

为当前连接分配一个名字。

这个名字会显示在 CLIENT LIST 命令的结果中,

用于识别当前正在与服务器进行连接的客户端。

举个例子,

在使用 Redis 构建队列(queue)时,

可以根据连接负责的任务(role),

为信息生产者(producer)和信息消费者(consumer)分别设置不同的名字。

名字使用 Redis 的字符串类型来保存,

最大可以占用 512 MB 。

另外,

为了避免和 CLIENT LIST 命令的输出格式发生冲突,

名字里不允许使用空格。

要移除一个连接的名字,

可以将连接的名字设为空字符串 "" 。

使用 CLIENT GETNAME 命令可以取出连接的名字。

新创建的连接默认是没有名字的。

Tip

在 Redis 应用程序发生连接泄漏时,为连接设置名字是一种很好的 debug 手段。

可用版本

>= 2.6.9

时间复杂度

O(1)

返回值

设置成功时返回 OK 。

 

# 新连接默认没有名字 redis 127.0.0.1:6379> CLIENT GETNAME (nil) # 设置名字 redis 127.0.0.1:6379> CLIENT SETNAME hello-world-connection OK # 返回名字 redis 127.0.0.1:6379> CLIENT GETNAME "hello-world-connection" # 在客户端列表中查看 redis 127.0.0.1:6379> CLIENT LIST addr=127.0.0.1:36851 fd=5 name=hello-world-connection # <- 名字 age=51 ... # 清除名字 redis 127.0.0.1:6379> CLIENT SETNAME # 只用空格是不行的! (error) ERR Syntax error, try CLIENT (LIST | KILL ip:port) redis 127.0.0.1:6379> CLIENT SETNAME "" # 必须双引号显示包围 OK redis 127.0.0.1:6379> CLIENT GETNAME # 清除完毕 (nil)

 

 

 

CONFIG GET parameter

 

CONFIG GET 命令用于取得运行中的 Redis 服务器的配置参数(configuration parameters),在 Redis 2.4 版本中, 有部分参数没有办法用 CONFIG GET 访问,但是在最新的 Redis 2.6 版本中,所有配置参数都已经可以用 CONFIG GET 访问了。

CONFIG GET 接受单个参数 parameter 作为搜索关键字,查找所有匹配的配置参数,其中参数和值以“键-值对”(key-value pairs)的方式排列。

 

比如执行 CONFIG GET s* 命令,服务器就会返回所有以 s 开头的配置参数及参数的值:

 

redis> CONFIG GET s* 1) "save" # 参数名:save 2) "900 1 300 10 60 10000" # save 参数的值 3) "slave-serve-stale-data" # 参数名: slave-serve-stale-data 4) "yes" # slave-serve-stale-data 参数的值 5) "set-max-intset-entries" # ... 6) "512" 7) "slowlog-log-slower-than" 8) "1000" 9) "slowlog-max-len" 10) "1000"

 

 

 

如果你只是寻找特定的某个参数的话,你当然也可以直接指定参数的名字:

 

redis> CONFIG GET slowlog-max-len 1) "slowlog-max-len" 2) "1000"

 

 

 

使用命令 CONFIG GET * ,可以列出 CONFIG GET 命令支持的所有参数:

 

redis> CONFIG GET * 1) "dir" 2) "/var/lib/redis" 3) "dbfilename" 4) "dump.rdb" 5) "requirepass" 6) (nil) 7) "masterauth" 8) (nil) 9) "maxmemory" 10) "0" 11) "maxmemory-policy" 12) "volatile-lru" 13) "maxmemory-samples" 14) "3" 15) "timeout" 16) "0" 17) "appendonly" 18) "no" # ... 49) "loglevel" 50) "verbose"

 

 

 

所有被 CONFIG SET 所支持的配置参数都可以在配置文件 redis.conf 中找到,不过 CONFIG GET 和 CONFIG SET 使用的格式和 redis.conf 文件所使用的格式有以下两点不同:

10kb 、 2gb 这些在配置文件中所使用的储存单位缩写,不可以用在 CONFIG 命令中, CONFIG SET 的值只能通过数字值显式地设定。

像 CONFIG SET xxx 1k 这样的命令是错误的,正确的格式是 CONFIG SET xxx 1000 。

save 选项在 redis.conf 中是用多行文字储存的,但在 CONFIG GET 命令中,它只打印一行文字。

 

以下是 save 选项在 redis.conf 文件中的表示:

save 900 1

save 300 10

save 60 10000

 

但是 CONFIG GET 命令的输出只有一行:

redis> CONFIG GET save

1) "save"

2) "900 1 300 10 60 10000"

上面 save 参数的三个值表示:在 900 秒内最少有 1 个 key 被改动,或者 300 秒内最少有 10 个 key 被改动,又或者 60 秒内最少有 1000 个 key 被改动,以上三个条件随便满足一个,就触发一次保存操作。

 

可用版本:

>= 2.0.0

 

时间复杂度:

不明确

 

返回值:

给定配置参数的值。

 

CONFIG RESETSTAT

 

 

重置 INFO 命令中的某些统计数据,包括:

Keyspace hits (键空间命中次数)

Keyspace misses (键空间不命中次数)

Number of commands processed (执行命令的次数)

Number of connections received (连接服务器的次数)

Number of expired keys (过期key的数量)

Number of rejected connections (被拒绝的连接数量)

Latest fork(2) time(最后执行 fork(2) 的时间)

The aof_delayed_fsync counter(aof_delayed_fsync 计数器的值)

 

可用版本:

>= 2.0.0

 

时间复杂度:

O(1)

 

返回值:

总是返回 OK 。

 

# 重置前 redis 127.0.0.1:6379> INFO # Server redis_version:2.5.3 redis_git_sha1:d0407c2d redis_git_dirty:0 arch_bits:32 multiplexing_api:epoll gcc_version:4.6.3 process_id:11095 run_id:ef1f6b6c7392e52d6001eaf777acbe547d1192e2 tcp_port:6379 uptime_in_seconds:6 uptime_in_days:0 lru_clock:1205426 # Clients connected_clients:1 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 # Memory used_memory:331076 used_memory_human:323.32K used_memory_rss:1568768 used_memory_peak:293424 used_memory_peak_human:286.55K used_memory_lua:16384 mem_fragmentation_ratio:4.74 mem_allocator:jemalloc-2.2.5 # Persistence loading:0 aof_enabled:0 changes_since_last_save:0 bgsave_in_progress:0 last_save_time:1333260015 last_bgsave_status:ok bgrewriteaof_in_progress:0 # Stats total_connections_received:1 total_commands_processed:0 instantaneous_ops_per_sec:0 rejected_connections:0 expired_keys:0 evicted_keys:0 keyspace_hits:0 keyspace_misses:0 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:0 # Replication role:master connected_slaves:0 # CPU used_cpu_sys:0.01 used_cpu_user:0.00 used_cpu_sys_children:0.00 used_cpu_user_children:0.00 # Keyspace db0:keys=20,expires=0 # 重置 redis 127.0.0.1:6379> CONFIG RESETSTAT OK # 重置后 redis 127.0.0.1:6379> INFO # Server redis_version:2.5.3 redis_git_sha1:d0407c2d redis_git_dirty:0 arch_bits:32 multiplexing_api:epoll gcc_version:4.6.3 process_id:11095 run_id:ef1f6b6c7392e52d6001eaf777acbe547d1192e2 tcp_port:6379 uptime_in_seconds:134 uptime_in_days:0 lru_clock:1205438 # Clients connected_clients:1 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 # Memory used_memory:331076 used_memory_human:323.32K used_memory_rss:1568768 used_memory_peak:330280 used_memory_peak_human:322.54K used_memory_lua:16384 mem_fragmentation_ratio:4.74 mem_allocator:jemalloc-2.2.5 # Persistence loading:0 aof_enabled:0 changes_since_last_save:0 bgsave_in_progress:0 last_save_time:1333260015 last_bgsave_status:ok bgrewriteaof_in_progress:0 # Stats total_connections_received:0 total_commands_processed:1 instantaneous_ops_per_sec:0 rejected_connections:0 expired_keys:0 evicted_keys:0 keyspace_hits:0 keyspace_misses:0 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:0 # Replication role:master connected_slaves:0 # CPU used_cpu_sys:0.05 used_cpu_user:0.02 used_cpu_sys_children:0.00 used_cpu_user_children:0.00 # Keyspace db0:keys=20,expires=0

 

 

 

CONFIG REWRITE

 

 

CONFIG REWRITE 命令对启动 Redis 服务器时所指定的 redis.conf 文件进行改写:

因为 CONFIG SET 命令可以对服务器的当前配置进行修改,

而修改后的配置可能和 redis.conf 文件中所描述的配置不一样,

CONFIG REWRITE 的作用就是通过尽可能少的修改,

将服务器当前所使用的配置记录到 redis.conf 文件中。

 

重写会以非常保守的方式进行:

原有 redis.conf 文件的整体结构和注释会被尽可能地保留。

如果一个选项已经存在于原有 redis.conf 文件中 ,

那么对该选项的重写会在选项原本所在的位置(行号)上进行。

如果一个选项不存在于原有 redis.conf 文件中,

并且该选项被设置为默认值,

那么重写程序不会将这个选项添加到重写后的 redis.conf 文件中。

如果一个选项不存在于原有 redis.conf 文件中,

并且该选项被设置为非默认值,

那么这个选项将被添加到重写后的 redis.conf 文件的末尾。

未使用的行会被留白。

比如说,

如果你在原有 redis.conf 文件上设置了数个关于 save 选项的参数,

但现在你将这些 save 参数的一个或全部都关闭了,

那么这些不再使用的参数原本所在的行就会变成空白的。

即使启动服务器时所指定的 redis.conf 文件已经不再存在,

CONFIG REWRITE 命令也可以重新构建并生成出一个新的 redis.conf 文件。

另一方面,

如果启动服务器时没有载入 redis.conf 文件,

那么执行 CONFIG REWRITE 命令将引发一个错误。

 

原子性重写

对 redis.conf 文件的重写是原子性的,

 

并且是一致的:

如果重写出错或重写期间服务器崩溃,

那么重写失败,

原有 redis.conf 文件不会被修改。

如果重写成功,

那么 redis.conf 文件为重写后的新文件。

 

可用版本

>= 2.8.0

 

返回值

一个状态值:如果配置重写成功则返回 OK ,失败则返回一个错误。

 

测试

以下是执行 CONFIG REWRITE 前,

 

被载入到 Redis 服务器的 redis.conf 文件中关于 appendonly 选项的设置:

 

# ... 其他选项 appendonly no # ... 其他选项

 

 

 

在执行以下命令之后:

 

127.0.0.1:6379> CONFIG GET appendonly # appendonly 处于关闭状态 1) "appendonly" 2) "no" 127.0.0.1:6379> CONFIG SET appendonly yes # 打开 appendonly OK 127.0.0.1:6379> CONFIG GET appendonly 1) "appendonly" 2) "yes" 127.0.0.1:6379> CONFIG REWRITE # 将 appendonly 的修改写入到 redis.conf 中 OK

 

 

 

重写后的 redis.conf 文件中的 appendonly 选项将被改写:

 

# ... 其他选项 appendonly yes # ... 其他选项

 

 

 

CONFIG SET parameter value

 

CONFIG SET 命令可以动态地调整 Redis 服务器的配置(configuration)而无须重启。

你可以使用它修改配置参数,或者改变 Redis 的持久化(Persistence)方式。

CONFIG SET 可以修改的配置参数可以使用命令 CONFIG GET * 来列出,所有被 CONFIG SET 修改的配置参数都会立即生效。

关于 CONFIG SET 命令的更多消息,请参见命令 CONFIG GET 的说明。

关于如何使用 CONFIG SET 命令修改 Redis 持久化方式,请参见 Redis Persistence 。

 

可用版本:

>= 2.0.0

 

时间复杂度:

不明确

 

返回值:

当设置成功时返回 OK ,否则返回一个错误。

 

redis> CONFIG GET slowlog-max-len 1) "slowlog-max-len" 2) "1024" redis> CONFIG SET slowlog-max-len 10086 OK redis> CONFIG GET slowlog-max-len 1) "slowlog-max-len" 2) "10086"

 

 

 

DBSIZE

 

返回当前数据库的 key 的数量。

 

可用版本:

>= 1.0.0

 

时间复杂度:

O(1)

 

返回值:

当前数据库的 key 的数量。

 

redis> DBSIZE (integer) 5 redis> SET new_key "hello_moto" # 增加一个 key 试试 OK redis> DBSIZE (integer) 6

 

 

 

DEBUG OBJECT key

 

DEBUG OBJECT 是一个调试命令,它不应被客户端所使用。

查看 OBJECT 命令获取更多信息。

 

可用版本:

>= 1.0.0

 

时间复杂度:

O(1)

 

返回值:

当 key 存在时,返回有关信息。

当 key 不存在时,返回一个错误。

 

redis> DEBUG OBJECT my_pc Value at:0xb6838d20 refcount:1 encoding:raw serializedlength:9 lru:283790 lru_seconds_idle:150 redis> DEBUG OBJECT your_mac (error) ERR no such key

 

 

 

DEBUG SEGFAULT

 

执行一个不合法的内存访问从而让 Redis 崩溃,仅在开发时用于 BUG 模拟。

 

可用版本:

>= 1.0.0

 

时间复杂度:

不明确

 

返回值:

 

redis> DEBUG SEGFAULT Could not connect to Redis at: Connection refused not connected>

 

 

 

FLUSHALL

 

清空整个 Redis 服务器的数据(删除所有数据库的所有 key )。

此命令从不失败。

 

可用版本:

>= 1.0.0

 

时间复杂度:

尚未明确

 

返回值:

总是返回 OK 。

 

redis> DBSIZE # 0 号数据库的 key 数量 (integer) 9 redis> SELECT 1 # 切换到 1 号数据库 OK redis[1]> DBSIZE # 1 号数据库的 key 数量 (integer) 6 redis[1]> flushall # 清空所有数据库的所有 key OK redis[1]> DBSIZE # 不但 1 号数据库被清空了 (integer) 0 redis[1]> SELECT 0 # 0 号数据库(以及其他所有数据库)也一样 OK redis> DBSIZE (integer) 0

 

 

 

FLUSHDB

 

清空当前数据库中的所有 key。

此命令从不失败。

 

可用版本:

>= 1.0.0

 

时间复杂度:

O(1)

 

返回值:

总是返回 OK 。

 

redis> DBSIZE # 清空前的 key 数量 (integer) 4 redis> FLUSHDB OK redis> DBSIZE # 清空后的 key 数量 (integer) 0

 

 

 

INFO [section]

 

以一种易于解释(parse)且易于阅读的格式,返回关于 Redis 服务器的各种信息和统计数值。

 

通过给定可选的参数 section ,可以让命令只返回某一部分的信息:

 

server 部分记录了 Redis 服务器的信息,它包含以下域:

redis_version : Redis 服务器版本

redis_git_sha1 : Git SHA1

redis_git_dirty : Git dirty flag

os : Redis 服务器的宿主操作系统

arch_bits : 架构(32 或 64 位)

multiplexing_api : Redis 所使用的事件处理机制

gcc_version : 编译 Redis 时所使用的 GCC 版本

process_id : 服务器进程的 PID

run_id : Redis 服务器的随机标识符(用于 Sentinel 和集群)

tcp_port : TCP/IP 监听端口

uptime_in_seconds : 自 Redis 服务器启动以来,经过的秒数

uptime_in_days : 自 Redis 服务器启动以来,经过的天数

lru_clock : 以分钟为单位进行自增的时钟,用于 LRU 管理

 

clients 部分记录了已连接客户端的信息,它包含以下域:

connected_clients : 已连接客户端的数量(不包括通过从属服务器连接的客户端)

client_longest_output_list : 当前连接的客户端当中,最长的输出列表

client_longest_input_buf : 当前连接的客户端当中,最大输入缓存

blocked_clients : 正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量

 

memory 部分记录了服务器的内存信息,它包含以下域:

used_memory : 由 Redis 分配器分配的内存总量,以字节(byte)为单位

used_memory_human : 以人类可读的格式返回 Redis 分配的内存总量

used_memory_rss : 从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps 等命令的输出一致。

used_memory_peak : Redis 的内存消耗峰值(以字节为单位)

used_memory_peak_human : 以人类可读的格式返回 Redis 的内存消耗峰值

used_memory_lua : Lua 引擎所使用的内存大小(以字节为单位)

mem_fragmentation_ratio : used_memory_rss 和 used_memory 之间的比率

mem_allocator : 在编译时指定的, Redis 所使用的内存分配器。可以是 libc 、 jemalloc 或者 tcmalloc 。

在理想情况下, used_memory_rss 的值应该只比 used_memory 稍微高一点儿。

当 rss > used ,且两者的值相差较大时,表示存在(内部或外部的)内存碎片。

内存碎片的比率可以通过 mem_fragmentation_ratio 的值看出。

当 used > rss 时,表示 Redis 的部分内存被操作系统换出到交换空间了,在这种情况下,操作可能会产生明显的延迟。

Because Redis does not have control over how its allocations are mapped to memory pages, high used_memory_rss is often the result of a spike in memory usage.

当 Redis 释放内存时,分配器可能会,也可能不会,将内存返还给操作系统。

如果 Redis 释放了内存,却没有将内存返还给操作系统,那么 used_memory 的值可能和操作系统显示的 Redis 内存占用并不一致。

查看 used_memory_peak 的值可以验证这种情况是否发生。

 

persistence 部分记录了跟 RDB 持久化和 AOF 持久化有关的信息,它包含以下域:

loading : 一个标志值,记录了服务器是否正在载入持久化文件。

rdb_changes_since_last_save : 距离最近一次成功创建持久化文件之后,经过了多少秒。

rdb_bgsave_in_progress : 一个标志值,记录了服务器是否正在创建 RDB 文件。

rdb_last_save_time : 最近一次成功创建 RDB 文件的 UNIX 时间戳。

rdb_last_bgsave_status : 一个标志值,记录了最近一次创建 RDB 文件的结果是成功还是失败。

rdb_last_bgsave_time_sec : 记录了最近一次创建 RDB 文件耗费的秒数。

rdb_current_bgsave_time_sec : 如果服务器正在创建 RDB 文件,那么这个域记录的就是当前的创建操作已经耗费的秒数。

aof_enabled : 一个标志值,记录了 AOF 是否处于打开状态。

aof_rewrite_in_progress : 一个标志值,记录了服务器是否正在创建 AOF 文件。

aof_rewrite_scheduled : 一个标志值,记录了在 RDB 文件创建完毕之后,是否需要执行预约的 AOF 重写操作。

aof_last_rewrite_time_sec : 最近一次创建 AOF 文件耗费的时长。

aof_current_rewrite_time_sec : 如果服务器正在创建 AOF 文件,那么这个域记录的就是当前的创建操作已经耗费的秒数。

aof_last_bgrewrite_status : 一个标志值,记录了最近一次创建 AOF 文件的结果是成功还是失败。

 

如果 AOF 持久化功能处于开启状态,那么这个部分还会加上以下域:

aof_current_size : AOF 文件目前的大小。

aof_base_size : 服务器启动时或者 AOF 重写最近一次执行之后,AOF 文件的大小。

aof_pending_rewrite : 一个标志值,记录了是否有 AOF 重写操作在等待 RDB 文件创建完毕之后执行。

aof_buffer_length : AOF 缓冲区的大小。

aof_rewrite_buffer_length : AOF 重写缓冲区的大小。

aof_pending_bio_fsync : 后台 I/O 队列里面,等待执行的 fsync 调用数量。

aof_delayed_fsync : 被延迟的 fsync 调用数量。

 

stats 部分记录了一般统计信息,它包含以下域:

total_connections_received : 服务器已接受的连接请求数量。

total_commands_processed : 服务器已执行的命令数量。

instantaneous_ops_per_sec : 服务器每秒钟执行的命令数量。

rejected_connections : 因为最大客户端数量限制而被拒绝的连接请求数量。

expired_keys : 因为过期而被自动删除的数据库键数量。

evicted_keys : 因为最大内存容量限制而被驱逐(evict)的键数量。

keyspace_hits : 查找数据库键成功的次数。

keyspace_misses : 查找数据库键失败的次数。

pubsub_channels : 目前被订阅的频道数量。

pubsub_patterns : 目前被订阅的模式数量。

latest_fork_usec : 最近一次 fork() 操作耗费的毫秒数。

replication : 主/从复制信息

role : 如果当前服务器没有在复制任何其他服务器,那么这个域的值就是 master ;否则的话,这个域的值就是 slave 。注意,在创建复制链的时候,一个从服务器也可能是另一个服务器的主服务器。

 

如果当前服务器是一个从服务器的话,那么这个部分还会加上以下域:

master_host : 主服务器的 IP 地址。

master_port : 主服务器的 TCP 监听端口号。

master_link_status : 复制连接当前的状态, up 表示连接正常, down 表示连接断开。

master_last_io_seconds_ago : 距离最近一次与主服务器进行通信已经过去了多少秒钟。

master_sync_in_progress : 一个标志值,记录了主服务器是否正在与这个从服务器进行同步。

 

如果同步操作正在进行,那么这个部分还会加上以下域:

master_sync_left_bytes : 距离同步完成还缺少多少字节数据。

master_sync_last_io_seconds_ago : 距离最近一次因为 SYNC 操作而进行 I/O 已经过去了多少秒。

 

如果主从服务器之间的连接处于断线状态,那么这个部分还会加上以下域:

master_link_down_since_seconds : 主从服务器连接断开了多少秒。

 

以下是一些总会出现的域:

connected_slaves : 已连接的从服务器数量。

 

对于每个从服务器,都会添加以下一行信息:

slaveXXX : ID、IP 地址、端口号、连接状态

 

cpu 部分记录了 CPU 的计算量统计信息,它包含以下域:

used_cpu_sys : Redis 服务器耗费的系统 CPU 。

used_cpu_user : Redis 服务器耗费的用户 CPU 。

used_cpu_sys_children : 后台进程耗费的系统 CPU 。

used_cpu_user_children : 后台进程耗费的用户 CPU 。

 

commandstats 部分记录了各种不同类型的命令的执行统计信息,比如命令执行的次数、命令耗费的 CPU 时间、执行每个命令耗费的平均 CPU 时间等等。对于每种类型的命令,这个部分都会添加一行以下格式的信息:

cmdstat_XXX:calls=XXX,usec=XXX,usecpercall=XXX

 

cluster 部分记录了和集群有关的信息,它包含以下域:

cluster_enabled : 一个标志值,记录集群功能是否已经开启。

 

keyspace 部分记录了数据库相关的统计信息,比如数据库的键数量、数据库已经被删除的过期键数量等。对于每个数据库,这个部分都会添加一行以下格式的信息:

dbXXX:keys=XXX,expires=XXX

 

除上面给出的这些值以外, section 参数的值还可以是下面这两个:

all : 返回所有信息

default : 返回默认选择的信息

当不带参数直接调用 INFO 命令时,使用 default 作为默认参数。

Note

不同版本的 Redis 可能对返回的一些域进行了增加或删减。

因此,一个健壮的客户端程序在对 INFO 命令的输出进行分析时,应该能够跳过不认识的域,并且妥善地处理丢失不见的域。

 

可用版本:

>= 1.0.0

 

时间复杂度:

O(1)

 

返回值:

具体请参见下面的测试代码。

 

redis> INFO # Server redis_version:2.9.11 redis_git_sha1:937384d0 redis_git_dirty:0 redis_build_id:8e9509442863f22 redis_mode:standalone os:Linux 3.13.0-35-generic x86_64 arch_bits:64 multiplexing_api:epoll gcc_version:4.8.2 process_id:4716 run_id:26186aac3f2380aaee9eef21cc50aecd542d97dc tcp_port:6379 uptime_in_seconds:362 uptime_in_days:0 hz:10 lru_clock:1725349 config_file: # Clients connected_clients:1 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 # Memory used_memory:508536 used_memory_human:496.62K used_memory_rss:7974912 used_memory_peak:508536 used_memory_peak_human:496.62K used_memory_lua:33792 mem_fragmentation_ratio:15.68 mem_allocator:jemalloc-3.2.0 # Persistence loading:0 rdb_changes_since_last_save:6 rdb_bgsave_in_progress:0 rdb_last_save_time:1411011131 rdb_last_bgsave_status:ok rdb_last_bgsave_time_sec:-1 rdb_current_bgsave_time_sec:-1 aof_enabled:0 aof_rewrite_in_progress:0 aof_rewrite_scheduled:0 aof_last_rewrite_time_sec:-1 aof_current_rewrite_time_sec:-1 aof_last_bgrewrite_status:ok aof_last_write_status:ok # Stats total_connections_received:2 total_commands_processed:4 instantaneous_ops_per_sec:0 rejected_connections:0 sync_full:0 sync_partial_ok:0 sync_partial_err:0 expired_keys:0 evicted_keys:0 keyspace_hits:0 keyspace_misses:0 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:0 migrate_cached_sockets:0 # Replication role:master connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 # CPU used_cpu_sys:0.21 used_cpu_user:0.17 used_cpu_sys_children:0.00 used_cpu_user_children:0.00 # Cluster cluster_enabled:0 # Keyspace db0:keys=2,expires=0,avg_ttl=0

 

 

 

LASTSAVE

 

返回最近一次 Redis 成功将数据保存到磁盘上的时间,以 UNIX 时间戳格式表示。

 

可用版本:

>= 1.0.0

 

时间复杂度:

O(1)

 

返回值:

一个 UNIX 时间戳。

 

redis> LASTSAVE (integer) 1324043588

 

 

 

MONITOR

 

实时打印出 Redis 服务器接收到的命令,调试用。

 

可用版本:

>= 1.0.0

 

时间复杂度:

不明确

 

返回值:

总是返回 OK 。

 

127.0.0.1:6379> MONITOR OK # 以第一个打印值为例 # 1378822099.421623 是时间戳 # [0 127.0.0.1:56604] 中的 0 是数据库号码, 127... 是 IP 地址和端口 # "PING" 是被执行的命令 1378822099.421623 [0 127.0.0.1:56604] "PING" 1378822105.089572 [0 127.0.0.1:56604] "SET" "msg" "hello world" 1378822109.036925 [0 127.0.0.1:56604] "SET" "number" "123" 1378822140.649496 [0 127.0.0.1:56604] "SADD" "fruits" "Apple" "Banana" "Cherry" 1378822154.117160 [0 127.0.0.1:56604] "EXPIRE" "msg" "10086" 1378822257.329412 [0 127.0.0.1:56604] "KEYS" "*" 1378822258.690131 [0 127.0.0.1:56604] "DBSIZE"

 

 

 

PSYNC <MASTER_RUN_ID> <OFFSET>

 

用于复制功能(replication)的内部命令。

更多信息请参考 复制(Replication) 文档。

 

可用版本:

>= 2.8.0

 

时间复杂度:

不明确

 

返回值:

不明确

 

127.0.0.1:6379> PSYNC ? -1 "REDIS0006\xfe\x00\x00\x02kk\x02vv\x00\x03msg\x05hello\xff\xc3\x96P\x12h\bK\xef"

 

 

 

SAVE

 

SAVE 命令执行一个同步保存操作,将当前 Redis 实例的所有数据快照(snapshot)以 RDB 文件的形式保存到硬盘。

一般来说,在生产环境很少执行 SAVE 操作,因为它会阻塞所有客户端,保存数据库的任务通常由 BGSAVE 命令异步地执行。然而,如果负责保存数据的后台子进程不幸出现问题时, SAVE 可以作为保存数据的最后手段来使用。

请参考文档: Redis 的持久化运作方式(英文) 以获取更多消息。

 

可用版本:

>= 1.0.0

 

时间复杂度:

O(N), N 为要保存到数据库中的 key 的数量。

 

返回值:

保存成功时返回 OK 。

 

redis> SAVE <span class="n">OK</span>

 

 

 

SHUTDOWN

 

 

SHUTDOWN 命令执行以下操作:

停止所有客户端

如果有至少一个保存点在等待,执行 SAVE 命令

如果 AOF 选项被打开,更新 AOF 文件

关闭 redis 服务器(server)

如果持久化被打开的话, SHUTDOWN 命令会保证服务器正常关闭而不丢失任何数据。

另一方面,假如只是单纯地执行 SAVE 命令,然后再执行 QUIT 命令,则没有这一保证 —— 因为在执行 SAVE 之后、执行 QUIT 之前的这段时间中间,其他客户端可能正在和服务器进行通讯,这时如果执行 QUIT 就会造成数据丢失。

SAVE 和 NOSAVE 修饰符

 

 

通过使用可选的修饰符,可以修改 SHUTDOWN 命令的表现。比如说:

执行 SHUTDOWN SAVE 会强制让数据库执行保存操作,即使没有设定(configure)保存点

执行 SHUTDOWN NOSAVE 会阻止数据库执行保存操作,即使已经设定有一个或多个保存点(你可以将这一用法看作是强制停止服务器的一个假想的 ABORT 命令)

 

可用版本:

>= 1.0.0

 

时间复杂度:

不明确

 

返回值:

执行失败时返回错误。

执行成功时不返回任何信息,服务器和客户端的连接断开,客户端自动退出。

 

redis> PING PONG redis> SHUTDOWN $ $ redis Could not connect to Redis at: Connection refused not connected>

 

 

 

SLAVEOF host port

SLAVEOF 命令用于在 Redis 运行时动态地修改复制(replication)功能的行为。

通过执行 SLAVEOF host port 命令,可以将当前服务器转变为指定服务器的从属服务器(slave server)。

如果当前服务器已经是某个主服务器(master server)的从属服务器,那么执行 SLAVEOF host port 将使当前服务器停止对旧主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步。

另外,对一个从属服务器执行命令 SLAVEOF NO ONE 将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃。

利用『 SLAVEOF NO ONE 不会丢弃同步所得数据集』这个特性,可以在主服务器失败的时候,将从属服务器用作新的主服务器,从而实现无间断运行。

 

可用版本:

>= 1.0.0

 

时间复杂度:

SLAVEOF host port ,O(N), N 为要同步的数据数量。

SLAVEOF NO ONE , O(1) 。

 

返回值:

总是返回 OK 。

 

redis> SLAVEOF 127.0.0.1 6379 OK redis> SLAVEOF NO ONE OK

 

 

 

SLOWLOG subcommand [argument]

 

什么是 SLOWLOG

 

Slow log 是 Redis 用来记录查询执行时间的日志系统。

查询执行时间指的是不包括像客户端响应(talking)、发送回复等 IO 操作,而单单是执行一个查询命令所耗费的时间。

另外,slow log 保存在内存里面,读写速度非常快,因此你可以放心地使用它,不必担心因为开启 slow log 而损害 Redis 的速度。

设置 SLOWLOG

 

Slow log 的行为由两个配置参数(configuration parameter)指定,可以通过改写 redis.conf 文件或者用 CONFIG GET 和 CONFIG SET 命令对它们动态地进行修改。

第一个选项是 slowlog-log-slower-than ,它决定要对执行时间大于多少微秒(microsecond,1秒 = 1,000,000 微秒)的查询进行记录。

 

比如执行以下命令将让 slow log 记录所有查询时间大于等于 100 微秒的查询:

CONFIG SET slowlog-log-slower-than 100

 

而以下命令记录所有查询时间大于 1000 微秒的查询:

CONFIG SET slowlog-log-slower-than 1000

另一个选项是 slowlog-max-len ,它决定 slow log 最多能保存多少条日志, slow log 本身是一个 FIFO 队列,当队列大小超过 slowlog-max-len 时,最旧的一条日志将被删除,而最新的一条日志加入到 slow log ,以此类推。

 

以下命令让 slow log 最多保存 1000 条日志:

CONFIG SET slowlog-max-len 1000

 

使用 CONFIG GET 命令可以查询两个选项的当前值:

 

redis> CONFIG GET slowlog-log-slower-than 1) "slowlog-log-slower-than" 2) "1000" redis> CONFIG GET slowlog-max-len 1) "slowlog-max-len" 2) "1000"

 

 

查看 slow log

 

要查看 slow log ,可以使用 SLOWLOG GET 或者 SLOWLOG GET number 命令,前者打印所有 slow log ,最大长度取决于 slowlog-max-len 选项的值,而 SLOWLOG GET number 则只打印指定数量的日志。

 

最新的日志会最先被打印:

 

# 为测试需要,将 slowlog-log-slower-than 设成了 10 微秒 redis> SLOWLOG GET 1) 1) (integer) 12 # 唯一性(unique)的日志标识符 2) (integer) 1324097834 # 被记录命令的执行时间点,以 UNIX 时间戳格式表示 3) (integer) 16 # 查询执行时间,以微秒为单位 4) 1) "CONFIG" # 执行的命令,以数组的形式排列 2) "GET" # 这里完整的命令是 CONFIG GET slowlog-log-slower-than 3) "slowlog-log-slower-than" 2) 1) (integer) 11 2) (integer) 1324097825 3) (integer) 42 4) 1) "CONFIG" 2) "GET" 3) "*" 3) 1) (integer) 10 2) (integer) 1324097820 3) (integer) 11 4) 1) "CONFIG" 2) "GET" 3) "slowlog-log-slower-than" # ...

 

 

日志的唯一 id 只有在 Redis 服务器重启的时候才会重置,这样可以避免对日志的重复处理(比如你可能会想在每次发现新的慢查询时发邮件通知你)。

查看当前日志的数量

 

使用命令 SLOWLOG LEN 可以查看当前日志的数量。

请注意这个值和 slower-max-len 的区别,它们一个是当前日志的数量,一个是允许记录的最大日志的数量。

 

redis> SLOWLOG LEN (integer) 14

 

 

清空日志

 

使用命令 SLOWLOG RESET 可以清空 slow log 。

 

redis> SLOWLOG LEN (integer) 14 redis> SLOWLOG RESET OK redis> SLOWLOG LEN (integer) 0

 

 

 

可用版本:

>= 2.2.12

 

时间复杂度:

O(1)

 

返回值:

取决于不同命令,返回不同的值。

 

SYNC

 

用于复制功能(replication)的内部命令。

更多信息请参考 Redis 官网的 Replication 章节 。

 

可用版本:

>= 1.0.0

 

时间复杂度:

不明确

 

返回值:

不明确

 

redis> SYNC "REDIS0002\xfe\x00\x00\auser_id\xc0\x03\x00\anumbers\xc2\xf3\xe0\x01\x00\x00\tdb_number\xc0\x00\x00\x04name\x06huangz\x00\anew_key\nhello_moto\x00\bgreeting\nhello moto\x00\x05my_pc\bthinkpad\x00\x04lock\xc0\x01\x00\nlock_times\xc0\x04\xfe\x01\t\x04info\x19\x02\x04name\b\x00zhangyue\x03age\x02\x0022\xff\t\aooredis,\x03\x04name\a\x00ooredis\aversion\x03\x001.0\x06author\x06\x00huangz\xff\x00\tdb_number\xc0\x01\x00\x05greet\x0bhello world\x02\nmy_friends\x02\x05marry\x04jack\x00\x04name\x05value\xfe\x02\x0c\x01s\x12\x12\x00\x00\x00\r\x00\x00\x00\x02\x00\x00\x01a\x03\xc0f&#39;\xff\xff" (1.90s)

 

 

 

TIME

 

返回当前服务器时间。

 

可用版本:

>= 2.6.0

 

时间复杂度:

O(1)

 

返回值:

一个包含两个字符串的列表: 第一个字符串是当前时间(以 UNIX 时间戳格式表示),而第二个字符串是当前这一秒钟已经逝去的微秒数。

 

redis> TIME 1) "1332395997" 2) "952581" redis> TIME 1) "1332395997" 2) "953148"

 

 

 

 






技术帖      技术分享      存储      command      server      redis      db      nosql      命令      pub     


京ICP备15018585号