Redis学习笔记04Redis命令之(3)服务器操作

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

1.1.1. client list

列出所有客户端连接信息。

每个连接使用一个id=xxx的行表示。

 

 

redis.coe2coe.me:6379> client list

id=8 addr=192.168.197.101:42247 fd=6 name= age=169 idle=169 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=command

id=9 addr=192.168.197.101:42248 fd=7 name= age=134 idle=114 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client

id=10 addr=192.168.197.101:42249 fd=8 name= age=4 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

 

id:64bit唯一的客户端ID。

addr:IP地址和端口号。

fd:   socket对应的文件描述符。

name:客户端名称。使用client setname设置,client getname获取。

age:连接以来的时间,秒。

idle:空闲时间,秒。

flags:标志。

db:当前选择的数据库序号。

sub:频道订阅数量。

psub:模式匹配订阅数量。

multi: MULTI/EXEC上下文中的命令数量。

qbuf:查询缓冲区长度。

qbuf-free:查询缓冲区空闲空间。

ob1:输出缓冲区长度。

ol1:输出链表长度,当输出缓冲区满时,回复信息在这个链表中排队。

omem:输出缓冲区内存使用。

events:文件描述符事件。

cmd:执行的最后一个命令。似乎只显示命令的第1个单词。

 

flags标志的含义如下:

O:客户端在MONITOR模式中作为slave。

S:客户端是正常的slave。

M:客户端是一个master。

x: 客户端在MULTI/EXEC上下文中。

b:客户端在等待阻塞操作。

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

d:观察的keys已经被修改了。

c:连接在条目回复后将被关闭。

u:客户端是非阻塞的。

U:客户端通过Unix domain socket连接。

r:客户端作为一个集群结点在只读模式中。

A:连接将尽快被关闭。

N:没有设置标志。

 

 

 

 

 

 

实例名:r-bp1cxxxxxxxxxd04(主从)

1.1.4. client kill

断开指定的客户端的连接,即删除指定的客户端。可按以下几种方式进行删除:

 

(1)参数为客户端连接的IP地址和端口号。

假定当前有redis1,redis2,redis3三个连接:

redis.coe2coe.me:6379> client list

id=13 addr=192.168.197.101:42252 fd=6 name=redis3 age=489 idle=4 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client

id=14 addr=192.168.197.101:42253 fd=7 name=redis1 age=477 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

id=15 addr=192.168.197.101:42254 fd=8 name=redis2 age=41 idle=10 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client

 

现在删除掉redis3这个连接,地址为192.168.197.101:42252。

redis.coe2coe.me:6379> client kill 192.168.197.101:42252

OK

删除客户端成功。

 

再次查看客户端列表,只有2个连接了。

redis.coe2coe.me:6379> client list

id=14 addr=192.168.197.101:42253 fd=7 name=redis1 age=499 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

id=15 addr=192.168.197.101:42254 fd=8 name=redis2 age=63 idle=32 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client

redis.coe2coe.me:6379>

 

 

(2)按照客户端ID进行删除。

 

redis.coe2coe.me:6379> client kill id 14

(integer) 0

默认情况下,skipme为true,删除当前连接似乎是删除不掉的。

 

澳门皇家赌场手机版,redis.coe2coe.me:6379> client kill id 14 skipme no

(integer) 1

指定skipme为no,则可以成功删除当前连接。

 

redis.coe2coe.me:6379> client kill id 16

(integer) 1

id为16的连接删除成功了。

 

客户端每次连接到redis服务后,产生一个新的ID。ID的序号总是不断的增加。

 

 

属性名

1.1.6. monitor

实时监控Redis收到的各种命令,并反馈到执行monitor命令的客户端连接上。

 

redis.coe2coe.me:6379> monitor

OK

注意:此时不再显示redis提示符。

此时在其它客户端连接上执行一些命令,则这里可以看到所执行的命令,包含参数,但是不包括Redis反馈的执行结果。

 

1499848978.376966 [0 192.168.197.101:42265] "AUTH" "123456"

1499848978.377772 [0 192.168.197.101:42265] "COMMAND"

1499848991.031939 [0 192.168.197.101:42266] "AUTH" "123456"

1499849008.065442 [0 192.168.197.101:42266] "ping"

1499849034.680658 [0 192.168.197.101:42266] "echo" "hello"

1499849323.293098 [0 192.168.197.101:42267] "set" "host" "redis.coe2coe.me"

 

(2) 开始测试

1.1.3. client  getname

获取当前连接的客户端名称。

redis.coe2coe.me:6379> client getname

(nil)

默认情况下名称为空。可使用client getname设置。

 

redis.coe2coe.me:6379> client setname redis1

OK

redis.coe2coe.me:6379> client getname

"redis1"

 

 

先批量写入到rehash阈值附近,然后在逐条去写,观察内存变化

1.1.2. client  setname

设置当前连接的客户端名称。

redis.coe2coe.me:6379> client setname redis1

OK

redis.coe2coe.me:6379> client getname

"redis1"

 

redis.coe2coe.me:6379> client setname ""

OK

redis.coe2coe.me:6379> client getname

(nil)

 

在设置客户端名称之后,如果被client kill删除了,则客户端名称被清空了。

                                                                                      

(1) kv内存:bigkey、大量写入

1.1.5. client pause

让所有客户端暂停指定时间,单位,毫秒。

 

 

redis.coe2coe.me:6379> client pause 10000

OK

所有客户端将暂停10秒钟。

 

立即执行client list指令:

redis.coe2coe.me:6379> client list

并不会立即取得相应结果,而是在等待了一段时间后才取得结果:

 

id=18 addr=192.168.197.101:42257 fd=6 name= age=152 idle=7 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client

id=19 addr=192.168.197.101:42258 fd=7 name=redis3 age=121 idle=1 flags=u db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client

id=20 addr=192.168.197.101:42259 fd=8 name=redis2 age=112 idle=4 flags=u db=0 sub=0 psub=0 multi=-1 qbuf=41 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client

(7.06s)

括号中的数字表明此命令等待了7.06秒。

 

 

keys mem clients blocked requests connections32766 4.69M 3 0 32797 (+2) 4 32767 4.69M 3 0 32799 (+2) 4 32768 4.69M 3 0 32801 (+2) 4 32769 5.44M 3 0 32803 (+2) 4

(1) 自身内存:一个空的Redis占用很小,可以忽略不计

keys mem clients blocked requests connections1048574 128.69M 3 0 3364129 (+2) 16 1048575 128.69M 3 0 3364131 (+2) 16 1048576 128.69M 3 0 3364133 (+2) 16 1048577 160.69M 3 0 3364135 (+2) 16 1048578 160.69M 3 0 3364137 (+2) 16

计算公式如下:

二、Redis内存分析

键值规模:6000万左右

2. 内存分析

1. Redis的kv存储结构

keys mem clients blocked requests connections67108862 9.70G 3 0 70473683 (+2) 18 67108863 9.70G 3 0 70473685 (+2) 18 67108864 9.70G 3 0 70473687 (+2) 18 67108865 11.70G 3 0 70473689 (+2) 18 67108866 11.70G 3 0 70473691 (+2) 18 67108867 11.70G 3 0 70473693 (+2) 18

每个属性的详细说明

常用的几招都用了,还是不行,同事@径远帮忙一起分析,怀疑是不是因为Redis的kv哈希表做了 rehash。

(a) 当阈值=215=32768,从下面可以看出到key的个数为32769时,内存涨了一些,但是还不明显。

redisinfomemory#Memoryused_memory:9195978072used_memory_human:8.56Gused_memory_rss:9358786560used_memory_peak:10190212744used_memory_peak_human:9.49Gused_memory_lua:38912mem_fragmentation_ratio:1.02mem_allocator:jemalloc-3.6.0 

(1) 测试方法

属性说明

内存一分钟增长2G.png

执行client中也没有明显的omem大于0的情况

为了保证哈希表的负载,当哈希表的元素个数等于哈希表槽数时候,会进行rehash扩容。扩容后h[1]的容量等于第一个大于等于ht[0].size*2的2n,例如hash表的初始化容量是4,那么下一次扩容就是8,以此类推。

(3) 缓冲区:客户端缓冲区(普通 + slave伪装 + pubsub)以及aof缓冲区(比较固定,一般没问题)

(3) 客户端缓冲区

(1) bigkey 经扫描未发现bigkey

3. 测试

本文由皇家赌场手机版发布于首页,转载请注明出处:Redis学习笔记04Redis命令之(3)服务器操作

相关阅读