Redis的系统级命令

文章建立一个统一的认识就是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[1]> config get dir
1) "dir"
2) "/home/redis/data"

看一下现在的dump.rbd文件

[[email protected] 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[1]> bgsave
Background saving started
\[[email protected] 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[1]> 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[1]> client getname
(nil)
127.0.0.1:6379[1]> client setname mxqconnect1
OK
127.0.0.1:6379[1]> client getname
"mxqconnect1"
127.0.0.1:6379[1]> 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[1]>

关闭自身的链接:

127.0.0.1:6379[1]> CLIENT KILL 127.0.0.1:34498
OK
127.0.0.1:6379[1]>
127.0.0.1:6379[1]> 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[1]> clinet get name
(error) ERR unknown command ‘clinet‘
127.0.0.1:6379[1]> client getname
(error) NOAUTH Authentication required.
127.0.0.1:6379[1]> AUTH maxiangqianreids
(error) ERR invalid password
127.0.0.1:6379[1]> AUTH maxiangqianredis
OK
127.0.0.1:6379[1]> config get timeout
1) "timeout"
2) "300"
127.0.0.1:6379[1]> config set timeout 3000
OK
127.0.0.1:6379[1]> 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,然后查看配置文件

[[email protected] 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 命令)

本文是自己测试学习结果,如果你感觉此文对你有帮助,请帮忙点一下推荐。这将鼓励我继续写下去。

时间: 2024-10-10 15:07:07

Redis的系统级命令的相关文章

Linux常用命令(系统级命令)

1.du 用来查看当前目录占用的磁盘空间大小 du -h  以K,M,G为单位显示 2.ifconfig  显示当前系统中网卡配置 临时设置网卡ip地址:ifconfig eth0 192.168.xxx.xxx reboot重启之后会自动恢复. 3.ping  用来测试网络的连通性 4.find  查找文件命令 find 目录名 -name “ifcfg-eth0”    在指定目录中查找某个文件 选中一行命令,把光标放在需要粘贴的位置,然后点击右键就相当于复制了选中的内容. 3.重启 reb

Redis 数据结构解析和命令指南

命令参考文档:redis commands - 你也许已经知道Redis并不是简单的key-value存储,实际上他是一个数据结构服务器,支持不同类型的值.也就是说,你不必仅仅把字符串当作键所指向的值.下列这些数据类型都可作为值类型. 二进制安全的 字符串 string 二进制安全的 字符串列表 list of string 二进制安全的 字符串集合 set of string,换言之:它是一组无重复未排序的element.可以把它看成Ruby中的 hash–其key等于element,valu

Redis介绍及常用命令

Redis介绍及常用命令 Redis是一个key-value存储系统.和Memcached类似,但是解决了断电后数据完全丢失的情况,而且她支持更多无化的value类型,除了和string外,还支持lists(链表).sets(集合).zsets(有序集合).Hashes(哈希表)几种数据类型.这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的. 博客分类: NoSql---Redis nosqlredis 一 Redis介绍 Red

Android系统级技巧合集

Android系统级技巧合集(随时更新) #转载请注明来源# 1.高通骁龙系列查看CPU体质等级 CPU体质,即为CPU在工作频率下的电压.同一批次的CPU体质各有不同,体质越高,代表该颗CPU可在更高的频率下稳定工作,且在相同频率下工作时功耗相比同批次体质差的CPU要控制得更好. 以搭载高通骁龙801的小米4(OS:第三方原生Android)为例,可在/sys下的文件中查找到描述该CPU体质的文件. 路径为:/sys/module/clock_krait_8974/parameters/ 在该

系统级性能分析工具perf的介绍与使用

测试环境:Ubuntu14.04  on VMWare Kernel:3.13.0-32 系统级性能优化通常包括两个阶段:性能剖析(performance profiling)和代码优化.性能剖析的目标是寻找性能瓶颈,查找引发性能问题的原因及热点代码.代码优化的目标是针对具体性能问题而优化代码或编译选项,以改善软件性能. 在性能剖析阶段,需要借助于现有的profiling工具,如perf等.在代码优化阶段往往需要借助开发者的经验,编写简洁高效的代码,甚至在汇编级别合理使用各种指令,合理安排各种指

系统级性能分析工具 — Perf

离2.6.31内核开始.linux核心配备了性能分析工具perf,它可以是功能级和指令级热外表. perf Performance analysis tools for Linux. Performance counters for Linux are a new kernel-based subsystem that provide a framework for all things performance analysis. It covers hardware level (CPU/PM

linux系统监控命令

ps命令 命令:ps -mp pid -o THREAD,tid,time   或者  ps -Lfp pid 结果展示: 这个命令的作用,主要是可以获取到对应一个进程下的线程的一些信息. 比如你想分析一下一个java进程的一些运行瓶颈点,可以通过该命令找到所有当前Thread的占用CPU的时间,也就是这里的最后一列. 比如这里找到了一个TID : 30834 ,所占用的TIME时间最高. 通过 printf "%x\n" 30834 首先转化成16进制, 继续通过jstack命令du

系统级I/O 第八周11.9~11.15

第十章 系统级I/O cp1 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #define BUFFERSIZE 4096//定义存储器容量 #define COPYMODE 0644//定义复制的长度 void oops(char *, char *); int main(int argc, char *argv[]) { int in_fd, o

Flume+Kafka+Storm+Redis实时分析系统基本架构

PS:历史原因作者账号名为:ymh198816,但事实上作者的生日并不是1988年1月6日 今天作者要在这里通过一个简单的电商网站订单实时分析系统和大家一起梳理一下大数据环境下的实时分析系统的架构模型.当然这个架构模型只是实时分析技术的一 个简单的入门级架构,实际生产环境中的大数据实时分析技术还涉及到很多细节的处理, 比如使用Storm的ACK机制保证数据都能被正确处理, 集群的高可用架构, 消费数据时如何处理重复数据或者丢失数据等问题,根据不同的业务场景,对数据的可靠性要求以及系统的复杂度的要