zoukankan      html  css  js  c++  java
  • 服务器

    发送命令请求:

    (1)当客户端向服务器发送命令的时候,客户端首先会将命令请求转化哪位协议格式,然后发送给服务器

    (2)server读取命令请求,进行解析,解析出argv和argc,并且将数据保存到输入缓冲区

    (3)查找命令实现,查找命令对应的函数。

    (4)执行预备操作

    比如执行cmd指针指向的是否是nULL,检查argc参数个数是否匹配,是否进行了客户端验证,是否打开了maxmemory并且检查

    (5)调用函数实现

    (6)执行后续操作,比如写入AOF,传给其他服务器之类的

    (7)将命令回复给客户端“”+OK “

    (8)客户端接收并打印

    服务器状态:

    我们在执行的过程中经常用到时间这个概念,

    redisserver{

    time_t unixtime

    long long mtime

    }

     因为使用时间都需要进行一次系统调用,非常消耗性能,所以我们在redisserver里面设置了这两个变量,每一次100毫秒执行servercron函数的时候都会更新这两个变量

    对于一些功能不高的我们会使用这两个变量的值,如果需要非常高的时候,比如我们需要设置过期时间的话,需要一定的精度

    idle的计算

    服务器状态中有一个lruclock属性,他和上面的类似,但是他是每隔10毫秒精度更好

    对于每一个redisobject我们都有一个lru表示最后操作时间,所以计算idle就是这两个值得差

    计录内存峰值,每一次都会和记录内存峰值的变量进行比较,如果增加的话,那么会更新

    处理SIGTERM信号,服务器讲这个信号和一个函数关联,这和函数里面会将一个变量设置为1,当执行servercron的时候会检查这个值,如果这个值为1的话,那么就会执行关闭。。。。之所以我们要对这个信号拦截,是因为我们需要在关闭之前执行RDB持久化,否则的话我们没等之星持久化操作就是关闭server了

    管理客户单资源:

    我们每次执行servercron的时候都会遍历所有client,都会查看所有的客户端是否断开。并且如果上一次的输入缓冲区的大小大于1GB,那么会释放并且重新创建一个空的缓冲区

    执行被延迟的BGREWRITEAOF:

     

     服务器启动

    (1)初始化服务器状态

    (2)载入配置

    (3)初始化服务器数据结构

    (4)还原数据库状态

  • 相关阅读:
    面试题来积累自己
    基于php基础语言编写的小程序之计算器
    配置apache的虚拟机+软件下载
    执行表空间使用率SQL突然变慢问题分析
    DM-建库选项-字符串比较大小写敏感-测试
    OGG再次遇到虚拟列无法处理,导致进程abend二
    OGG应用进程abend报错无法insert虚拟列
    Oracle Asm Failgroup测试学习
    OGG复制进程报错,存在update set 主键列 is null
    测试:OGG初始化同步表,源端抽取进程scn<源端事务的start_scn时,这个变化是否会同步到目标库中?
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/7078518.html
Copyright © 2011-2022 走看看