《Redis设计与实现》笔记3

2022-02-17 14:09:22 浏览数 (1)

参考《Redis设计与实现》

1.发布与订阅

发布与订阅指客户端可以订阅一个或多个频道,每当有其他客户端向频道发送消息时,频道的所有订阅者都会收到这条消息,如下:

发布与订阅分为两种:频道的订阅与退订、模式的订阅与退订

1.1 频道的订阅与退订

频道的订阅命令为subscribe,打开第一个终端,输完命令后会处于等待状态

代码语言:javascript复制
127.0.0.1:6379> subscribe news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news"
3) (integer) 1

现在再打开另一个终端,开始发布消息,命令是publish

代码语言:javascript复制
127.0.0.1:6379> publish news "bbc news"
(integer) 1
127.0.0.1:6379> publish news "雅虎 news"
(integer) 1
127.0.0.1:6379> publish news "bing news"
(integer) 1
127.0.0.1:6379> 

现在第一个终端会接收到消息

代码语言:javascript复制
127.0.0.1:6379> subscribe news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news"
3) (integer) 1
1) "message"	#这里开始是接收的消息
2) "news"
3) "bbc news"
1) "message"
2) "news"
3) "xe9x9bx85xe8x99x8e news"
1) "message"
2) "news"
3) "bing news"

退订的命令是unsubscribe

代码语言:javascript复制
127.0.0.1:6379> unsubscribe news
1) "unsubscribe"
2) "news"
3) (integer) 0
127.0.0.1:6379>

redis的所有的频道订阅关系都保存在pubsub_channels字典里

1.2 模式的订阅与退订

模式的订阅命令为psubscribe,打开第一个终端,输完命令后会处于等待状态

代码语言:javascript复制
127.0.0.1:6379> psubscribe news.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.*"
3) (integer) 1

打开第二个终端,开始发布消息

代码语言:javascript复制
127.0.0.1:6379> publish news.it "i am news.it"
(integer) 1
127.0.0.1:6379> 

打开第三个终端,开始发布消息

代码语言:javascript复制
127.0.0.1:6379> publish news.et "i am news.et"
(integer) 1
127.0.0.1:6379> 

此时第一个终端接收到消息

代码语言:javascript复制
127.0.0.1:6379> psubscribe news.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.*"
3) (integer) 1
1) "pmessage"			#接收第二个终端的消息
2) "news.*"
3) "news.it"
4) "i am news.it"
1) "pmessage"			##接收第三个终端的消息
2) "news.*"
3) "news.et"
4) "i am news.et"

可见进行了模式匹配

模式退订的命令为punsubscribe

代码语言:javascript复制
127.0.0.1:6379> punsubscribe news.*
1) "punsubscribe"
2) "news.*"
3) (integer) 0
127.0.0.1:6379>

redis的所有的模式订阅关系都保存在pubsub_patterns链表里

1.3 查看消息

pubsub有三个子命令,如下

pubsub channels [pattern]

返回服务器当前被订阅的频道

pubsub numsub

返回某个频道的订阅者数量

pubsub numpat

返回服务器当前被订阅模式的数量

代码语言:javascript复制
127.0.0.1:6379> pubsub channels
1) "news.et"
2) "news"
3) "news.ot"
4) "news.it"
127.0.0.1:6379> pubsub numsub news
1) "news"
2) (integer) 3
127.0.0.1:6379> pubsub numpat
(integer) 2
127.0.0.1:6379>

2.事务

实现事务(transaction)的命令包括multiexecwatch,事务开启后必须要所有命令都执行完毕才会去执行其他客户端的命令请求

代码语言:javascript复制
a@aMacBook-Pro-92 ~ % redis-cli --raw	#这里加--raw可以展示中文,不会出现乱码
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set key1 "你好"
QUEUED
127.0.0.1:6379(TX)> set key2 "世界"
QUEUED
127.0.0.1:6379(TX)> get key1
QUEUED
127.0.0.1:6379(TX)> get key2
QUEUED
127.0.0.1:6379(TX)> exec
OK
OK
你好
世界
127.0.0.1:6379>

watch命令是一个乐观锁,用于监视数据库键,在multi开启后如果有其他客户端修改了里面的键,则事务执行失败

代码语言:javascript复制
127.0.0.1:6379> watch key1
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set key1 "哈哈"
QUEUED
127.0.0.1:6379(TX)> get key1
QUEUED
127.0.0.1:6379(TX)> exec
(nil)
127.0.0.1:6379> get key1
nihao

可见上述exec执行完毕后输出nil,即事务执行失败,原因是我在multi开启后且在exec执行前,在另一个终端修改了里面的键,所以key1的值不是哈哈,而是变成了nihao

代码语言:javascript复制
127.0.0.1:6379> set key1 "nihao"
OK

事务四大特性:原子性、一致性、隔离性、持久性

3.慢查询日志

redis的慢查询日志用于记录执行时间超过给定时长的命令请求,可以通过该功能监视和优化查询速度,有两个和慢查询相关的选项:slowlog-log-slower-than表示执行时间超过多少微秒的命令请求会被记录到日志上,slowlog-max-len指定服务器最多保存多少条慢查询日志

代码语言:javascript复制
127.0.0.1:6379> config set slowlog-log-slower-than 0 #这里设置为0表示所有操作都会被记录
OK
127.0.0.1:6379> config set slowlog-max-len 10
OK
127.0.0.1:6379> set k1 "哈哈"
OK
127.0.0.1:6379> set k2 "嗯嗯"
OK
127.0.0.1:6379> slowlog get
3						#日志的唯一标识符(uid)
1640683940  #执行命令的unix时间戳
9						#命令执行时长,以微秒计算
set					#命令及参数
k2
嗯嗯
127.0.0.1:52594

2
1640683916
6938
set
k1
哈哈
127.0.0.1:52594

1
1640683898
6
config
set
slowlog-max-len
10
127.0.0.1:52594

0
1640683884
5316
config
set
slowlog-log-slower-than
0
127.0.0.1:52594

127.0.0.1:6379> slowlog len	#日志条数
5
127.0.0.1:6379> slowlog reset	#清除所有日志
OK

4.监视器

monitor命令可以把一个客户端变成一个监视器,实时打印出当前的操作

0 人点赞