• Redis学习笔记之单机实现


    1.数据库

      Redis的所有数据库都保存在redisServer.db数组中,数据库主要是由两个字典组成:dict字典,负责保存键值对;expires,负责保存键的过期时间

      Redis使用惰性删除和定期删除两种方式处理过期键:惰性删除是指在碰到了过期键才将其删除,定期删除是指每隔一段时间主动查找并删除过期键(Redis采用随机查找)

      针对过期键的处理:RDB(快照)中不包含过期键,AOF文件也不会包含过期键;主服务器发现过期键后会删除过期键,并向从服务器发送一个DEL命令;从服务器发现过期键后置之不理,当没过期处理。

    2.RDB文件

      结构:REDIS,字符串常量(二进制数据)

               db_version,RDB文件的版本号

               databases,零个或者多个数据库以及数据库中的键值对数据

                     SELECTDB,常量,提示接下来要读入的将是一个数据库号码

                     db_number,数据库号码

                     key_value_pairs,保存了一个或以上数量的键值对,(EXPIRETIME_MS、ms、)

          TYPE、key、value

               EOF,结束标志

               check_sum,校验和,检查RDB文件是否有出错或者损坏

      value编码

    对象

    TYPE

    编码

    补充说明

    字符串

    REDIS_RDB_TYPE_STRING

    *_INT

    整数,有8、16、32位

    *_RAW

    纯字符串,有是否压缩之分

    列表

    REDIS_RDB_TYPE_LIST

    *_LINKEDLIST

    list_length

    Item

    ……

    集合

    REDIS_RDB_TYPE_SET

    *_HT

    set_size

    elem

    ……

    哈希表

    REDIS_RDB_TYPE_HASH

    *_HT

    hash_size

    (k,v)

    ……

    有序集合

    REDIS_RDB_TYPE_ZSET

    *_SKIPLIST

    sorted_set_size

    (member,score)

    ……

      备注:表格中的*为REDIS_ENCODING,此处为省略写法。

      服务器周期性操作函数serverCron默认每隔100毫秒就会执行一次,其中一项工作就是检查sava选项所设置的保存条件是否满足。

    3.AOF持久化

      本质:保存Redis服务器所执行的写命令来记录数据库状态

      文件写入和同步:当AOF持久化功能处于打开状态时,服务器每执行一次写命令之后,会以协议格式将被执行的命令追加到服务器状态的aof_buf缓冲区末尾,appendfsync值的不同(always、everysec、no)产生不同的持久化行为(包括写入AOF文件和磁盘同步)

      文件的载入和数据还原:服务器启动载入程序——创建伪客户端(fake client,Redis的命令只能在客户端上下文执行)——从AOF文件读取命令并执行——命令全部被执行完,载入完毕

      AOF重写

              目的:不改变数据库状态,去除冗余命令,减小AOF文件的体积

              原理:从数据库中读取值,然后用一条命令来记录键值对,代替之前记录这和键值对的多条命令,但是为了防止缓冲区溢出,重写程序在处理列表、哈希表、集合、有序集合这四种可能会带有多个元素的键时,会先检查键所包含的元素数量,如果超过了设置值,会使用多条命令来进行替换(一次写入会造成缓冲区溢出,分多条命令写入)

              AOF后台重写:有服务器进程创建子进程进行AOF重写,期间服务器仍然接收来自客户端的命令,可能造成数据不同步,解决方法是添加AOF重写缓冲区,在子进程重写AOF文件的过程中服务器接收的命令写入AOF重写缓冲区,当子进程重写完成后,再将AOF缓冲区的命令写入AOF文件中

    4.事件

      文件事件:Redis服务器通过套接字与客户端进行连接,服务器与客户端的通信会产生相应的文件事件,服务器通过监听并处理这些事件来完成一系列网络通信操作。由于一个服务器通常会连接多个套接字,所有文件事件可能并发出现,但是I/O多路复用程序会将套接字都放到一个队列里,然后以有序、每次一个套接字的方式向文件事件分派器传送套接字。

      时间事件:定时事件,让程序在指定的时间之后执行一次;周期性事件,让程序每隔指定时间就执行一次。

              实现:服务器会将所有的时间事件放入一个无序链表(时间无序)中,每次当时间事件执行器运行时,遍历无序链表,查找所有已到达的时间事件,并调用相应的事件处理器。

              实例:serverCron函数,一般情况下只执行这一个时间事件

    5.命令请求的执行过程

      1)    发送命令请求:客户端向服务器发送命令请求

      用户键入命令,客户端将其转换为协议的格式,通过套接字连接发送给服务器

      2)    读取命令请求

      读取套接字中协议格式的命令请求,将其保存到客户端状态的输入缓冲区中

      3)    命令执行过程

      查找命令表(字典),检查命令和客户端状态(是否找到命令、命令参数个数是否正确、是否通过了身份验证……),调用命令的实现函数,执行后续操作(慢查询日志、AOF、复制到从服务器)

      4)    将命令回复发送给客户端

      5)    客户端接收并打印命令回复

  • 相关阅读:
    【计算几何】多边形交集
    【计算几何】点在多边形内部
    【计算几何】线段相交
    【计算几何】多边形点集排序
    【JavaScript学习】JavaScript对象创建
    【CUDA学习】内核程序调试
    【CUDA学习】共享存储器
    【CUDA学习】全局存储器
    Charles是Mac的Fiddler抓包工具
    Charles是mac的iddler抓包工具
  • 原文地址:https://www.cnblogs.com/songxh-scse/p/6692456.html
Copyright © 2020-2023  润新知