美文网首页
《Redis设计与实现》读书笔记

《Redis设计与实现》读书笔记

作者: 孙阔 | 来源:发表于2017-08-14 16:22 被阅读0次

这本书是一本不多的好书,把Redis设计和实现的细节讲得很清楚,虽然里面有一些细节算法如raft选举算法和variable swar

循环机制

redis服务器是事件驱动程序,服务器会处理两类事件

  1. 文件事件。套接字操作
  2. 时间时间。链表保存,非顺序链表,遍历查找
    • 定时时间
    • 定期时间

处理总逻辑

def main():
    #初始化服务器
    init_server()
    #一直处理事件,知道服务器关闭
    while server_is_not_shutdown():
        asProcessEvents()
    #服务器关闭
    clean_server()

事件的调度和执行
def aeProcessEvents():
#获取到达时间离当前时间事件
time_event = aeSearchNearestTimer()

    #计算最近的时间事件距离到达还有多少毫秒
    remaind_ms = time_event.when - unix_ts_now()
    
    #根据remaind_ms的值,创建timeval
    timeval = create_timeval_with_ms(remaind_ms)
    if timeval < 0:
        remaind_ms = 0
    
    #阻塞并期待文件事件产生,最大阻塞时间由传入的timeval结构决定
    #如果remaind_ms的值为0,那么aeApiPoll调用后立刻返回,不阻塞
    aeApiPoll(timeval)
    
    #处理所有已经产生的文件事件
    processFileEvent()
    #处理所有已经到达的时间时间
    processTimeEvent()

4种网络模型

  • 阻塞 I/O(blocking IO)
  • 非阻塞 I/O(nonblocking IO)
  • I/O 多路复用( IO multiplexing)
  • 异步 I/O(asynchronous IO)
    Redis采用的是I/O多路复用

集群

Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移方案

节点

#连接各个节点
cluster meet <ip> <port>
#显示当前集群节点
cluster nodes
//3537963976396397 :0 myself, master - 0 0 0 connected

数据结构

  • clusterNode每个节点都会为集群内所有的一个clusterNode结构
    • ctime 创建的时间
    • name 节点的名字
    • flags 表示主从,上线下线
    • configEpoch 配置纪元,用于故障转移
    • ip 节点ip
    • port
    • clusterLink link 保存链接节点所需的有关信息
    • unsigned char数组 slots长度为16384/8
  • clusterLink
    • ctime 连接的创建时间
    • fd 描述符int类型
    • sndbuf 输出缓冲区
    • rcvbuf 输入缓冲区
    • ClusterNode nodes 与这个链接相关的节点
  • clusterState每个节点保存一个
    • myself,指向一个clusterNode
    • currentEpoch
    • state 上线还是下线
    • size
    • nodes 集群节点名单
    • slots 16384数组
      16384个槽,及槽指派

    槽指派

    cluster addslots 0 1 2 3 4
    槽指派信息,保存在clusterState和clusterNode中,不同处理场景
    MOVED命令



    重新分片及ASK错误



    故障检测流程
  • 通过ping消息,设置节点疑似下线
  • 集群中各个节点会通过互相发送消息交换信息,如在线,PFAIL,FAIL
  • 当收到疑似下线(PFAIL>一般),发送FAIL
  • 其他节点立刻表示FAIL
    故障转移及选举算法
  • 发现FAIL
  • 通过Raft在从节点中选择一个
  • 被选中的执行slaveof no one命令
  • 新节点指派FAIL节点所有的槽给自己
  • 发送pong消息

发布和订阅

服务器状态在pubsub channels字典里保存所有频道的订阅关系



服务器会在pubsub patterns链表保存所有模式的的订阅关系



publish命令执行两个动作
  1. 将消息发送给channel频道的所有订阅者
  2. 遍历patterns链表,对匹配的订阅者发送

事务

事务入队



watch命令通过watched——keys字典实现,将key对应到客户端,如果一个key被修改了,在客户端的表示里加REDIS-DIRTY-CAS


二进制维数组

getbit
setbit
bitcount
bittop

汉明重量的计算(Variabel-precision)

统计一个位数组非0二进制位的数量
#以32位为例
uint32_t swar(uint32_t t) {
#将该二进制以两个一组进行分组,各组的十进制表示该组的汉明重量
i = (i & 0x55555555) + ((i >> 1) & 0x55555555)
#将得到的结果以四个一组进行分组,各组的十进制表示该组的汉明重量
i = (i & 0x33333333) + ((i >> 1) & 0x33333333)
#将得到的结果以八个一组进行分组,各组的十进制表示该组的汉明重量
i = (i & 0x0F0F0F0F) + ((i >> 1) & 0x0F0F0F0F)
#计算出汉明质量并保存在最高为八位,然后转移到最低8
}

相关文章

  • 《redis设计与实现》 读书笔记

    《redis设计与实现》 读书笔记 《redis设计与实现》 作者:黄健宏 一、前言 什么是redis:Redis...

  • redis数据结构

    引言 从本次开始,对Redis设计与实现进行阅读及相关读书笔记的记录。Redis版本为3.0 数据结构 简单动态字...

  • Redis 五大类型的对象

    《Redis 设计与实现》[http://redisbook.com/index.html]《Redis 设计与实...

  • Redis数据库实现

    《Redis 设计与实现》[http://redisbook.com/index.html]《Redis 设计与实...

  • RDB持久化

    《Redis 设计与实现》[http://redisbook.com/index.html]《Redis 设计与实...

  • AOF持久化

    《Redis 设计与实现》[http://redisbook.com/index.html]《Redis 设计与实...

  • Redis底层数据结构

    《Redis 设计与实现》[http://redisbook.com/index.html]《Redis 设计与实...

  • Redis事件

    《Redis 设计与实现》[http://redisbook.com/index.html]《Redis 设计与实...

  • Redis客户端

    《Redis 设计与实现》[http://redisbook.com/index.html]《Redis 设计与实...

  • Redis 服务器

    《Redis 设计与实现》[http://redisbook.com/index.html]《Redis 设计与实...

网友评论

      本文标题:《Redis设计与实现》读书笔记

      本文链接:https://www.haomeiwen.com/subject/triurxtx.html