• Redis-单数据库的实现


    1.reids默认有16个数据库,在

     2.数据库的键空间就是保存在dict字典里(所有的数据)

    其他键空间的操作:exists,rename,keys


    lru:计算键的闲置时间

    设置过期时间:秒、毫秒、时间戳,最后都会转化为时间戳

    2.expires字典保存了所有键的过期时间——过期字典

     实际中,键空间和过期字典都是指向同一个键对象。

    presist命令去除过期字典中的健值

    3.过期策略:

      定时:cpu不友好

        惰性:内存不友好

      定期:整合和折中的方法

    要合理的设置定期删除的时长和执行频率

    惰性删除实现:

      所有读写命令执行之前都会调用db.c/expireIfNeeded,如果过期删除,不过期,该函数不做动作

    定期删除实现:

      在规定的时间内,分多次遍历服务器中的各个数据库,从过期字典中随机检查一部分的过期时间,并删除其中的过期键

      默认:数据库16个、每个数据库过期键20个,如果达到时间上线,停止处理

     aof持久化

    aof重写:aof文件越来越大,不需要对现有aof文件修改,通过读取服务器当前的数据库状态来实现的,例如,忽略一个键的中间处理过程,记录键的当前状态

    重写放到子进程中进行。

    为保证数据一致性,子进程进行时,主进程的命令放到aof缓冲区,子进程处理完之后,发送父进程信号,缓冲区写入aof文件,并且覆盖老文件

    事件

    文件事件:多路复用监听多个套接字,根据套接字关联不同的事件处理器

    客户端发出连接请求,服务器端监听产生AE_READABLE事件,

    客户端发出命令请求,服务器端监听产生AE_WRITABLE事件,

    时间事件:定时事件和周期事件

      id:全局唯一id

      when :事件到达时间,unix时间戳

      timeProc:时间事件处理器,根据返回值不同区分定时或周期

      时间事件保存在单链表中,头插法,不是按照时间顺序排的,所以 必须遍历整个链表

      serverCron默认每隔100毫秒运行一次。

    时间事件再文件事件之后执行,所以时间事件通常稍晚一些

     客户端

    建立相应的redis.h/reidsClient结构,保存客户端当前状态信息

    记录clients属性是一个链表。

     伪客户端:fd=-1,请求来源于aof文件或者lua脚本,不需要套接字连接

    普通客户端:fd>-1,与服务器正常通信

    名字:client setname设置客户端名字,保存在redisClients-*name属性里

    输入缓冲区,记录客户端发送的命令请求,如果超过1G,就会关闭这个客户端

    命令与命令参数:服务器将得出的命令参数和个数保存到客户端状态的argv属性和argc属性

     命令试下函数:根据argv[0]找到

      

  • 相关阅读:
    ECharts中悬浮图标tooltie多行显示已解决
    Linux中的$符号的三种常见用法
    Shell逐行读取文件的4种方法
    rename
    nodejs安装
    “ArcGIS Desktop遇到严重的应用程序错误,无法继续”的解决方案
    跟我一起学Redis之Redis持久化必知必会
    微服务很香--麻辣味,但要慢慢消化
    跟我一起学Redis之Redis事务简单了解一下
    跟我一起学.NetCore之EF Core 实战入门,一看就会
  • 原文地址:https://www.cnblogs.com/PengChengLi/p/13370915.html
Copyright © 2020-2023  润新知