程序=命令+数据

redis是一个开源的(BSD许可的)内存数据结构存储,用作数据库、缓存和消息代理,掮客

它支持数据结构,如字符串、hashes散列、lists列表、sets集合、sorted sets有序集合、位图、超级日志和带RADIUS查询的地理空间索引。

redis是一个远程数据结构服务器,也是字典服务器

安装redis

yum install redis -y

配置文件

vim /etc/redis.conf

bind 0.0.0.0 监听本机的所有ip

port 6379 监听端口是6379

启动服务

systemctl start redis

查看端口

ss -ntlp

clip_image002

redis可以进入命令模式,每次执行一个命令

redis也可以进入交互式模式,可以随时传入命令

redis-cli :redis连接选项

-h 指定服务器,如果不写默认是127.0.0.1

-p 端口,不写默认是6379

-a 密码认证

-n 数据库是靠数字格式的设置的

[root@contes7 ~]# redis-cli

127.0.0.1:6379>

SET mykey 'hi' 创建key

GET mykey 查看创建key

clip_image004

支持的数据库结构:string字符串,list列表(数组),字典(关联数组),集合,有序集合,发布/订阅

@string 字符串

SET 设定键值,如果有值就改变,如果没有就新建

NX :不存在该怎么 ,后缀加上NX 的意思是,如果设定的值不存在,那我们才设定这个键值,所以表示新建键

XX :存在该怎么 ,如果键存在才设定其值,如果步存在是不会新建的

GAT 获取键值

EXISTS 判断指定键是否存在

INCR 增加修改键的值

例 :SET count 0 set设定一个值

INCR count 追加这个值

DECR 降值

例 :DECR count 降值

SETNX 新建值

SETEX 设定键的过期时间

例:SETEX newkey 10 'hello world'

过期时间为10秒

INCRBYFLOAT 以浮点的方式

MGET 一次获取多个键的值

MSET 一次设定多个键的值

STRLEN 获取键中的字符长度

例: STRLEN mykey

BITOP 比较的方式

APPEND 在一些值的后面追加一些新的内容

在交互模式可以使用help @string 查看命令的具体使用

@list 列表

在交互模式可以使用help @list 查看命令的具体使用

LPUSH 从左进

LPOP 从左出 弹出里面的内容

RPUSG 右进

RPOP 右出

LSET 用来该其中的一个键值

LRANGE 指定范围内键的值

LPUSHX 从左侧入站,但是只有这个列表存在才进站

RPUSHX 只有列表存在,才从右侧新增元素

LTRIM 删除指定范围内的键

LREM 移除一个指定元素

LINDEX 获取指定索引的值

BLPOP 移除并拿到列表中的第一个元素

HSTRLEN 获取键中指定段的值

HVALS 获取指定键的所有值

HKEYS 获取指定键的所有内建的键

HMGET 一次获取多个键值

HGET 一次获取一个键值

HEXISTS 判断里面的字段是否存在

HDEL 删除字段

HGETALL 一次获取所有键值

例:

127.0.0.1:6379> RPUSH weekdays Sun 从右侧进

(integer) 1

127.0.0.1:6379> LPOP weekdays 从左侧出,弹出

"Sun"

127.0.0.1:6379> LINDEX weekdays 0 查看索引为0的值

(nil)

127.0.0.1:6379>

从右侧进去,查看的只能先查看最后进去的内容

127.0.0.1:6379> LPUSH weekdays Min Tue Web

(integer) 4

127.0.0.1:6379> LINDEX weekdays 0

"Web"

127.0.0.1:6379> LINDEX weekdays 1

"Tue"

127.0.0.1:6379> LINDEX weekdays 2

"Min"

弹出数据

127.0.0.1:6379> LPOP weekdays

"Web"

127.0.0.1:6379> LPOP weekdays

"Tue"

127.0.0.1:6379> LPOP weekdays

"Min"

查看元素的个数

127.0.0.1:6379> LLEN weekdays

(integer) 1

从右侧入站

127.0.0.1:6379> RPUSH weedays Mon Tue Wed

(integer) 3

127.0.0.1:6379> LINDEX weedays 0

"Mon"

127.0.0.1:6379> LINDEX weedays 1

"Tue"

127.0.0.1:6379> LINDEX weedays 2

"Wed"

指定范围内键的值

127.0.0.1:6379> LRANGE weedays 0 3

1) "Mon"

2) "Tue"

3) "Wed"

只保留指定的两个值

127.0.0.1:6379> LTRIM weedays 0 2

OK

创建键 用户 id是1 名字Tom 年龄13 性别男

127.0.0.1:6379> HMSET stu1 id 1 name tom age 13 gender male

OK

获取所有键

127.0.0.1:6379> HKEYS stu1

1) "id"

2) "name"

3) "age"

4) "gender"

获取所有键的值

127.0.0.1:6379> HVALS stu1

1) "1"

2) "tom"

3) "13"

4) "male"

改变每个键的值

27.0.0.1:6379> HSET stu1 age 12

(integer) 0

127.0.0.1:6379> HVALS stu1

1) "1"

2) "tom"

3) "12"

4) "male"

查看某一字段的长度

127.0.0.1:6379> HSTRLEN stu1 name

(integer) 3

获取一个键值

127.0.0.1:6379> HGET stu1 name

"tom"

删除某一字段

127.0.0.1:6379> HDEL stu1 gender

(integer) 1

help @set 集合,向集合中添加元素

SADD 创建集合

SCARD 获取有多少元素

SMEMBERS 列出使用的元素

SREM 移除元素

SMOVE 移动元素

SINTER 交集

SUNION 并集

SDIFF 叉集

例:

创建集合

127.0.0.1:6379> SADD stus tom jerry lilei han××× lucy lily

(integer) 6

随机移除两个

127.0.0.1:6379> SPOP stus 2

1) "tom"

2) "lilei"

查看有几个元素

127.0.0.1:6379> SCARD stus

(integer) 4

列出所有元素

127.0.0.1:6379> SMEMBERS stus

1) "jerry"

2) "lily"

3) "han×××"

4) "lucy"

删除指定的元素

127.0.0.1:6379> SREM stus han×××

(integer) 1

127.0.0.1:6379> SMEMBERS stus

1) "jerry"

2) "lily"

3) "lucy"

对集合运算的方式 交集,并集,叉集

127.0.0.1:6379> SADD stus2 tom jerry lucy lily

(integer) 4

选择有两个集合,之间进行运算

127.0.0.1:6379> SMEMBERS stus2

1) "lily"

2) "tom"

3) "lucy"

4) "jerry"

127.0.0.1:6379> SMEMBERS stus

1) "jerry"

2) "lily"

3) "lucy"

127.0.0.1:6379>

查看交集

127.0.0.1:6379> SINTER stus stus2

1) "jerry"

2) "lily"

3) "lucy"

查看并集

127.0.0.1:6379> SUNION stus stus2

1) "lucy"

2) "jerry"

3) "lily"

4) "tom"

127.0.0.1:6379>

查看叉集,要注意顺序,谁叉谁

127.0.0.1:6379> SDIFF stus stus2 先写stus后写stus2是代表左侧有而右侧没有的

(empty list or set)

127.0.0.1:6379> SDIFF stus2 stus 先写stus2后写stus是代表左侧有而右侧没有的

1) "tom"

127.0.0.1:6379>

查看有序集合

help @sorted_set

ZRANK 获取指定成员的索引信息,索引是根据得分排位序以后,顺序的表示的索引

ZRANGE 根据索引获取指定范围内的成员

ZRAGEBYSCORE 根据得分,选出得分范围内的相关成员

ZREMRANGEBYLEX 以lexicographical删除

ZREMRANGEBYRANK 以索引范围删除指定成员

ZREMRANGEBYSCORE 以得分范围删除指定成员

ZINTERSTORE 做交集以后存下来

ZUNIONSTORE 并集

ZSCORE 获取成员得分

例:

创建有序的集合

127.0.0.1:6379> ZADD z1 100 tom 90 jerry 80 obama 70 trump

(integer) 4

查看用多少元素

127.0.0.1:6379> ZCARD z1

(integer) 4

查看索引信息

127.0.0.1:6379> ZRANK z1 tom

(integer) 3

127.0.0.1:6379> ZRANK z1 obama

(integer) 1

127.0.0.1:6379> ZRANK z1 trump

(integer) 0

127.0.0.1:6379> ZRANK z1 jerry

(integer) 2

根据索引取出数据

127.0.0.1:6379> ZRANGE z1 0 2

1) "trump"

2) "obama"

3) "jerry"

基于得分取数据,85分到100分之间的数据

127.0.0.1:6379> ZRANGEBYSCORE z1 85 100

1) "jerry"

2) "tom"

发布订阅队列

help @pubsub

PSUBSCRIBE 订阅某个队列,基于模式,订阅好几个队列,可以基于正则表达式模式去匹配一组队列,一个消费者可以订阅多个队列

PUBLIST 向一个队列中频道中发布信息

SUBSCRIBE 订阅某一个频道,只要有消息就可以看到

UNSUBSCRIBE 取消订阅

PUNSUBSCRIBE 基于模式取消订阅

例:

订阅多个队列

打开多个终端

127.0.0.1:6379> SUBSCRIBE test

Reading messages... (press Ctrl-C to quit)

1) "subscribe"

2) "test"

3) (integer) 1

127.0.0.1:6379> SUBSCRIBE test

Reading messages... (press Ctrl-C to quit)

1) "subscribe"

2) "test"

3) (integer) 1

向队列发送一个信息

127.0.0.1:6379> PUBLISH test hi

(integer) 2

127.0.0.1:6379> SUBSCRIBE test

Reading messages... (press Ctrl-C to quit)

1) "subscribe"

2) "test"

3) (integer) 1

1) "message"

2) "test"

3) "hi"

127.0.0.1:6379> SUBSCRIBE test

Reading messages... (press Ctrl-C to quit)

1) "subscribe"

2) "test"

3) (integer) 1

1) "message"

2) "test"

3) "hi"

分布式系统两个基础理论:CAP/BASE

CAP:AP

C、A、P:三者其中之二;

AP:可用性、分区容错性、弱一致性;

BASE:BA,S,E

BA:基本可用、S:软状态、E:最终一致性;

redis 是一个C/S架构

C:redis-cil

S:redis-server

redis-cli命令:

Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]

-h HOST, 127.0.0.1

-p PORT, 6379/tcp

-a PASSWORD

-n DBID

0-15

包含了和连接相关的命令

help @connection

PING 探测服务器是否为健康

127.0.0.1:6379> PING

PONG 回复PONG 表示正常

AUTH 认证

SELECT 切换数据库

127.0.0.1:6379> SELECT 15

OK

127.0.0.1:6379[15]>

KEYS 符合模式的所有键

127.0.0.1:6379[15]> KEYS * 表示存在当前索引内的对应数据库的存在的键

(empty list or set)

QUIT 退出当前客户端

清空数据库

127.0.0.1:6379> FLUSHDB 慎重啊啊啊

OK

清空所有数据库

127.0.0.1:6379> FLUSHALL 慎重啊啊啊

OK

通用配置项

vim /etc/redis.conf

daemonize 是否运行为守护进程

supervised no 如果定义为no,表示不需要额外管控

databases 16 定义数据库的数量,无限使用设定为-1

网络配置

protected-mode yes 保护模式,不管监听什么地址,都通过127.0.0.1 ,不允许远程连接

1.保护模式启用的条件,没有显示bind指令,并且又没有配置密码

timeout 300 如果在300秒能没有操作,就断开

tcp-keepalive 300 tcp连接超时时长

安全配置

vim /etc/redis.conf

requirepass ilinux 密码是ilinux

rename-command FLUSHDB b840fc02d524045429941cc15f59e41cb7be6c52

可以禁用某个目录的使用,例如:禁用FLUSHDB

重启服务

systemctl restart redis

[root@contes7 ~]# redis-cli -h 192.168.63.131 登录客户端

192.168.63.131:6379> AUTH ilinux 验证密码

OK

192.168.63.131:6379> KEYS * 测试查看数据库中所有可用的键

(empty list or set)

192.168.63.131:6379>

redis-cli -h 192.168.63.131 -a ilinux

Limits 跟资源限制相关的

maxclients 10000 最大客户端连接的数量

maxmemory 内存 拿出多少内存给redis使用,如果不设置使用的是本机的所有可用内存

如果不设置可能遇见 OOM:Out of Memory 内存耗尽,如果内存耗尽内存将杀死最耗内存的进程

注:如果内存即将耗尽redis怎么办

maxmemory-policy noeviction 内存淘汰机制

volatile-lru 内存淘汰算法,对所有有过期时间的键 lru淘汰

allkeys-lru 对所有键lru淘汰,只有把redis当缓存才能淘汰,把redis当内存的不能淘汰

volatile-random 仅对有过期时间的键随机淘汰

allkeys-random 对所有键随机淘汰

volatile-ttl 对所有设置了过期时间的键,按ttl逆序淘汰,看谁的过期时间短,谁的时间长,对短的淘汰

noeviction 不淘汰任何键,如果没有空间了就报错

Slowlog man查询日志

slowlog-log-slower-than 10000 执行时长超过多久 单位是微秒

slowlog-max-len 128 记录了日志的最大条目

ADVANCED 高级配置,定义数据结构

hash-max-ziplist-entries 512

hash-max-ziplist-value 64

redis面向客户端一侧发送缓冲

client-output-buffer-limit normal 0 0 0 没有限制

client-output-buffer-limit slave 256mb 64mb 60 从服务器 256mb硬限制,决不允许。64mb软限制,可以临时超出,60秒的缓冲时间

client-output-buffer-limit pubsub 32mb 8mb 60

redis-cil

server相关的命令

CLIENT GETNAME 获取客户端相关连接信息

127.0.0.1:6379> CLIENT GETNAME

(nil)

CLIENT LIST 列出所有客户端的连接信息

CLIENT SETNAME local 设置当前连接的名称

CONFIG GET requirepass 查看requirepass的认证信息

127.0.0.1:6379> CONFIG GET requirepass

1) "requirepass"

2) ""

CONFIG GET maxclients 查看最大并发连接数

127.0.0.1:6379> CONFIG GET maxclients

1) "maxclients"

2) "10000"

CONFIG SET maxclients 10200 相关最大的并发连接是10200个,一重启就会丢失

INFO 查看内部信息

INFO CPU 只查看某一个信息

redis持久化

RDB 快照

dbfilename dump.rdb 定义的文件名为 dump.rdb

/var/lib/redis 文件的存放的位置

rdbchecksum yes 每一次保存完要不要校验,确保文件是正确的

rdbcompression yes 快照完要不要压缩

stop-writes-on-bgsave-error yes 直接保存快照出现错误,要不要停止redis,禁止写入

save 900 1 在900秒内,有一次操作,就触发一次快照

save 300 10 在300秒内,有10次的修改操作,就触发一次操作

save 60 10000 在60秒钟内,发生10000次操作,就立即触发一次操作

AOF

appendfilename "appendonly.aof" 文件名,存放的位置和RDB一样

触发重写的条件

auto-aof-rewrite-percentage 100 aof发生的变化的容量占整个文件容量的50%

auto-aof-rewrite-min-size 64mb 所有aof文件加起来的文件不能小于64兆

上述两个条件同时满足时,方会触发重写AOF;与上次aof文件大小相比,其增长量超过100%,且大小不少于64MB;

appendfsync everysec

######################################################################333

redis的扩展

主从复制

分布式模型

有中心节点:单点

无中心节点

判断一个从节点在线的标准是:从节点的数据量延迟于主节点不超过10秒钟,就判定从节点在线

只能主服务器写,从节点不能写

192.168.63.131 主

192.168.63.132 从

192.168.63.141 从

sentinel集群,用来监控主从复制集群

192.168.63.140

192.168.63.137

192.168.63.134

192.168.63.131 主

vim /etc/redis.conf

bind 0.0.0.0 ip地址监听在本机所有可用ip

port 6379 监听的端口

requirepass ilinux 查看密码验证是否启用 ,密码是ilinux

192.168.63.132 从

vim /etc/redis.conf

bind 0.0.0.0 ip地址监听在本机所有可用ip

port 6379 监听的端口

slaveof contes7.magedu.com 6379 主服务器的主机名是contes7.magedu.com 端口是6379

masterauth ilinux 主节点的认证密码,密码是ilinux

requirepass ilinux 从节点密码认证,密码是ilinux

192.168.63.131 主

[root@contes7 ~]# redis-cli 登录redis交互界面

127.0.0.1:6379> AUTH ilinux 验证密码

OK

127.0.0.1:6379> CLIENT LIST 查看所有客户端

id=2 addr=192.168.63.141:41332 fd=5 name= age=113 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=3 addr=127.0.0.1:32840 fd=6 name= age=49 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

127.0.0.1:6379>

127.0.0.1:6379> INFO replication 查看replication相关信息段

# Replication

role:master

connected_slaves:1 有几个从服务器

slave0:ip=192.168.63.141,port=6379,state=online,offset=309,lag=0

master_repl_offset:309

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:2

repl_backlog_histlen:308

127.0.0.1:6379> SET class m30 在主节点创建一个数据

OK

192.168.63.132 从

在从节点查看创建的数据

[root@contes7 ~]# redis-cli -a ilinux

127.0.0.1:6379> KEYS *

1) "class"

127.0.0.1:6379> GET class

"m30"

192.168.63.141 从

我们也可以在命令行设置

vim /etc/redis.conf

bind 0.0.0.0 ip地址监听在本机所有可用ip

port 6379 监听的端口

requirepass ilinux 从节点密码认证,密码是ilinux

[root@zhouyafei ~]# redis-cli -a ilinux

127.0.0.1:6379> SLAVEOF contes7.magedu.com 6379 主节点的主机名,和端口

OK

127.0.0.1:6379> CONFIG SET masterauth ilinux 主节点的密码ilinux

OK

127.0.0.1:6379> CONFIG REWRITE 立即生效,保存在配置文件中

OK

127.0.0.1:6379> KEYS * 查看复制过来的信息

1) "class"

127.0.0.1:6379> GET class

"m30"

192.168.63.131 主

[root@contes7 ~]# redis-cli 登录redis交互界面

127.0.0.1:6379> AUTH ilinux 验证密码

OK

127.0.0.1:6379> INFO replication

# Replication

role:master

connected_slaves:2

slave0:ip=192.168.63.141,port=6379,state=online,offset=1723,lag=1

slave1:ip=192.168.63.132,port=6379,state=online,offset=1723,lag=0

master_repl_offset:1723

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:2

repl_backlog_histlen:1722

127.0.0.1:6379>

如果主节点down机,提升从节点为主,所有节点优先级默认是100

配置优先级

192.168.63.141 从

redis-cli -a ilinux

127.0.0.1:6379> CONFIG SET slave-priority 90 设置优先级为90

OK

127.0.0.1:6379> CONFIG GET slave-priority 查看

1) "slave-priority"

2) "90"

127.0.0.1:6379> CONFIG REWRITE 立即生效,并写到配置文件

OK

用sentinel集群监控主从复制集群,必要时把从节点之一提升为主

sentinel集群

一样的配置

192.168.63.140

192.168.63.137

192.168.63.134

vim /etc/redis-sentinel.conf

bind 0.0.0.0 监听的地址是0.0.0.0

sentinel monitor mymaster 192.168.63.131 6379 2

监控的主从复制集群的主节点192.168.63.131 端口是6379 ,你的主从集群有半数认为down了才是真的down

sentinel auth-pass mymaster ilinux 主从集群的主节点的密码是ilinux

sentinel down-after-milliseconds mymaster 30000

如果30秒联系不到主节点就代表主节点down机,单位毫秒

sentinel parallel-syncs mymaster 5

如果主节点down机,所有的从节点都转向新的主节点,从新主节点复制数据,如果有大量的从节点,都重新复制负载太大,这里定义一次只允许几个复制,并行复制几个

sentinel failover-timeout mymaster 180000

在新的主节点复制数据到从节点的时候,如果3分钟还没有复制完成,显示复制超时

启动服务

systemctl start redis-sentinel.service

进入交互界面,端口是26379

[root@contes7 ~]# redis-cli -p 26379

查看监控的主节点是谁

127.0.0.1:26379> SENTINEL masters

查看主节点对应的从节点有几个,mymastart是主从集群的名字

127.0.0.1:26379> SENTINEL slaves mymaster

测试

停止主从复制集群的redis服务

systemctl stop redis

在sentinel集群查看

[root@contes7 ~]# redis-cli -p 26379

127.0.0.1:26379> SENTINEL masters 查看新主节点

1) 1) "name"

2) "mymaster"

3) "ip"

4) "192.168.63.132"

旧主节点修复完成变成从节点

vim /etc/redis.conf

bind 0.0.0.0 ip地址监听在本机所有可用ip

port 6379 监听的端口

slaveof 192.168.63.132 6379 主服务器的主机名是contes7.magedu.com 端口是6379

masterauth ilinux 主节点的认证密码,密码是ilinux

systemctl start redis

在新主节点查看

redis-cli -a ilinux

127.0.0.1:6379> INFO replication 查看有几个从服务器

# Replication

role:master

connected_slaves:2

slave0:ip=192.168.63.141,port=6379,state=online,offset=251963,lag=0

slave1:ip=192.168.63.131,port=6379,state=online,offset=251963,lag=0

###################################################################333

redis分布式扩展

假如我们的主从复制单节点已经不够了,而且并发连接的承载能力也不行了,所有我们要做分布式扩展

redis Cluster

CLuster:

集群相关的配置:

cluster-enabled 是否开启集群配置

cluster-config-file 集群节点集群信息配置文件,每个节点都有一个,由redis生成和更新,配置时避免名称冲突

cluster-node-timeout 集群节点互连超时的阈值,单位毫秒

cluster-slave-validity-factor 进行故障转移时,salve会申请成为master。有时slave会和master失联很久导致数据较旧,这样的slave不应该成为master。这个配置用来判断slave是否和master失联时间过长。

配置过程:

(1) 设置配置文件,启用集群功能;

(2) 启动redis后为每个节点分配slots;

CLUSTER ADDSLOTS

注意:每个slot要独立创建;可用范围是0-16383,共16384个;

redis-cli -c -h 192.168.1.100 -p 7000 cluster addslots {0..5000}

(3) 设定集群成员关系;

CLUSTE MEET

192.168.63.131

192.168.63.132

192.168.63.141

vim /etc/redis.conf

bind 0.0.0.0 监听地址

requirepass ilinux 密码认证

cluster-enabled yes 启用集群

cluster-config-file redis-cluster.conf 修改为 redis-cluster.conf

cluster-node-timeout 15000 集群节点互连超时的阈值,单位毫秒

cluster-slave-validity-factor 10 校验10

设置属主为redis用户

chown -R redis /etc/redis.conf

启动服务

systemctl start redis

删除原有的

rm -rf /var/lib/redis/dump.rdb

查看自动创建的文件redis-cluster.conf

ls /var/lib/redis/redis-cluster.conf

在任何节点查看

[root@zhouyafei ~]# redis-cli -a ilinux

127.0.0.1:6379> INFO cluster

# Cluster

cluster_enabled:1

(2) 启动redis后为每个节点分配slots;

CLUSTER ADDSLOTS

注意:每个slot要独立创建;可用范围是0-16383,共16384个;

第一个节点 1 5499

第二个节点 5500 10999

第三个节点 11000 16383

192.168.63.131

[root@contes7 ~]# redis-cli -a ilinux -h 192.168.63.131 -c cluster addslots {0..5499}

OK

[root@contes7 ~]# redis-cli -a ilinux -h 192.168.63.132 -c cluster addslots {5500..10999}

[root@contes7 ~]# redis-cli -a ilinux -h 192.168.63.141 -c cluster addslots {11000..16383}

OK

获取集群状态的信息

[root@contes7 ~]# redis-cli -a ilinux

127.0.0.1:6379> CLUSTER MEET 192.168.63.141 6379 设定集成员关系,指定别人,不用指定主机

OK

127.0.0.1:6379> CLUSTER MEET 192.168.63.132 6379

OK

127.0.0.1:6379> CLUSTER INFO

cluster_state:fail

cluster_slots_assigned:10885

cluster_slots_ok:10885

cluster_slots_pfail:0

cluster_slots_fail:0

cluster_known_nodes:3

cluster_size:2

cluster_current_epoch:1

cluster_my_epoch:1

cluster_stats_messages_sent:271

cluster_stats_messages_received:268