redis 系列20 服务器下
二. serverCron函数
2.3 更新服务器每秒执行命令次数
serverCron函数中的trackOperationsPerSecond函数会以每100毫秒一次的频率执行,这个函数以抽样计算的方式,估算并记录服务器在最近一秒钟处理的命令请求数量,这个值可以通过info status命令的instantaneous_ops_sec域查看:
127.0.0.1:> info stats
# Stats
total_connections_received:
total_commands_processed:
//服务器在最近一秒钟处理的命令请求数量
instantaneous_ops_per_sec:
关于trackOperationsPerSecond函数的内部实现就不再介绍,大致是当客户端执行INFO命令时,服务器就会调用getOperationsPerSecond函数,根据ops_sec_samples环形数组中的抽样结果,计算出instantaneous_ops_per_sec属性的值。
2.4 更新服务器内存
服务器状态redisServer结构的stat_peak_memory属性记录了服务器的内存峰值大小,每次serverCron函数执行时,程序都会查看服务器当前使用的内存数量,并与stat_peak_memory保存的数值进行比较,如果当前的内存数量比stat_peak_memory属性记录的值要大,那么程序就将当前使用的内存数量记录到stat_peak_memory属性记录中。INFO memory命令的used_memory_peak和used_memory_peak_human两个域分别以两种格式记录了服务器的内存峰值。
127.0.0.1:> info memory
# Memory
used_memory_peak:
used_memory_peak_human:.82K
这两个是域是指过去Redis内存使用的峰值,是反映了内存过去最高峰值,而不是当前使用内存的值。
2.5 处理sigterm信号
在启动服务器时,redis会为服务器进程的singterm信号关联处理器singtermHandler函数,这个信息处理器负责在服务器接收到singterm信号时,打开服务器状态的shutdown_asap标识。 每次serverCron函数运行时,程序都会对服务器状态redisServer结构函数的shutdown_asap属性进行检查,并根据属性的值决定是否关闭服务器。
static void sigtermHandler(int sig){
//打印日志
redisLogFromHandler(reids_warning,"received sigterm, scheduling shutdown...");
//打开关闭标识
server.shutdown_asap=;
}
//下面先打开日志功能,在redis.conf文件中设置日志文件路径,保存配置文件,重启服务。
logfile /usr/local/redis/redis.log
[root@xuegod64 redis]# redis-server redis.conf //当在客户端执行shutdown关闭服务器时,服务器在接到sigterm信号之后,关闭服务器并打印相关日志。
127.0.0.1:> shutdown
not connected>
日志显示可以看到,服务器在关闭自身之前会进行RDB持久化操作,这也是服务器拦截sigterm信号的原因,日志信息如下:
:M Dec ::42.562 # User requested shutdown...
:M Dec ::42.562 * Saving the final RDB snapshot before exiting.
:M Dec ::42.565 * DB saved on disk
:M Dec ::42.565 * Removing the pid file.
:M Dec ::42.565 # Redis is now ready to exit, bye bye...
2.6 管理客户端资源
serverCron函数每次执行都会调用clinetsCron函数,该函数会对一定数量的客户端进行检查,包括1.如果客户端与服务器的连接已经超时(如很长时间没有互动),那么程序会释放这个客户端。2.如果客户端在上一次执行命令请求之后,输入缓冲区的大小超过了一定的长度,那么程序会释放客户端当前的输入缓冲区。
2.7 执行被延迟的bgrewriteaof
说到bgsave和bgrewriteaof二个客户端命令,前者针对RDB持久化,后者针对AOF 持久化。在服务器执行bgsave命令的期间,如果客户端向服务器发送了bgrewriteaof命令,那么服务器会将bgrewriteaof命令的执行时间延迟到bgsave命令执行完毕之后。每次serverCron函数执行时,都会检查bgsave命令或者bgrewriteaof命令是否正在执行,如果这两个命令都没在执行,并且aof_rewrite_scheduled属性的值为1,那么服务器就会执行之前被推延的bgrewriteaof命令。
struct redisServer {
//如果值为1, 那么表示有bgrewriteaof命令被延迟了
int aof_rewrite_scheduled;
}
2.8 检查持久化操作的运作状态
服务器状态使用redisServer结构的rdb_child_pid属性和aof_child_pid属性记录执行bgsave命令和bgrewriteaof命令的子进程的ID,这两个属性也可以用于检查bgsave命令或者bgrewriteaof命令是否正在执行。
struct redisServer {
//记录执行bgsave命令的子进程的ID
//如果服务器没有在执行bgsave,那么这个属性的值为-1.
pid_t rdb_chlid_pid;
//记录执行bgrewriteaof命令的子进程的ID
//如果服务器没有在执行bgrewriteaof,那么这个属性的值为-1.
pid_t aof_chlid_pid;
}
每次serverCron函数执行时,程序都会检查rdb_chlid_pid和aof_child_pid两个属性值,只要其中一个属性的值不为-1, 代表正在执行,程序就会执行一次wait3函数,检查子进程是否有信号发给服务器主进程。如果有信号到达:那么对于bgsave命令来说,新的rdb文件已经生成; 对于bbgrewriteaof命令来说,AOF文件已经重写完成; 服务器需要进行相应命令的后续操作,比如用新的RDB文件替换现有RDB文件,或者用重写后的AOF文件替换现有的AOF文件。如果没有信号到达,那么表示持久化操作未完成,程序不做动作。
三.初始化服务器
一个Redis服务器启动后,需要经过一系列的初始化和设置过程。比如(3.1)初始化服务器状态;(3.2)接受用户指定的服务器配置;(3.3)创建相应的数据结构和网络连接等。
3.1 初始化服务器状态结构
初始化服务器第一步就是创建一个struct redisServer类型的实例变量server作为服务器状态,并为结构中的各个属性设置默认值。初始化server变量的工作由redis.c/initServerConfig函数完成。主要包括:设置服务器运行ID(info 命令信息中的run_id);设置服务器的默认运行频率(hz,在18 事件篇中有讲);设置服务器的默认文件路径(info 命令信息中的config_file) ;设置服务器运行架构(info 命令信息中的arch_bits) ;设置服务器的默认端口号(info 命令信息中的tcp_port) ;设置服务器的默认RDB持久化条件和AOF持久化条件;初始化服务器的LRU时钟;创建命令表。 该initServerConfig函数没有创建服务器状态的其他数据结构;数据库;慢查询日志;LUA环境;共享对象,这些数据结构在之后的步骤才会被创建出来
127.0.0.1:> info
# Server
redis_version:4.0.
redis_git_sha1:
redis_git_dirty:
redis_build_id:836bbbcc913c7a57
redis_mode:standalone
os:Linux 3.10.-.el7.x86_64 x86_64
arch_bits:
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:4.8.
process_id:
run_id:b0694f86c7e794bf851f6193f1f96d85f993f325
tcp_port:
uptime_in_seconds:
uptime_in_days:
hz:
lru_clock:
executable:/usr/local/redis/redis-server
config_file:/usr/local/redis/redis.conf
3.2 载入配置选项
在启动服务器时,用户可以通过给定配置参数或者指定配置文件来修改服务器的默认配置,当服务器在用initServerConfig函数初始化完server变量之后,就会开始载入用户给定的配置参数和配置文件,并根据用户设定的配置,对server变量相关属性的值进行修改。
例1:用户在终端中指定redis服务器端口号,默认端口从6379变为了10086,启动服务
[root@xuegod64 redis]# redis-server --port
:C Dec ::05.183 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
//下面通过另一个客户端,指定端口,连接到服务器,通过info来查看,是没有config_file的配置路径。
[root@xuegod64 ~]# redis-cli -h 127.0.0.1 -p
127.0.0.1:>info
# Server
redis_version:4.0.
....
例2: 用户通过加载redis.conf配置文件,这是最常见的启动服务。通过info来查看,这种是有config_file的配置路径的
[root@xuegod64 redis]# redis-server redis.conf
通过上面案例知道,如果用户为服务器状态属性指定了新的值,那么服务器就会更新相应的属性值,如果没有为属性设置新的值,那么服务器就用之前initServerConfig函数为属性设置的默认值。
3.3 初始化服务器数据结构
服务器在载入用户指定的配置选项,并对server状态进行更新之后,服务器就可以进入初始化第三个阶段,此时服务器创建的数据结构还包括:server.clients链表;server.db数组;保存频道订阅信息的server.pubsub_channels字典以及server.pubsub_patterns链表; 用于执行Lua脚本的server.lua; 用于保存慢日志的server.slowlog属性。
接着服务器将调用initServer函数,为以上的数据结构分配内存,该函数设置还包括:为服务器设置进程号处理器;创建共享对象;打开服务器监听端口;为serverCron函数创建时间事件;做好AOF持久化写入准备;初始化服务器后台I/O模块。当initServer函数执行完后,服务器将用ascll字符在日志中打印出redis的图标,以及redis的版本号信息。

3.4 还原数据库状态
在完成了对服务器状态server变量的初始化之后,服务器需要载入RDB文件或者AOF文件,并根据文件记录的内容来还原服务器的数据库状态。如果服务器启用了AOF持久化功能,那么服务器使用AOF文件来还原数据库状态;相反 如果服务器没有启用AOF持久化功能,那么服务器使用RDB文件来还原数据库状态。
:M Dec ::15.343 * DB loaded from disk: 0.000 seconds
redis 系列20 服务器下的更多相关文章
- redis 系列20 服务器上
一.客户端与服务端交互 本篇简单介绍下服务器,服务器运行涉及的内部原理知识很多,主要了解Redis服务器内部要做哪些事情,需要开发人员去干预的比较少.Redis服务器负责与多个客户端建立网络连接,处理 ...
- redis 系列1 linux下安装说明
一. 安装环境 操作系统:centos 7 ,redis版本4.06,客户端windows 7 ,vs2015. 1.1 安装前的条件 yum -y install gcc-c++ 判断是否安装了gc ...
- Redis 系列之CentOS下Redis的安装
前言 安装Redis需要知道自己需要哪个版本,有针对性的安装,比如如果需要redis GEO这个地理集合的特性,那么redis版本就不能低于3.2版本,由于这个特性是3.2版本才有的.另外需要注意的是 ...
- 【目录】redis 系列篇
随笔分类 - redis 系列篇 redis 系列27 Cluster高可用 (2) 摘要: 一. ASK错误 集群上篇最后讲到,对于重新分片由redis-trib负责执行,关于该工具以后再介绍.在进 ...
- redis 系列25 哨兵Sentinel (高可用演示 下)
一. Sentinel 高可用环境准备 1.1 Sentinel 集群环境 环境 说明 操作系统版本 CentOS 7.4.1708 IP地址 172.168.18.200 网关Gateway 1 ...
- redis系列一: windows下安装redis
一. 下载Redis Redis 支持 32 位和 64 位.这个需要根据你系统平台的实际情况选择,这里我们下载 Redis-x64-xxx.zip压缩包到 C 盘,解压后,将文件夹重新命名为 red ...
- redis系列之数据库与缓存数据一致性解决方案
redis系列之数据库与缓存数据一致性解决方案 数据库与缓存读写模式策略 写完数据库后是否需要马上更新缓存还是直接删除缓存? (1).如果写数据库的值与更新到缓存值是一样的,不需要经过任何的计算,可以 ...
- redis系列-14点的灵异事件
概述 项目组每天14点都会遭遇惊魂时刻.一条条告警短信把工程师从午后小憩中拉回现实.之后问题又神秘消失.是PM喊你上工了?还是服务器给你开玩笑?下面请看工程师如何一步一步揪出真凶,解决问题. 如果不想 ...
- 就publish/subscribe功能看redis集群模式下的队列技术(一)
Redis 简介 Redis 是完全开源免费的,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中 ...
随机推荐
- Activity 切换效果
Activity 切换效果 设置Activity 的 启动/退出时动画效果. 1.设置动画 通过方法 overridePendingTransition(enterAnim:Int,exitAnim: ...
- git 修改用户名和密码
初次运行 Git 前的配置 一般在新的系统上,我们都需要先配置下自己的 Git 工作环境.配置工作只需一次,以后升级时还会沿用现在的配置.当然,如果需要,你随时可以用相同的命令修改已有的配置. Git ...
- python多进程学习笔记
# coding=utf-8 from multiprocessing import Process,Pool import os import time def printf(args): # ti ...
- PBRT笔记(10)——体积散射
体散射处理过程 3个影响参与介质在环境中的辐射度分布的主要因素: 吸收:减少光能,并将其转化为别的能量,例如热量. 发光:由光子发射光能至环境中. 散射:由于粒子碰撞,使得一个方向的辐射度散射至其他方 ...
- PostgreSQL>窗口函数的用法
PostgreSQL之窗口函数的用法 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9311281.html PostgreSQL的高级特性本准备三篇的(递归. ...
- 彻底卸载Windows Service
前言,我使用Quartz.net + quartz.config + quartz_jobs.xml 写了个Windows Service,使用如下bat脚本执行服务的安装,启动,暂停,卸载 @ech ...
- 理解JavaScript【转】
第一题 if (!("a" in window)) { var a = 1; } alert(a); 第二题 var a = 1, b = function a(x ...
- webpack学习--安装
webpack需要在node环境运行,可以去node官网进行下载安装包:http://nodejs.cn/download/ 1.打开cmd命令窗口,运行node -v 2.全局安装webpack:n ...
- 2.10linux学习(2)
2019-2-10 19:34:27 跟着超哥学Linux 发现蛮好玩的!适合开发,Windows适合娱乐! 可以跟着超哥学Linux 参考:https://www.cnblogs.com/pyyu/ ...
- python 面试题知识回顾
1. python 函数 的参数传递 a = 1 def fun(a): a = 2 fun(a) print a # 1 a = [] def fun(a): a.append(1) fun(a) ...