文章建立一个统一的认识就是Redis的版本是3.2.8
1:BGREWRITEAOF(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 仅仅用于手动触发重写操作。所以说已经并不适用于3.2.8,不在详述。
2:BGSAVE(bgsave)
在后台异步(Asynchronously)保存当前数据库的数据到磁盘。
BGSAVE 命令执行之后立即返回 OK ,然后 Redis fork 出一个新子进程,原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出。
客户端可以通过 LASTSAVE 命令查看相关信息,判断 BGSAVE 命令是否执行成功。
首先进入6739的Redis:
127.0.0.1:6379[]> config get dir
1) "dir"
2) "/home/redis/data"
看一下现在的dump.rbd文件
[root@localhost data]# ls -ll
total 4
-rw-r--r-- 1 root root 108 May 2 16:32 dump.rdb
看一下日期,执行bgsave并且查看dump.rbd文件:
127.0.0.1:6379[]> bgsave
Background saving started
\[root@localhost data]# ls -ll
total 4
-rw-r--r-- 1 root root 108 May 9 10:18 dump.rdb
看一下,备份时间已经修改为最新我们执行备份的时间了。
下面有两个命令和BGSAVE息息相关,SAVE|LASTSAVE
SAVE
SAVE 命令执行一个同步保存操作,将当前 Redis 实例的所有数据快照(snapshot)以 RDB 文件的形式保存到硬盘。
一般来说,在生产环境很少执行 SAVE 操作,因为它会阻塞所有客户端,保存数据库的任务通常由 BGSAVE 命令异步地执行。然而,如果负责保存数据的后台子进程不幸出现问题时, SAVE 可以作为保存数据的最后手段来使用。
LASTSAVE
返回最近一次 Redis 成功将数据保存到磁盘上的时间,以 UNIX 时间戳格式表示。
127.0.0.1:6379[]> lastsave
(integer) 1494296312
我们把时间戳转换以后就是1494296312=2017/5/9 10:18:32
3:关于CLIENT的几个系统命令
CLIENT GETNAME,返回 CLIENT SETNAME 命令为连接设置的名字。另外还有CLIENT LIST和CLIENT KILL
因为新创建的连接默认是没有名字的, 对于没有名字的连接, CLIENT GETNAME 返回空白回复。
为当前连接分配一个名字。
这个名字会显示在 CLIENT LIST 命令的结果中, 用于识别当前正在与服务器进行连接的客户端。
举个例子, 在使用 Redis 构建队列(queue)时, 可以根据连接负责的任务(role), 为信息生产者(producer)和信息消费者(consumer)分别设置不同的名字。
名字使用 Redis 的字符串类型来保存, 最大可以占用 512 MB 。 另外, 为了避免和 CLIENT LIST 命令的输出格式发生冲突, 名字里不允许使用空格。
要移除一个连接的名字, 可以将连接的名字设为空字符串 "" 。
使用 CLIENT GETNAME 命令可以取出连接的名字。
新创建的连接默认是没有名字的。
在 Redis 应用程序发生连接泄漏时,为连接设置名字是一种很好的 debug 手段。下面给个例子
127.0.0.1:6379[]> client getname
(nil)
127.0.0.1:6379[]> client setname mxqconnect1
OK
127.0.0.1:6379[]> client getname
"mxqconnect1"
127.0.0.1:6379[]> client list
id=2350 addr=172.16.16.34:13200 fd=7 name=sentinel-51fc16eb-cmd age=583234 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=publish
id=2351 addr=172.16.16.34:13201 fd=9 name=sentinel-51fc16eb-pubsub age=583234 idle=0 flags=N db=0 sub=1 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=subscribe
id=2352 addr=172.16.16.35:39670 fd=10 name= age=583233 idle=0 flags=S db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=replconf
id=2362 addr=127.0.0.1:34498 fd=12 name=mxqconnect1 age=150 idle=0 flags=N db=1 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
id=2353 addr=172.16.16.35:39672 fd=6 name=sentinel-d7303108-pubsub age=583232 idle=0 flags=N db=0 sub=1 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=subscribe
id=2354 addr=172.16.16.35:39671 fd=8 name=sentinel-d7303108-cmd age=583232 idle=0 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
id=2355 addr=172.16.16.35:39687 fd=11 name= age=583223 idle=0 flags=S db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=replconf
127.0.0.1:6379[]>
关闭自身的链接:
127.0.0.1:6379[]> CLIENT KILL 127.0.0.1:34498
OK
127.0.0.1:6379[]>
127.0.0.1:6379[]> GET NAME
(error) NOAUTH Authentication required.
我们知道Redis 使用单线程设计,所以当 Redis 正在执行命令的时候,不会有客户端被断开连接。我们断开本身的链接后,在执行下一次命令,就会出现一个错误,告知我们已经断开了连接。
下面看一下CLIENT LIST的各个域的含义,也是Redis官网给出的解释:
以下是域的含义:
addr : 客户端的地址和端口
fd : 套接字所使用的文件描述符
age : 以秒计算的已连接时长
idle : 以秒计算的空闲时长
flags : 客户端 flag (见下文)
db : 该客户端正在使用的数据库 ID
sub : 已订阅频道的数量
psub : 已订阅模式的数量
multi : 在事务中被执行的命令数量
qbuf : 查询缓存的长度( 0 表示没有查询在等待)
qbuf-free : 查询缓存的剩余空间( 0 表示没有剩余空间)
obl : 输出缓存的长度
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)
4:CONFIG SET|GET|REWRITE
CONFIG SET 命令可以动态地调整 Redis 服务器的配置(configuration)而无须重启。
你可以使用它修改配置参数,或者改变 Redis 的持久化(Persistence)方式。
CONFIG SET 可以修改的配置参数可以使用命令 CONFIG GET * 来列出,所有被 CONFIG SET 修改的配置参数都会立即生
CONFIG GET 命令用于取得运行中的 Redis 服务器的配置参数(configuration parameters),在 Redis 2.4 版本中, 有部分参数没有办法用 CONFIG GET 访问,但是在最新的 Redis 2.6 版本中,所有配置参数都已经可以用 CONFIG GET 访问了。
CONFIG GET 接受单个参数 parameter 作为搜索关键字,查找所有匹配的配置参数,其中参数和值以“键-值对”(key-value pairs)的方式排列。
例如我们可以修改一下交互时间:
127.0.0.1:6379[]> clinet get name
(error) ERR unknown command 'clinet'
127.0.0.1:6379[]> client getname
(error) NOAUTH Authentication required.
127.0.0.1:6379[]> AUTH maxiangqianreids
(error) ERR invalid password
127.0.0.1:6379[]> AUTH maxiangqianredis
OK
127.0.0.1:6379[]> config get timeout
1) "timeout"
2) "300"
127.0.0.1:6379[]> config set timeout 3000
OK
127.0.0.1:6379[]> config get timeout
1) "timeout"
2) "3000"
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 命令将引发一个错误。
我们执行config rewrite,然后查看配置文件
[root@localhost redis]# cat redis.conf
#bind 127.0.0.1 # 绑定的主机地址
port 6379
timeout 3000
timeout已经被修改为3000了。
还有一个CONFIG 命令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 计数器的值)
5:DBSIZE
返回当前数据库的 key 的数量
127.0.0.1:6379> DBSIZE
(integer) 4
127.0.0.1:6379> INFO KEYSPACE
# Keyspace
db0:keys=4,expires=0,avg_ttl=0
db1:keys=1,expires=0,avg_ttl=0
6:DEBUG OBJECT key
DEBUG OBJECT 是一个调试命令,它不应被客户端所使用。
DEBUG SEGFAULT
执行一个不合法的内存访问从而让 Redis 崩溃,仅在开发时用于 BUG 模拟。
7:FLUSHALL:清空整个 Redis 服务器的数据(删除所有数据库的所有 key )。此命令从不失败。
FLUSHDB:清空当前数据库中的所有 key。此命令从不失败。
8:INFO:系统相关信息,下面看一下相关的例子:
127.0.0.1:6379> INFO KEYSPACE
# Keyspace
db0:keys=4,expires=0,avg_ttl=0
db1:keys=1,expires=0,avg_ttl=0
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.16.16.35,port=6380,state=online,offset=131088123,lag=0
slave1:ip=172.16.16.35,port=6379,state=online,offset=131088123,lag=1
master_repl_offset:131088123
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:130039548
repl_backlog_histlen:1048576
127.0.0.1:6379> info Persistence
# Persistence
loading:0
rdb_changes_since_last_save:2
rdb_bgsave_in_progress:0
rdb_last_save_time:1494299732
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
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
我们可以通过INFO 后带域的信息查看相关复制,KEY值和相关的持久化信息。
9:MONITOR相关信息
127.0.0.1:6379> MONITOR
OK
1494300607.699131 [0 172.16.16.34:13200] "PING"
1494300607.783224 [0 172.16.16.34:13200] "PUBLISH" "__sentinel__:hello" "172.16.16.34,26379,51fc16eb8e0bf950a3f3ada8c1eb9d70145c9ffb,2,localhost,172.16.16.34,6379,2"
1494300608.585669 [0 172.16.16.35:39671] "PING"
1494300608.676104 [0 172.16.16.35:39671] "PUBLISH" "__sentinel__:hello" "172.16.16.35,26379,d73031089231fd5f46bdda23d8a448cfe64ec8fd,2,localhost,172.16.16.34,6379,2"
1494300608.724879 [0 172.16.16.34:13200] "PING"
1494300609.640910 [0 172.16.16.35:39671] "PING"
1494300609.746056 [0 172.16.16.34:13200] "PING"
1494300609.836231 [0 172.16.16.34:13200] "PUBLISH" "__sentinel__:hello" "172.16.16.34,26379,51fc16eb8e0bf950a3f3ada8c1eb9d70145c9ffb,2,localhost,172.16.16.34,6379,2"
1494300610.713244 [0 172.16.16.35:39671] "PING"
1494300610.752325 [0 172.16.16.34:13200] "PING"
主要就是监控Redis的实时链接信息,这个功能感觉也是很好用。当大量新链接出问题时候我们可以看到连接的来源地址和主要作用。
10:SLAVEOF host port
SLAVEOF 命令用于在 Redis 运行时动态地修改复制(replication)功能的行为。
通过执行 SLAVEOF host port 命令,可以将当前服务器转变为指定服务器的从属服务器(slave server)。
如果当前服务器已经是某个主服务器(master server)的从属服务器,那么执行 SLAVEOF host port 将使当前服务器停止对旧主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步。
另外,对一个从属服务器执行命令 SLAVEOF NO ONE 将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃。
利用『 SLAVEOF NO ONE 不会丢弃同步所得数据集』这个特性,可以在主服务器失败的时候,将从属服务器用作新的主服务器,从而实现无间断运行。
11:SHUTDOWN 命令执行以下操作:
停止所有客户端
如果有至少一个保存点在等待,执行 SAVE 命令
如果 AOF 选项被打开,更新 AOF 文件
关闭 redis 服务器(server)
如果持久化被打开的话, SHUTDOWN 命令会保证服务器正常关闭而不丢失任何数据。
另一方面,假如只是单纯地执行 SAVE 命令,然后再执行 QUIT 命令,则没有这一保证 —— 因为在执行 SAVE 之后、执行 QUIT 之前的这段时间中间,其他客户端可能正在和服务器进行通讯,这时如果执行 QUIT 就会造成数据丢失。
SAVE 和 NOSAVE 修饰符
通过使用可选的修饰符,可以修改 SHUTDOWN 命令的表现。比如说:
执行 SHUTDOWN SAVE 会强制让数据库执行保存操作,即使没有设定(configure)保存点
执行 SHUTDOWN NOSAVE 会阻止数据库执行保存操作,即使已经设定有一个或多个保存点(你可以将这一用法看作是强制停止服务器的一个假想的 ABORT 命令)
本文是自己测试学习结果,如果你感觉此文对你有帮助,请帮忙点一下推荐。这将鼓励我继续写下去。