程序=命令+数据
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
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
支持的数据库结构: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