redis技术之旅三

来源:互联网 发布:宁波楼盘每日成交数据 编辑:程序博客网 时间:2024/04/27 22:21

redis技术之旅三 服务器端的操作
redis可以通过其终端命令行工具进行许多redis server操作,作为一个运维人员,以下的许多命令多能帮助获取redis的信息和确诊问题,下面对这些操作进行介绍。
BGREWRITEAOF
执行AOF持久化文件的重写操作,这种重写会创建一个当前AOF文件的体积优化版本,此操作即使执行失败,也不会造成数据丢失,因为在其生成优化后的AOF文件之前,老版本的AOF 文件不会被删除。
这种重写操作与其他持久化操作是冲突的,也就是如果redis正在执行快照的保存操作,那么重写操作会被预定,等到快照操作完成后在执行重写。在操作进入预定状态时命令的返回值还是OK,但还会有额外的信息说明重写操作等待快照保存完成后再执行
如果已经有别的重写AOF在执行,那么操作会直接返回操作,也不会进入预定状态等待执行。

BGSAVE
这儿命令在后台异步的执行保存内存快照到磁盘,并根据配置决定是否进行压缩。
这个命令的执行立即返回OK,redis会fork出一个新的子进程异步的继续处理命令的操作,将数据快照保存到磁盘,此时,父进程继续处理来自客户端的请求。

CLIENT GETNAME
返回客户端被CLIENT SETNAME 命令为连接设置的名字,因为新的连接没有名字,所以CLIENT GETNAME会返回空值。

CLIENT KILL
关闭地址为IP:PORT的客户端连接,其中的IP:PORT应该和CLIENT LIST命令的输出相匹配。因为redis使用单线程设计,所以redis在执行命令的时候不会有客户端被断开连接。

CLIENT LIST
已可读的方式返回当前连接到服务器的客户端信息。

CLIENT SETNAME
为当前的链接配置一个名字,这个名字会显示在CLIENT LIST命令里。

CONFIG GET
这个命令用于取得运行中的redis服务器的配置参数的值,在redis 2.4版本中,有部分参数无法通过这个命令获取,但是在>2.6版本后,所有的参数都可以通过这个命令获取。
[root@]# redis-cli -p 6379 info | grep redis_version
redis_version:2.4.14
[root@]# redis-cli -p 6379
redis 127.0.0.1:6379> CONFIG GET logfile
(empty list or set)
redis 127.0.0.1:6379> CONFIG GET loglevel
1) “loglevel”
2) “notice”
-====================================================
[root@ /usr/local/redis_cluster/master_6379]
redis-cli -p 6379 info | grep redis_version
redis_version:2.8.3
[root@ /usr/local/redis_cluster/master_6379]
redis-cli -p 6379
127.0.0.1:6379> CONFIG GET logfile
1) “logfile”
2) “/usr/local/redis_cluster/master_6379/redis_6379.log”
127.0.0.1:6379> CONFIG GET loglevel
1) “loglevel”
2) “notice”

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 计数器的值)

CONFIG REWRITE
此命令将redis服务器启动时所指定的配置文件进行重写,因为CONFIG SET命令可以对服务器当前的配置进行修改,而修改后的配置和配置文件中记录的不一致,此命令可以防止这种情况的发生。
这个命令在>=2.8.0的版本可以使用。

CONFIG SET
此命令可以动态的调整redis服务器的配置而无需重启。但并不是所有的参数都可以动态修改,取决于版本。可以修改的参数可以通过CONFIG GET *来列出,所有修改,操作正确立刻生效。

DBSIZE
返回当前数据库KEY的数量。

DEBUG OBJECT
这是一个调试命令,绝对不应该被客户端使用和执行。更不要在生产环境执行此操作。
127.0.0.1:6379> DEBUG SEGFAULT
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected>
not connected>
DEBUG SEGFAULT
此命令用于开始时候的测试使用,执行一个不合法的内存访问从而让redis崩溃,仅在开发时用于bug模拟。绝对不应该被客户端使用和执行。更不要在生产环境执行此操作。

FLUSHALL
此命令用于清空整个redis服务器的数据,删除所有数据库的所有key。此命令从不失败,只有在十分明确自己要进行此操作的时候,做好完整的数据备份,再执行此命令。

FLUSHDB
此命令用于清空当前数据库中的所有的key。此命令从不失败。只有在十分明确自己要进行此操作的时候,做好完整的数据备份,再执行此命令。

INFO
以一种易于阅读的格式返回redis的各种统计信息,这个应该是在运维过程中经常会被用到的命令,用于收集redis服务器信息。
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 作为默认参数。

LASTSAVE
返回最近一次执行redis快照保存成功的时间。

MONITOR
实际打印出redis服务器正在执行的命令,用于调试,这个命令会对性能有所影响,建议在生产环境谨慎使用。

PSYNC
复制功能的内部命令,当写到redis的主从复制时,还会说道这个命令,这个命令也是高版本的redis对主从复制进行优化后才有的一个内部命令。

SAVE
此命令也是将redis快照保存到磁盘,不同于BGSAVE的是,他会阻塞所有客户端知道命令执行结束,这个对于单线程的redis服务器来说,主线程阻塞对于生产环境来说是不可以接受的。在生产环境下很好使用这个命令。

SHUTDOWN
此命令用来关闭redis服务器。
SHUTDOWN 命令执行以下操作:
停止所有客户端
如果有至少一个保存点在等待,执行 SAVE 命令
如果 AOF 选项被打开,更新 AOF 文件
关闭 redis 服务器(server)
如果持久化被打开的话, SHUTDOWN 命令会保证服务器正常关闭而不丢失任何数据。
另一方面,假如只是单纯地执行 SAVE 命令,然后再执行 QUIT 命令,则没有这一保证 —— 因为在执行 SAVE 之后、执行 QUIT 之前的这段时间中间,其他客户端可能正在和服务器进行通讯,这时如果执行 QUIT 就会造成数据丢失。
SAVE 和 NOSAVE 修饰符
通过使用可选的修饰符,可以修改 SHUTDOWN 命令的表现。比如说:
执行 SHUTDOWN SAVE 会强制让数据库执行保存操作,即使没有设定(configure)保存点
执行 SHUTDOWN NOSAVE 会阻止数据库执行保存操作,即使已经设定有一个或多个保存点(你可以将这一用法看作是强制停止服务器的一个假想的 ABORT 命令)

SLAVEOF
此命令用于redis运行过程中,动态修改复制行为的命令,通过这个命令可以将当前服务器装换为执行服务器的从服务器。如果当前服务器已经是某个服务器的从服务器,这个命令会让其断开与其原来主服务器的来接,清空数据,从新的主服务器或者数据快照开始同步。
可以通过 SLAVEOF NO ONE 关闭从服务器的复制功能,并转换为可读写的主服务器(从服务器默认不可写),已同步过来的数据不会被清空。利用这个命令可以将从服务器拉起为主服务器其,实现主从切换,用于高可用的情况。

SLOWLOG
此命令用来获取redis服务器查询时间比较长的命令。
redis服务器会按照慢查询的配置记录运行超过某些时间命令。这个执行时间不包括客户端的响应、发送回复所需的IO,只是执行命令所耗费的时间。
设置 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

SYNC
redis主从复制所需的内部命令。

TIME
返回当前服务器时间。

0 0
原创粉丝点击