iis服务器助手广告广告
返回顶部
首页 > 资讯 > 服务器 >Redis | 第7章 Redis 服务器《Redis设计与实现》
  • 254
分享到

Redis | 第7章 Redis 服务器《Redis设计与实现》

Redis|第7章Redis服务器《Redis设计与实现》 2022-04-27 11:04:49 254人浏览 无得
摘要

目录前言1. 命令请求的执行过程1.1 发送命令请求1.2 读取命令请求1.3 命令执行器(1):查找命令实现1.4 命令执行器(2):执行预备操作1.5 命令执行器(3):调用命令的实现函数1.6 命令执行器(4):执行后续工作1.7

Redis | 第7章 Redis 服务器《Redis设计与实现》

目录
  • 前言
  • 1. 命令请求的执行过程
    • 1.1 发送命令请求
    • 1.2 读取命令请求
    • 1.3 命令执行器(1):查找命令实现
    • 1.4 命令执行器(2):执行预备操作
    • 1.5 命令执行器(3):调用命令的实现函数
    • 1.6 命令执行器(4):执行后续工作
    • 1.7 将命令回复发送给客户端
    • 1.8 客户端接收并打印命令回复
  • 2. serverCron 函数
  • 3. 初始化服务器
    • 3.1 初始化服务器状态结构
    • 3.2 载入配置选项
    • 3.3 初始化服务器数据结构
    • 3.4 还原数据库状态
    • 3.5 执行事件循环
  • 最后

前言

参考资料:《Redis设计与实现 第二版》;

第二部分为单机数据库的实现,主要由以下模块组成:数据库持久化事件客户端服务器

本篇将介绍 Redis 的服务器端,从服务器接收客户端的命令请求serverCron 函数以及初始化服务器三个角度介绍;


1. 命令请求的执行过程

1.1 发送命令请求

  • 用户在客户端键入一个命令请求 { SET KEY VALUE };
  • 客户端将命令请求转换成协议格式 { *3 $3 SET $3 KEY $5 VALUE };
  • 通过连接到服务器的套接字,将协议格式的命令请求发送给服务器;

发送命令请求过程

1.2 读取命令请求

  • 读取套接字中协议格式的命令请求,并将其保存到客户端状态的输入缓冲区里面;
  • 分析协议格式的命令请求,提取参数命令以及参数个数,存进客户端状态的 argvarGC 属性;
  • 调用命令执行器,执行客户端指定命令;
    读取命令请求
    解析出的协议格式内容

1.3 命令执行器(1):查找命令实现

  • 根据客户端的 argv[0] 参数,在命令表中查找参数所指定的命令,并将找到的命令 redisCommand 保存到客户端状态的 cmd 属性里;

命令表示例

设置客户端状态的 cmd 指针

  • redisCommand 的主要参数:name(名字),proc(函数指针),arity(命令参数个数),sflags(命令属性标识),flags(sflags的二进制标识),calls(服务器总共执行了多少次这个命令),milliseconds(执行该命令的总耗时);

sflags属性的标识

1.4 命令执行器(2):执行预备操作

  • 检查客户端状态的 cmd 指针是否指向 NULL,是则返回错误;

  • 根据 cmd 指向的 redisCommand 结构的 arity 属性检查参数个数是否正确,不正确则返回错误;

  • 检查客户端是否通过身份验证,未通过的只能执行 AUTH 命令;

  • 若服务器打开了 maxmemory 功能,则在执行命令之前先检查服务器内存占用情况,在需要时回收内存。内存回收失败返回错误;

  • 等等……

1.5 命令执行器(3):调用命令的实现函数

  • 执行以下语句:client->cmd->proc(client)
  • 被调用的命令实现函数执行指定操作,返回相应命令回复;
    执行前客户端状态

执行后客户端状态

1.6 命令执行器(4):执行后续工作

  • 如果服务器开启了慢查询功能,慢查询日志模块会检查是否需要为刚刚执行完的命令请求添加一条新的慢查询日志;
  • 根据执行命令耗费时长更新 redisCommand 结构的 milliseconds 属性,同时将 calls 属性加一;
  • 如果服务器开启了 AOF 持久化功能,会将命令写入 AOF 缓冲期里;
  • 如果有从服务器正则复制当前服务器,服务器会将命令传播给所有从服务器;

1.7 将命令回复发送给客户端

  • 当客户端套接字变为可写状态时,服务器会执行命令回复处理器,将保存在客户端输出缓冲区中的命令回复发送给客户端 {+OK };

  • 当命令发送完毕后,回复处理器会清空客户端状态的输出缓冲区,为处理下一个命令请求最准备;

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

  • 客户端接收协议格式的命令回复后,会将回复转成易读格式;

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


2. serverCron 函数

  • serverCron 函数默认每隔 100ms 执行一次,负责管理服务器资源与保持服务器自身良好运转;

  • 下面是 serverCron 函数所做操作的介绍:

    • 更新服务器时间缓存:更新服务器状态的 unixtime(秒级) 属性和 mstime(毫秒级) 属性。精度不高,用于:打印日志、更新 LRU 时钟、决定是否执行持久化任务、服务器上线时间等;

    • 更新 LRU 时钟:更新服务器状态的 lruclock(10秒更新一次) 和 lru 属性。前者用于计算键的空转时间,后者保存了对象最后一次被命令访问的时间。空转时间=lruclock-lru;

    • 更新服务器每秒执行命令次数:调用 trackOperationsPerSecond 函数。以抽样计算的方式,估算并记录服务器在最近 1s 处理的命令请求数量;

    • 更新服务器内存峰值函数:更新stat_peak_memory 属性。该属性记录了服务器的内存峰值大小;

    • 处理 SIGTERM 信号:在启动服务器时,Redis 会为服务器进程的 SIGTERM 信号关联处理器 sigtermHandler 函数,信号处理器负责在服务器接到 SIGTERM 信号时,打开服务器状态的 shutdown_asap 标识;

    • 管理客户端资源:调用 clientsCron 函数。如果客户端与服务器之间的连接已经超时,则释放客户端。如果客户端输入缓冲区大小超过一定长度,则释放客户端当前的输入缓冲区,并创建一个默认大小的输入缓冲区;

    • 管理数据库资源:调用 databasesCron 函数,删除过期键,对字典进行收缩操作;

    • 执行被延迟的 BGREWRITEAOF:检查在执行 BGSAVE 命令期间,是否有 BGREWRITEAOF 命令被延迟执行;

    • 检查持久化操作的运行状态:检查 rdb_child_pid(记录 BGSAVE 命令的子进程 ID) 属性与 aof_child_pid(记录执行 BGREWRITEAOF 命令的子进程 ID) 属性。值为 -1 说明服务器没有进行持久化操作;

持久化检查过程

  • 将 AOF 缓冲区中的内容写入 AOF 文件:如果服务开启 AOF 功能,并且 AOF 缓冲区里有待写入数据,则将 AOF 缓冲区中的内容写入 AOF 文件里;

  • 关闭异步客户端:关闭输出缓冲区大小超过限制的客户端;

  • 增加 cronloops 计数器的值:对服务器状态的 cronloops 属性增 1;

3. 初始化服务器

3.1 初始化服务器状态结构

  • 即创建使用默认值一个 struct redisServer 结构体;
  • 负责初始化一般属性;
  • 初始化的工作由 redis.c/initServerConfig 函数完成,该函数的主要工作有:
    • 设置服务器的运行 ID;
    • 设置服务器的默认运行频率;
    • 设置服务器的默认配置文件路径;
    • 设置服务器的运行架构
    • 设置服务器的默认端口号;
    • 设置服务器的默认 RDB 持久化条件和 AOF 持久化条件;
    • 初始化服务器的 LRU 时钟;
    • 创建命令表;

3.2 载入配置选项

  • 载入用户给定的配置参数和配置文件,并对 server 变量相关属性的值进行修改;
  • 指定端口号:redis-server --port 10086
  • 修改数据库数量与 RDB 文件压缩功能:redis-server redis.conf。并且 redis.conf 文件里包含以下内容:
    # 将数据库数量设置为32个
    database 32
    # 关闭 RDB 文件的压缩功能
    rdbcompression no
    

3.3 初始化服务器数据结构

  • 负责初始化数据结构

    • 调用 initServer 函数,初始化下列数据库:
    • 设置数据库:server.clients 链表(存客户端)、server.db 数组(存数据库)、server.pubsub_channels 字典(保存频道订阅信息)、server.lua(用于执行 Lua 脚本的 Lua 环境)、server.slowlog(用于保存慢查询日志)
  • 进行一些重要设置

    • 为服务器设置进程信号处理器;
    • 创建共享对象(如 OK、整数 0-9999);
    • 打开服务器的监听端口,为监听套接字关联连接应答事件处理器,等待服务器正式运行时接受客户端的连接;
    • serverCron 函数创建时间事件;
    • 当 AOF 持久化功能打开时,打开现有 AOF 文件或创建并打开一个新的 AOF 文件,为 AOF 写入做准备;
    • 初始化服务器的后台 I/O 模块,为将来 I/O 操作做准备;

3.4 还原数据库状态

  • 载入 RDB 文件或 AOF 文件(优先),并根据文件记录的内容还原服务器的数据库状态;
  • 成功还原的日志信息:
    [8040] 01 Dec 20:12:41.758 * DB loaded from disk: 0.001 seconds

3.5 执行事件循环

  • 在打印下列日志后执行事件循环(loop函数);
    [8040] 01 Dec 20:12:41.758 * The server is now ready to accept connections on port 6379


最后

新人制作,如有错误,欢迎指出,感激不尽!
欢迎关注公众号,会分享一些更日常的东西!
如需转载,请标注出处!

--结束END--

本文标题: Redis | 第7章 Redis 服务器《Redis设计与实现》

本文链接: http://www.lsjlt.com/news/8963.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么设计与实现Redis
    本篇内容主要讲解“怎么设计与实现Redis”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么设计与实现Redis”吧!Redis的设计与实现其实 Redis 主要是通过三个方面来满足这样高效吞吐...
    99+
    2023-06-16
  • 探索Redis设计与实现15:Redis分布式锁进化史
    本文转自互联网 本系列文章将整理到...
    99+
    2024-04-02
  • 探索Redis设计与实现1:Redis 的基础数据结构概览
    本文转自互联网 本系列文章将整理到...
    99+
    2024-04-02
  • Redis实现高并发计数器
    业务需求中经常有需要用到计数器的场景:譬如一个手机号一天限制发送5条短信、一个接口一分钟限制多少请求、一个接口一天限制调用多少次等等。使用Redis的Incr自增命令可以轻松实现以上需求。以一个接口一天限制...
    99+
    2024-04-02
  • go-redis v8 XAutoClaim 与 Redis 服务器 v7+ 不兼容
    php小编子墨在这里向大家介绍一个重要的问题,即go-redis v8的XAutoClaim功能与Redis服务器v7+不兼容的情况。据了解,go-redis是一个流行的Golang ...
    99+
    2024-02-09
  • redis如何实现收藏功能设计
    Redis可以通过使用有序集合来实现收藏功能的设计。具体步骤如下:1. 创建两个有序集合,一个用于存储用户收藏的内容,另一个用于存储...
    99+
    2023-08-31
    redis
  • 微服务 Spring Boot 整合 Redis BitMap 实现 签到与统计
    文章目录 ⛄引言一、Redis BitMap 基本用法⛅BitMap 基本语法、指令⚡使用 BitMap 完成功能实现 二、SpringBoot 整合 Redis 实现签到 功能☁️需求介绍⚡核心源码 三、SpringBoo...
    99+
    2023-08-17
    redis 微服务 spring boot java 云原生
  • Redis如何实现可重入锁的设计
    这篇文章主要介绍Redis如何实现可重入锁的设计,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!但是仍然有些场景是不满⾜的,例如⼀ 个⽅法获取到锁之后,可能在⽅法内调这个⽅法此时就获取...
    99+
    2024-04-02
  • 如何在CentOS 7上安装Redis服务器
    如何在CentOS 7上安装Redis服务器,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Redis是使用使用 ANSI C 编写的开源的多平台数据存储软件,R...
    99+
    2023-06-28
  • Redis分布式限流组件设计与使用实例
    目录1.背景2.Redis计数器限流设计2.1Lua脚本2.2自定义注解2.3限流组件2.4限流切面实现3.测试一下3.1方法限流示例3.2动态入参限流示例4.其它扩展5.源码地址本...
    99+
    2024-04-02
  • 如何利用redis实现倒计时任务
    这篇文章主要介绍“如何利用redis实现倒计时任务”,在日常操作中,相信很多人在如何利用redis实现倒计时任务问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何利用redi...
    99+
    2024-04-02
  • redis计数器实现的方法是什么
    Redis计数器可以通过以下几种方法实现: 使用INCR命令:Redis提供了INCR命令来对一个键的值进行递增操作,可以用来实现...
    99+
    2024-03-11
    redis
  • Java手写Redis服务端的实现
    目录零,起因一,redis通讯与Netty1,tcp2,协议3,编解码4,命令处理二,redis的数据结构1,底层主结构2,key3,list4,set5,hash6,zset三,r...
    99+
    2024-04-02
  • Redis BloomFilter布隆过滤器原理与实现
    目录Bloom Filter 概念Bloom Filter 原理缓存穿透Bloom Filter的缺点常见问题go语言实现Bloom Filter 概念 布隆过滤器(英语:Bloom...
    99+
    2024-04-02
  • 怎么在Redis中实现分布式计数器
    在Redis中实现分布式计数器可以使用Redis的原子操作来保证计数器的并发安全性。具体实现可以使用Redis的INCR命令来实现递...
    99+
    2024-03-11
    Redis
  • Redis中怎么实现一个计数器功能
    这期内容当中小编将会给大家带来有关Redis中怎么实现一个计数器功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。使用字符串键下面代码演示了如何利用 Redis 中的字符...
    99+
    2024-04-02
  • 如何使用Redis实现分布式计数器
    Redis是一种高性能的缓存数据库,被广泛应用于Web应用程序中。其中,一种常用的场景是使用Redis实现分布式计数器。在本文中,我们将介绍如何使用Redis实现分布式计数器,并提供具体的代码示例。一、什么是分布式计数器?分布式计数器是一种...
    99+
    2023-11-07
    分布式 redis 计数器
  • 探索Redis设计与实现8:连接底层与表面的数据结构robj
    本文转自互联网 本系列文章将整理到...
    99+
    2024-04-02
  • 【2023】Redis服务器与客户端操作
    目录 1.Redis服务器管理客户端命令1.1.获取和设置客户端名字1.2.查看客户端信息1.3.暂停客户端1.4.中断客户端连接1.5.关闭服务器及客户端 2.查看服务器信息2.1.查看...
    99+
    2023-09-07
    redis 服务器 数据库 原力计划
  • Redis中怎么实现一个自增ID计数器
    这期内容当中小编将会给大家带来有关Redis中怎么实现一个自增ID计数器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在关系型数据库MySQL中我们可以通过设置字段属性为...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作