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

2017-08-14  本文已影响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种网络模型

集群

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

节点

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

数据结构

发布和订阅

服务器状态在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
}

上一篇 下一篇

猜你喜欢

热点阅读