Skip to content

Commit 156e90d

Browse files
committed
Feat: 新增面试笔记
-新增面试笔记
1 parent 3ff42d0 commit 156e90d

File tree

1 file changed

+35
-16
lines changed

1 file changed

+35
-16
lines changed

DB.Tec/Redis/Redis设计与实现.md

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -271,22 +271,41 @@ clients链表来完成.
271271
7. Sentinel只会与主服务器和从服务器建立命令连接和订阅连接,Sentinel与Sentinel之间只创建命令连接.
272272

273273
#### 第十七章 集群
274-
1.
275-
276-
277-
278-
279-
280-
281-
282-
283-
284-
285-
286-
287-
288-
289-
274+
1. 节点通过握手来将其他节点添加到自己所处的集群当中.
275+
2. 连接各个节点的工作可以使用CLUSTER MEET命令来完成,该命令的格式如下: CLUSTER MEET <ip> <port>
276+
3. clusterNode结构保存了一个节点当前的状态,比如节点的创建时间,节点的名字,节点当前的配置纪元,节点的IP地址和端口等.
277+
4. 每个节点都会使用一个clusterNode结构来记录自己的状态,并为集群中的所有其他节点(包括主从节点)都创建一个相应的clusterNode结构,依此来记录其他节点的状态.
278+
5. 每个节点都保存着一个clusterState结构,这个结构记录了当前节点的视角下,集群目前所处的状态.
279+
6. Redis集群通过分片的方式来保存数据库中的键值对:集群的整个数据库被分为16384个槽,数据库中的每个键都属于16384个槽中的一个,集群中的每个节点可以处理0个或最多16384个槽.
280+
7. 通过向节点发送CLUSTER ADDSLOTS命令,我们可以将一个或多个槽指派给节点负责.
281+
8. clusterNode结构的slots属性和numslot属性记录了节点负责处理哪些槽.
282+
* slots属性是一个二进制位数组,这个数组共包含16384个二进制位.
283+
* numslots属性记录节点负责处理槽的数量,也即是slots数组中值为1的二进制位的数量.
284+
9. 节点会将自己的slots数组通过消息发送给集群中的其他节点,以此来告知其他节点自己目前负责处理哪些槽.
285+
10. clusterState结构中的slots数组记录了集群中所有16384个槽的指派信息.
286+
11. slots数组包含16384个项,每个数组项都是一个指向clusterNode结构的指针.
287+
12. Redis的重新分片操作可以将任意数量的已经指派给某个节点的槽改为指派给另一个节点,并且将相关槽所属的键值对也会从源节点被移动到目标节点.
288+
13. 重新分片操作可以在线进行,在重新分片的过程中,集群不需要下线,并且源节点和目标节点都可以继续处理命令请求.
289+
14. Redis集群的重新分片操作是由Redis的集群管理软件redis-trib负责执行的,Redis提供了进行重新分片所需的所有命令,而redis-trib则通过向源节点和目标节点发送命令来进行
290+
重新分片操作.
291+
15. 如果节点A正在迁移槽i至节点B,那么当节点A没能在自己的数据库中找到命令指定的数据库键时,节点A会向客户端返回一个ASK错误,指引客户端到节点B继续查找指定的数据库键.
292+
16. 集群里的从节点用于复制主节点,并在主节点下线时,代替主节点继续处理命令请求.
290293

294+
#### 第十八章 发布和订阅
295+
1. 服务器状态在pubsub_channels字典保存了所有频道的订阅关系: SUBSCRIBE命令负责将客户端和被订阅频道关联到这个字典里面.而UNSUBSCRIBE命令则负责解除客户端和被退订频道之间的关系.
296+
2. 服务器状态在pubsub_patterns链表保存了所有模式的订阅关系:PSUBSCRIBE命令负责将客户端和被订阅的模式记录到这个链表中,而PUNSUBSCRIBE命令则负责移除客户端和被退订模式在链表中的记录.
297+
3. PUBLISH命令通过访问pubsub_channels字典来向频道的所有订阅者发送消息,通过访问pubsub_Pattern链表来向所有匹配频道的模式的订阅者发送消息.
291298

299+
#### 第十九章 事务
300+
1. 事务提供了一种将多个命令打包,然后一次性,有序的执行的机制.
301+
2. 多个命令会被入队到事务队列中,然后按先进先出的顺序执行.
302+
3. 事务在执行的过程中不会被中断,当事务队列中的所有命令都被执行完毕后,事务才会结束.
303+
4. 带有WATCH命令的事务会将客户端和被监视的键在数据库的watch_keys字典中进行关联,当键被修改时,程序会将所有监视被修改键的客户端REDIS_DIRTY_CAS打开.
304+
5. 只有在客户端的REDIS_DIRTY_CAS标志未被打开时,服务器才会执行客户端提交的事务,否则的话,服务器将会拒绝执行客户端提交的事务.
305+
6. Redis事务总是具有ACID中的原子性,一致性和隔离性,当服务运行在AOF持久化模式下,并且appendfsync选项的值为always时,事务也具有耐久性.
292306

307+
#### 第二十章 慢查询
308+
1. Redis服务器将所有的慢查询日志保存在服务器状态的slowlog链表中,每个链表节点都包含一个slowlogEntry结构,每个slowlogEntry结构代表一条慢查询日志.
309+
2. 打印和删除慢查询日志可以通过遍历slowlog链表来完成.
310+
3. slowlog链表的长度就是服务器所保存慢查询日志的数量.
311+
4. 新的慢查询日志会被添加到slowlog链表的表头,如果日志的数量超过slowlog-max-len选项的值,那么多出来的日志就会被删除.

0 commit comments

Comments
 (0)