当前位置: 首页 > news >正文

Redis中的serverCron函数(一)

serverCron函数

Redis服务器中的serverCron函数默认每隔100毫秒执行一次,这个函数负责管理服务器的资源,并保持服务器自身的良好运转。

更新服务器时间缓存

Redis服务器中有不少功能需要获取系统的当前时间,而每次获取系统的当前时间都需要执行一次系统调用,为了减少系统调用的执行次数,服务器状态中的unixtime属性和mstime属性被用作当前时间的缓存:

struct redisServer {// ...// 保存了秒级精度的系统当前UNIX时间戳time_t unixtime;// 保存了毫秒级精度的系统当前UNIX时间戳long long mstime;// ....
};

因为serverCron函数默认会以每100毫秒一次的频率更新unixtime属性和mstime属性,所以这两个属性记录的时间的精确度并不高:

  • 1.服务器只会在打印日志、更新服务器的LRU时钟、决定是否执行持久化任务、计算服务器上线时间(uptime)这类对事件精确度要求不高的功能上"使用unixtime属性和mstime属性"。
  • 2.对于为键设置过期事件、添加慢查询日志这种需要高精确度时间的功能来说,服务器还是会再执行系统调用,从而获得最准确的系统当前时间

更新LRU时钟。

服务器状态中的lruclock属性保存了服务器的LRU时钟,这个属性和unixtime属性、mstime属性一样,都是服务器时间缓存的一种:

struct redisServer {// ...// 默认每10秒更新一次的时钟缓存// 用于计算键的空转(idle)时长unsigned lruclock:22;// ...
};

每个Redis对象都会有一个lru属性,这个lru属性保存了对象最后一次被命令访问的时间:

typedef struct redisObject {// ...unsigned lru:22;//...
} robj;

当服务器要计算一个数据库键的空转时间(也即是数据库键对应的值对象的空转时间),程序会用服务器的lruclock属性记录的时间减去对象的lru属性记录的时间,得出的计算结果就是这个对象的空转时间:

127.0.0.1:6379> SET msg "hello world"
OK
# 等待一小段时间
127.0.0.1:6379> OBJECT IDLETIME msg
(integer) 13
# 等待一阵子
127.0.0.1:6379> OBJECT IDLETIME msg
(integer) 19
# 访问msg键的值
127.0.0.1:6379> GET msg
"hello world"
# 键处于活跃状态,空转时长为2
127.0.0.1:6379> OBJECT IDLETIME msg
(integer) 2

serverCron函数默认会以每10秒一次的频率更新lruclock属性的值,因为这个时钟不是实时的,所以根据这个属性计算出来的LRU时间实际上只是一个模糊的估算值。lruclock时钟的当前值可以通过INFO server命令的
lru_clock域查看:

```c
127.0.0.1:6379> info server
# Server
redis_version:3.0.504
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:a4f7a6e86f2d60b3
redis_mode:standalone
os:Windows
arch_bits:64
multiplexing_api:WinSock_IOCP
process_id:5512
run_id:87544bbfd0b6ddf6c7168be02719f23b94c97a96
tcp_port:6379
uptime_in_seconds:95307
uptime_in_days:1
hz:10
lru_clock:581331
config_file:E:\redis\redis.windows-service.conf

更新服务器每秒执行命令次数

serverCron函数中的trackOperationPerSecond函数会以每100毫秒一次的频率执行,这个函数的功能是以抽样计算的方式,估算并记录服务器在最近一秒钟处理的命令请求数量,这个值可以通过INFO stats命令 的
instantaneous_ops_per_sec域查看:

127.0.0.1:6379> info stats
# Stats
total_connections_received:3
total_commands_processed:16
instantaneous_ops_per_sec:0
total_net_input_bytes:542
total_net_output_bytes:2417
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:1
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:69502
migrate_cached_sockets:0

上面命令的结果显示中,在最近的一秒钟内,服务器没有处理命令。
trackOperationPerSecond函数和服务器状态中四个ops_sec开头的属性有关:

struct redisServer {// ...// 上一次进行抽样的时间long long ops_sec_last_sample_time;// 上一次抽样时,服务器已执行命令的数量long long ops_sec_last_sample_ops;// REDIS_OPS_SEC_SAMPLE 大小(默认值为16)的环形数组long long ops_sec_sample[REDIS_OPS_SEC_SAMPLES];// ops_sec_sample数组的索引值// 每次抽样后将值增一// 再值等于16时重置为0// 让ops_sec_samples数组构成一个唤醒数组int opts_sec_ids;// ...
}

trackOperationsPerSecond函数

每次运行,都回根据ops_sec_last_sample_time记录的上一次抽样时间和服务器的当前时间,以及ops_sec_last_sample_ops记录的上一次抽样的已执行命令数量和服务器当前的已执行命令数量,计算出两次trackOperationsPerSecond调用之间,服务器平均每一毫秒处理了多少个命令请求,然后将这个平均值
乘以1000,这就得到了服务器在一秒钟内处理多少个命令请求的估计值,这个估计值会被作为一个新的数组项被放进ops_sec_samples唤醒数组里面。当客户端执行INFO命令时,服务器就会调用getOperationsPerSecond函数,根据ops_sec_samples唤醒数组中的抽样结果,计算出instantaneous_ops_per_sec属性的值,

getOperationsPerSecond函数

以下是getOperationsPerSecond函数的实现代码:

long long getOperationsPerSecond(void) {int j;long long sum = 0;// 计算所有取样值综合for (j = 0; j < REDIS_OPS_SEC_SAMPLES; j++) {sum += server.ops_sec_samples[j];}// 计算取样的平均值return sum / REDIS_OPS_SEC_SAMPLES;
}

根据getOperationsPerSeoncd函数的定义可以看出,instantaneous_ops_per_sec
属性的值是通过计算最近REDIS_OPS_SEC_SAMPLES次取样的平均值来计算得出的,它只是一个估算值。

相关文章:

Redis中的serverCron函数(一)

serverCron函数 Redis服务器中的serverCron函数默认每隔100毫秒执行一次&#xff0c;这个函数负责管理服务器的资源&#xff0c;并保持服务器自身的良好运转。 更新服务器时间缓存 Redis服务器中有不少功能需要获取系统的当前时间&#xff0c;而每次获取系统的当前时间都需要…...

python保存中间变量(学习笔记)

python保存中间变量 原因&#xff1a; 最近在部署dust3r算法&#xff0c;虽然在本地部署了&#xff0c;也能测试出一定的结果&#xff0c;但是发现无法跑很多图片&#xff0c;为了能够测试多张图片跑出来的模型&#xff0c;于是就在打算在autodl上部署算法&#xff0c;但是由…...

CTF wed安全(攻防世界)练习题

一、Training-WWW-Robots 进入网站如图&#xff1a; 翻译&#xff1a;在这个小小的挑战训练中&#xff0c;你将学习Robots exclusion standard。网络爬虫使用robots.txt文件来检查它们是否被允许抓取和索引您的网站或只是其中的一部分。 有时这些文件会暴露目录结构&#xff0c…...

计算机网络链路层

数据链路 链路是从一个节点到相邻节点之间的物理线路&#xff08;有线或无线&#xff09; 数据链路是指把实现协议的软件和硬件加到对应链路上。帧是点对点信道的数据链路层的协议数据单元。 点对点信道 通信的主要步骤&#xff1a; 节点a的数据链路层将网络层交下来的包添…...

VUE3——reactive对比ref

从定义数据角度对比: 。ref用来定义:基本类型数据 。reactive用来定义:对象(或数组)类型数据。 。备注:ref也可以用来定义对象(或数组)类型数据,它内部会自动通过 reactive 转为代理对象。 从原理角度对比: 。ref通过 object.defineProperty()的 get 与set 来实现响应式(数据劫…...

广场舞团系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文&#xff08;设计&#xff09;学生选题参考合集推荐收藏&#xff08;包含Springboot、jsp、ssmvue等技术项目合集&#xff09; 目录 1. 系…...

经典永不过时 Wordpress模板主题

经得住时间考验的模板&#xff0c;才是经典模板&#xff0c;带得来客户的网站&#xff0c;才叫NB网站。 https://www.jianzhanpress.com/?p2484...

QT布局管理和空间提升为和空间间隔

QHBoxLayout&#xff1a;按照水平方向从左到右布局&#xff1b; QVBoxLayout&#xff1a;按照竖直方向从上到下布局&#xff1b; QGridLayout&#xff1a;在一个网格中进行布局&#xff0c;类似于HTML的table&#xff1b; 基本布局管理类包括&#xff1a;QBoxLayout、QGridL…...

Yolo 自制数据集dect训练改进

上一文请看 Yolo自制detect训练-CSDN博客 简介 如下图&#xff1a; 首先看一下每个图的含义 loss loss分为cls_loss, box_loss, obj_loss三部分。 cls_loss用于监督类别分类&#xff0c;计算锚框与对应的标定分类是否正确。 box_loss用于监督检测框的回归&#xff0c;预测框…...

vlan间单臂路由

【项目实践4】 --vlan间单臂路由 一、实验背景 实验的目的是在一个有限的网络环境中实现VLAN间的通信。网络环境包括两个交换机和一个路由器&#xff0c;交换机之间通过Trunk链路相连&#xff0c;路由器则连接到这两个交换机的Trunk端口上。 二、案例分析 在网络工程中&#…...

day4 linux上部署第一个nest项目(java转ts全栈/3R教室)

背景&#xff1a;上一篇吧nest-vben-admin项目&#xff0c;再开发环境上跑通了&#xff0c;并且build出来了dist文件&#xff0c;接下来再部署到linux试试吧 dist文件夹是干嘛的&#xff1f; 一个pnpn install 直接生成了两个dist文件夹&#xff0c;前端admin项目一个&#xf…...

学会这几点,是搭建产品知识库的关键

现如今&#xff0c;企业都特别看重产品知识库&#xff0c;因为有了它&#xff0c;企业就能更好地管理产品信息&#xff0c;提升客户服务水平&#xff0c;还能帮企业做决策。但是&#xff0c;搭建一个好用、高效的产品知识库&#xff0c;也难倒了不少人。下面&#xff0c;我们一…...

MySql 常用的聚合函数总结

MySQL 中的聚合函数用于对一组数据进行计算&#xff0c;并返回单个值作为结果。以下是常用的 MySQL 聚合函数的总结及其功能描述&#xff1a; 1. COUNT() 功能&#xff1a;用于计算指定列或表中的行数。 语法&#xff1a; COUNT(*) COUNT(expression) 示例&#xff1a; SELECT …...

Charles for Mac 强大的网络调试工具

Charles for Mac是一款功能强大的网络调试工具&#xff0c;可以帮助开发人员和测试人员更轻松地进行网络通信测试和调试。以下是一些Charles for Mac的主要特点&#xff1a; 软件下载&#xff1a;Charles for Mac 4.6.6注册激活版 流量截获&#xff1a;Charles可以截获和分析通…...

【数据结构】优先级队列——堆

&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;个人主页&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388; &#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;数据结构专栏&#x1f388;&#x1f388;&#x1f388;&…...

【力扣】45.跳跃游戏Ⅱ

45.跳跃游戏Ⅱ 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i]i j < n 返回到达 n…...

containerd使用了解

containerd使用了解 yum安装 [rootvm ~]# curl -o /etc/yum.repos.d/docker.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo [rootvm ~]# yum list | grep containerd containerd.io.x86_64 1.6.28-3.1.el7 doc…...

gateway 分发时若两个服务的路由地址一样,怎么指定访问想要的服务下的地址

1.思路 在使用Spring Cloud Gateway时&#xff0c;如果两个服务的路由地址相同&#xff0c;可以通过Predicate&#xff08;断言&#xff09;和Filter&#xff08;过滤器&#xff09;的组合来实现根据请求的不同条件将请求分发到不同的服务下的地址。 使用Predicate进行路由条件…...

【LeetCode】三月题解

文章目录 [2369. 检查数组是否存在有效划分](https://leetcode.cn/problems/check-if-there-is-a-valid-partition-for-the-array/)思路&#xff1a;代码&#xff1a; [1976. 到达目的地的方案数](https://leetcode.cn/problems/number-of-ways-to-arrive-at-destination/) 思路…...

云手机:实现便携与安全的双赢

随着5G时代的到来&#xff0c;云手机在各大游戏、直播和新媒体营销中扮演越来越重要的角色。它不仅节约了成本&#xff0c;提高了效率&#xff0c;而且在边缘计算和云技术逐渐成熟的背景下&#xff0c;展现出了更大的发展机遇。 云手机的便携性如何&#xff1f; 云手机的便携性…...

fast_bev学习笔记

目录 一. 简述二. 输入输出三. github资源四. 复现推理过程4.1 cuda tensorrt 版 一. 简述 原文:Fast-BEV: A Fast and Strong Bird’s-Eye View Perception Baseline FAST BEV是一种高性能、快速推理和部署友好的解决方案&#xff0c;专为自动驾驶车载芯片设计。该框架主要包…...

Collection与数据结构链表与LinkedList(三):链表精选OJ例题(下)

1. 分割链表 OJ链接 class Solution {public ListNode partition(ListNode head, int x) {if(head null){return null;//空链表的情况}ListNode cur head;ListNode formerhead null;ListNode formerend null;ListNode latterhead null;ListNode latterend null;//定义…...

05 | Swoole 源码分析之 WebSocket 模块

首发原文链接&#xff1a;Swoole 源码分析之 WebSocket 模块 大家好&#xff0c;我是码农先森。 引言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它允许客户端和服务器之间进行实时数据传输。 与传统的 HTTP 请求-响应模型不同&#xff0c;WebSocket 可以保持…...

Vue--------父子/兄弟组件传值

父子组件 子组件通过 props 属性来接受父组件的数据&#xff0c;然后父组件在子组件上注册监听事件&#xff0c;子组件通过 emit 触发事件来向父组件发送数据。 defineProps接收 let props defineProps({data: Array, }); defineModel接收 let bb defineModel("sit…...

Qt实现Kermit协议(一)

1 概述 Kermit文件运输协议提供了一条从大型计算机下载文件到微机的途径。它已被用于进行公用数据传输。 其特性如下: Kermit文件运输协议是一个半双工的通信协议。它支持7位ASCII字符。数据以可多达96字节长度的可变长度的分组形式传输。对每个被传送分组需要一个确认。Kerm…...

linux在使用重定向写入文件时(使用标准C库函数时)使处理信号异常(延时)--问题分析

linux在使用重定向写入文件时(使用标准C库函数时)使处理信号异常(延时)–问题分析 在使用alarm函数进行序号处理测试的时候发现如果把输出重定向到文件里面会导致信号的处理出现严重的延迟(ubuntu18) #include <stdio.h> #include <stdlib.h> #include <unist…...

淘宝扭蛋机小程序:趣味购物新体验,惊喜连连等你来

在数字化时代&#xff0c;淘宝始终站在创新的前沿&#xff0c;不断探索和引领电商行业的发展趋势。今天&#xff0c;我们欣然宣布&#xff0c;经过精心研发和打磨&#xff0c;淘宝扭蛋机小程序正式上线&#xff0c;为用户带来一场充满趣味与惊喜的购物新体验。 淘宝扭蛋机小程…...

linux:生产者消费者模型

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言一、生产者消费者模型二、基于阻塞队列的生产者消费者模型代码实现 总结 前言 本文是对于生产者消费者模型的知识总结 一、生产者消费者模型 生产者消费者模型就是…...

C++教学——从入门到精通 5.单精度实数float

众所周知&#xff0c;三角形的面积公式是(底*高)/2 那就来做个三角形面积计算器吧 到吗如下 #include"bits/stdc.h" using namespace std; int main(){int a,b;cin>>a>>b;cout<<(a*b)/2; } 这不对呀&#xff0c;明明是7.5而他却是7&#xff0c;…...

面向对象设计之单一职责原则

设计模式专栏&#xff1a;http://t.csdnimg.cn/6sBRl 目录 1.单一职责原则的定义和解读 2.如何判断类的职责是否单一 3.类的职责是否越细化越好 4.总结 1.单一职责原则的定义和解读 单一职责原则(Single Responsibility Principle&#xff0c;SRP)的描述&#xff1a;一个类…...

html5开发工程师/seo入门书籍推荐

IOS篇 一、尺寸及分辨率 iPhone界面尺寸&#xff1a;320*480、640*960、640*1136 iPhone6&#xff1a;4.7英寸(1334750)&#xff0c;iPhone6 Plus&#xff1a;5.5英寸(19201080) 设计图单位&#xff1a;像素72dpi。在设计的时候并不是每个尺寸都要做一套&#xff0c;尺寸按自己…...

网站建设人员叫什么科目/排名查询系统

核心 核心 java函数用C语言实现逻辑 好处 C代码效率高,在某些情况下更适合. java代码 代码 public class Test {public native void show();public static void main(String[] args){System.load("/path/to/Test.so");(new Test()).show();} }说明 show和普通函数一样…...

wordpress主题 搜索/收录网

一、去除 \ufeff encodingutf-8-sig 任何东西要存储在计算机中都要编码&#xff0c;视频&#xff0c;音频&#xff0c;文本&#xff0c;所以有时候&#xff0c;我们在打开一个视频的时候会遇到解码错误&#xff0c;不能播放&#xff0c;就是因为我们要将存储在计算机中的东西…...

网站产品管理模块/腾讯网网站网址

Table of Contents 文本操作技巧 打开文件关闭文件 从编辑模式到输入模式的常用操作 在编辑模式下移动光标的快捷键 在编辑模式下&#xff0c;进行复制粘贴撤销操作 末行模式 正则表达式&#xff08;grep&#xff09; 文本操作技巧 打开文件关闭文件 [rootnode001 …...

网站title keywords/哪个平台推广效果最好

part 1Java基础核心技术总结 万事都离不开根基&#xff0c;Java基础对于一些老鸟来说可能已经很熟悉了&#xff0c;但是对于很多开发5年以下的朋友掌握的或许不是很牢固&#xff0c;因此这份笔记更适合温故而知新。 Part 2并发编程&#xff08;架构师筑基必备&#xff09; 并发…...

购物网站的建设与维护/西安网站建设平台

Docker 基本用法 1. 安装社区版docker-ce 及 nvidia-docker2 插件 通过官网介绍的软件源的方式安装. 如果要安装nvidia-docker,由于其需要与docker-ce的版本匹配,所以如果是手动下载安装的话需要注意版本号. nvidia-docker对宿主机的要求是安装了nvidia驱动程序和docker程序,而…...