Redis客户端连接

redis通过监听一个TCP端口或socket的方式接收来自客户端的连接, 当与客户端建立连接后,redis内部会进行如下操作:
(1)客户端socket会被设置为非阻塞模式,因为redis在网络时间处理上采用的是非阻塞多路复用模型;
(2)然后为这个socket设置TCP_NODELAY属性,禁用Nagle算法;
(3)然后创建一个可读的文件事件用于监听这个客户端socket的数据发送。

查看连接数

#info clients可以查看当前的redis连接数
127.0.0.1:6379> info clients
# Clients
connected_clients:2
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

#config get maxclients 可以查询redis允许的最大连接数
127.0.0.1:6379> CONFIG GET maxclients
1) "maxclients"
2) "10000"

设置连接数

1. 在2.6之后版本,可以修改最大连接数配置,默认10000,可以在redis.conf配置文件中修改
...
# maxclients 10000
...

2.config set maxclients num 可以设置redis允许的最大连接数
127.0.0.1:6379> CONFIG set maxclients 10
OK
127.0.0.1:6379>

3.启动redis.service服务时加参数--maxclients 100000来设置最大连接数限制
redis-server --maxclients 100000 -f redis.conf

操作客户端连接

#获取客户端列表
127.0.0.1:6379> CLIENT list
id=2 addr=127.0.0.1:60931 fd=9 name= age=5949 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=18446744073709537584 events=r cmd=client
id=3 addr=127.0.0.1:61097 fd=10 name= age=5883 idle=1950 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=18446744073709534128 events=r cmd=type

#查看和设置当前连接的名称
127.0.0.1:6379> CLIENT GETNAME
(nil)
127.0.0.1:6379> CLIENT setname l-a
OK
127.0.0.1:6379> CLIENT GETNAME
"l-a"

#关闭客户端连接
127.0.0.1:6379> CLIENT KILL id 3
(integer) 0

敲重点

如果上面的那些指令实在记不住怎么办?用下面的2个指令可以解决问题

info
127.0.0.1:6379> info
# Server
redis_version:3.2.100
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:dd26f1f93c5130ee
redis_mode:standalone
os:Windows
arch_bits:64
multiplexing_api:WinSock_IOCP
process_id:19228
run_id:64b3358bbd71d6366c4146f2114865739c108c69
tcp_port:6379
uptime_in_seconds:6539
uptime_in_days:0
hz:10
lru_clock:6903198
executable:C:\Users\Redis-x64-3.2.100\redis-server.exe
config_file:

# Clients
connected_clients:2
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

# Memory
used_memory:20032288
used_memory_human:19.10M
used_memory_rss:19994504
used_memory_rss_human:19.07M
used_memory_peak:24114464
used_memory_peak_human:23.00M
total_system_memory:0
total_system_memory_human:0B
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:1.00
mem_allocator:jemalloc-3.6.0

# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1550400531
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:25
instantaneous_ops_per_sec:0
total_net_input_bytes:700
total_net_output_bytes:29430742
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:2
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.19
used_cpu_user:0.41
used_cpu_sys_children:0.00
used_cpu_user_children:0.00

# Cluster
cluster_enabled:0

# Keyspace
db0:keys=84342,expires=0,avg_ttl=0

通过给定可选的参数 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:0 rdb_changes_since_last_save:1866 #自上次dump后rdb的改动
rdb_bgsave_in_progress:0 #标识rdb save是否进行中
rdb_last_save_time:1452048771 #上次save的时间戳
rdb_last_bgsave_status:ok #上次的save操作状态
rdb_last_bgsave_time_sec:0 #上次rdb save操作使用的时间(单位s)
rdb_current_bgsave_time_sec:-1 #如果rdb save操作正在进行,则是所使用的时间
aof_enabled:1 #是否开启aof,默认没开启(已开启)
aof_rewrite_in_progress:0 #标识aof的rewrite操作是否在进行中
aof_rewrite_scheduled:0 #标识是否将要在rdb save操作结束后执行
aof_last_rewrite_time_sec:0 #上次rewrite操作使用的时间(单位s)
aof_current_rewrite_time_sec:-1 #如果rewrite操作正在进行,则记录所使用的时间
aof_last_bgrewrite_status:ok #上次rewrite操作的状态
aof_last_write_status:ok #上次write操作的状态
aof_current_size:42820373 #aof当前大小,以字节(byte)为单位
aof_base_size:16223723 #aof上次启动或rewrite的大小
aof_pending_rewrite:0 #同上面的aof_rewrite_scheduled
aof_buffer_length:0 #aof buffer的大小
aof_rewrite_buffer_length:0 #aof rewrite buffer的大小
aof_pending_bio_fsync:0 #后台IO队列中等待fsync任务的个数
aof_delayed_fsync:41394 #延迟的fsync计数器 TODO

  • stats : 一般统计信息

total_connections_received:61264941 #自启动起连接过的总数
total_commands_processed:951647408 #自启动起运行命令的总数
instantaneous_ops_per_sec:13 #每秒执行的命令个数 rejected_connections:0
#因为最大客户端连接书限制,而导致被拒绝连接的个数 sync_full:23 sync_partial_ok:0 sync_partial_err:0
expired_keys:40225836 #自启动起过期的key的总数 evicted_keys:0
#因为内存大小限制,而被驱逐出去的键的个数 keyspace_hits:54841673 #自启动起命中key的个数 keyspace_misses:344507 #自启动起未命中key的个数 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:8775
#上次的fork操作使用的时间(单位ms)

  • replication : 主/从复制信息

role:master #角色(主从)
connected_slaves:1 #从库数量
slave0:ip=10.15.x.x,port=6379,state=online,offset=2230297606,lag=2
#从库信息 master_repl_offset:2230300129 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2229251554
repl_backlog_histlen:1048576

  • cpu : CPU 计算量统计信息

used_cpu_sys:23111.87 #cpu在内核态所消耗的cpu的时间
used_cpu_user:17763.81 #cpu在用户态所消耗的cpu的时间
used_cpu_sys_children:7909.22 used_cpu_user_children:62767.11

  • commandstats : Redis 命令统计信息
  • cluster : Redis 集群信息
  • keyspace : 数据库相关的统计信息

Keyspace

db0:keys=85904,expires=81390,avg_ttl=47463342

除上面给出的这些值以外,参数还可以是下面这两个:
all : 返回所有信息
default : 返回默认选择的信息
当不带参数直接调用 INFO 命令时,使用 default 作为默认参数。

CONFIG GET *

该命令会列出所有配置文件中配置的和默认的配置信息

127.0.0.1:6379> CONFIG GET *
  1) "dbfilename"
  2) "dump.rdb"
  3) "requirepass"
  4) ""
  5) "masterauth"
  6) ""
  7) "unixsocket"
  8) ""
  9) "logfile"
 10) ""
 11) "pidfile"
 12) ""
 13) "maxmemory"
 14) "0"
 15) "maxmemory-samples"
 16) "5"
 17) "timeout"
 18) "0"
 19) "auto-aof-rewrite-percentage"
 20) "100"
 21) "auto-aof-rewrite-min-size"
 22) "67108864"
 23) "hash-max-ziplist-entries"
 24) "512"
 25) "hash-max-ziplist-value"
 26) "64"
 27) "list-max-ziplist-size"
 28) "-2"
 29) "list-compress-depth"
 30) "0"
 31) "set-max-intset-entries"
 32) "512"
 33) "zset-max-ziplist-entries"
 34) "128"
 35) "zset-max-ziplist-value"
 36) "64"
 37) "hll-sparse-max-bytes"
 38) "3000"
 39) "lua-time-limit"
 40) "5000"
 41) "slowlog-log-slower-than"
 42) "10000"
 43) "latency-monitor-threshold"
 44) "0"
 45) "slowlog-max-len"
 46) "128"
 47) "port"
 48) "6379"
 49) "tcp-backlog"
 50) "511"
 51) "databases"
 52) "16"
 53) "repl-ping-slave-period"
 54) "10"
 55) "repl-timeout"
 56) "60"
 57) "repl-backlog-size"
 58) "1048576"
 59) "repl-backlog-ttl"
 60) "3600"
 61) "maxclients"
 62) "10000"
 63) "watchdog-period"
 64) "0"
 65) "slave-priority"
 66) "100"
 67) "min-slaves-to-write"
 68) "0"
 69) "min-slaves-max-lag"
 70) "10"
 71) "hz"
 72) "10"
 73) "cluster-node-timeout"
 74) "15000"
 75) "cluster-migration-barrier"
 76) "1"
 77) "cluster-slave-validity-factor"
 78) "10"
 79) "repl-diskless-sync-delay"
 80) "5"
 81) "tcp-keepalive"
 82) "0"
 83) "cluster-require-full-coverage"
 84) "yes"
 85) "no-appendfsync-on-rewrite"
 86) "no"
 87) "slave-serve-stale-data"
 88) "yes"
 89) "slave-read-only"
 90) "yes"
 91) "stop-writes-on-bgsave-error"
 92) "yes"
 93) "daemonize"
 94) "no"
 95) "rdbcompression"
 96) "yes"
 97) "rdbchecksum"
 98) "yes"
 99) "activerehashing"
100) "yes"
101) "protected-mode"
102) "yes"
103) "repl-disable-tcp-nodelay"
104) "no"
105) "repl-diskless-sync"
106) "no"
107) "aof-rewrite-incremental-fsync"
108) "yes"
109) "aof-load-truncated"
110) "yes"
111) "maxmemory-policy"
112) "noeviction"
113) "loglevel"
114) "notice"
115) "supervised"
116) "no"
117) "appendfsync"
118) "everysec"
119) "appendonly"
120) "no"
121) "dir"
122) "C:\\Users\\Redis-x64-3.2.100"
123) "save"
124) "jd 3600 jd 300 jd 60"
125) "client-output-buffer-limit"
126) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60"
127) "unixsocketperm"
128) "0"
129) "slaveof"
130) ""
131) "notify-keyspace-events"
132) ""
133) "bind"
134) ""