redis - 实现周期性数据无上报检测

需求背景

以小时为周期不停地上报事件到事件平台,事件平台如果在连续2个周期 没有检测到上报的事件,就会发送告警给事件的相关责任人.

问题的难点在于如何检测连续周期内无数据?

如上图,2 点和 3 点,都没有上报数据,说明连续两个周期存在无数据上报.

解决方案

本文采用 redis 的有序集合实现此算法.

1. 假设

先做一些假设

  • 事件需要有类型属性,每种类型的事件有唯一一个上报渠道 ID
    ,参数为 data_id,每个上报渠道只有一种事件类型.
  • 上报的每个事件都有一个hash值,参数为 hash_value,相同 hash 值的所有事件当做一条时间序列.连续周期无数据检测针对的是一条时间序列进行处理.

2. 记录事件的hash 值到 redis 集合

事件平台每收到一个事件,就将事件的 hash 值hash_value 记录在 redis 的 set 中,示例代码如下

from django.core.cache import cache as redis_cachedata_id = "9fffdf1c-6feb-11ee-a73d-acde48001122"
hash_value = "7dcfd8f2-6feb-11ee-a73d-acde48001122"redis_key = data_id
redis_client = redis_cache.client.get_client()
redis_client.sadd(redis_key, hash_value)

3. 记录事件的上报时间到 redis 有序集合

事件平台每收到一个事件,就将上报时间戳作为 score,记录到 redis 的 sorted set 中,示例代码如下

from django.core.cache import cache as redis_cachedata_id = "9fffdf1c-6feb-11ee-a73d-acde48001122"
hash_value = "7dcfd8f2-6feb-11ee-a73d-acde48001122"# 假设事件的值为
event = {"hash_value": hash_value,"data_id": data_id,"data": {"key1": "value1","key2": "value2"}
}redis_key = f"{data_id}:{hash_value}"
score = int(time.time())redis_client = redis_cache.client.get_client()
redis_client.zadd(redis_key, {value: score})

使用有序集合,就可以构造出一个分数为时间戳的时间序列.

4. 检测无数据周期

需要开启一个定时任务,这里假设5 分钟检测一次时间序列.每次检测指定时间范围内事件的数量.

from datetime import timezone
from django.core.cache import cache as redis_cache
from django.utils import timezonedata_id = "9fffdf1c-6feb-11ee-a73d-acde48001122"
hash_value = "7dcfd8f2-6feb-11ee-a73d-acde48001122"# 检测周期 1 小时
interval_seconds = 3600
# 无数据周期数
cycle_number = 2
# 计算无数据检查时间范围
period_end_time = timezone.now()
period_start_time = period_end_time - timedelta(seconds=interval_seconds * cycle_number)
# 计算分数区间
period_start_score = int(period_start_time.timestamp())
period_end_score = int(period_end_time.timestamp())# 获得周期范围内的事件数量
redis_key = f"{data_id}:{hash_value}"
redis_client = redis_cache.client.get_client()
count = redis_client.zcount(redis_key, period_start_score, period_end_score)

如果count为 0,说明在连续周期内无数据.

5. 删除历史数据

由于是周期性事件上报,时间久了 set 和 sorted set 的值就会越来越大,导致 redis 服务器内存告警.所以我们需要定期清理过期的数据.

from django.core.cache import cache as redis_cachedata_id = "9fffdf1c-6feb-11ee-a73d-acde48001122"redis_client = redis_cache.client.get_client()# 获取所有的事件
redis_key = data_id
hash_value_set = redis_client.smembers(redis_key)# 指定删除的时间区间
min_score = ""
max_score = ""# 根据指定的时间取件删除有序集合中过期的数据
for hash_value in hash_value_set:redis_key = f"{data_id}:{hash_value}"redis_client.zremrangebyscore(redis_key, min_score, max_score)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/144897.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件工程与计算总结(十一)人机交互设计

目录 ​编辑 一.引例 二.目标 三.人类因素 1.精神模型 2.差异性 四.计算机因素 1.可视化设计 2.常见界面类型 五.人机交互设计的交互性 1.导航 2.反馈 3.设计原则 六.设计过程 1.基本过程 2.界面原型化 一.引例 无论软件功能多么出色,亦或内部的构造…

图论06-【无权无向】-图的遍历并查集Union Find-力扣695为例

文章目录 1. 代码仓库2. 思路2.1 UF变量设计2.2 UF合并两个集合2.3 查找当前顶点的父节点 find(element) 3. 完整代码 1. 代码仓库 https://github.com/Chufeng-Jiang/Graph-Theory 2. 思路 2.1 UF变量设计 parent数组保存着每个节点所指向的父节点的索引,初始值为…

uniapp实现登录组件之外区域置灰并引导登录

实现需求 每个页面需要根据用户是否登录决定是否显示登陆组件,登录组件半屏底部显示,登录组件之外区域置灰,功能按钮点击之后引导提示登录.页面效果如下: 实现思路说明 设置登录组件背景颜色为灰色,将页面分成登录区域(底部)和非登陆区域(上面灰色显示部分), 置灰区域添加…

flink中使用GenericWriteAheadSink的优缺点

背景 GenericWriteAheadSink是flink中提供的实现几乎精确一次输出的数据汇抽象类,本文就来看一下使用GenericWriteAheadSink的优缺点 GenericWriteAheadSink的优缺点 先看一下GenericWriteAheadSink的原理图 优点: 几乎可以精确一次的输出&#xf…

【LeetCode】94. 二叉树的中序遍历 [ 左子树 根结点 右子树 ]

题目链接 文章目录 Python3方法一: 递归 ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯方法二: 迭代 ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯方法三: Morris ⟮ O ( n ) 、 O ( 1 ) ⟯ \lgroup O(n)、O(1) \rgroup ⟮O(n)、O(1)⟯ C…

【Java】<泛型>,在编译阶段约束操作的数据结构,并进行检查。

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ JAVA泛型 泛型介绍: ①泛型&#…

一、软件工程概述+练习题

文章目录 软件工程复习一、 概述1.常见考点1.1 什么是软件?软件的特点 1.2 什么是软件危机?它的具体表现是什么?软件危机的概念软件危机的内容具体表现软件危机的原因消除软件危机的途径 2.软件工程的三要素软件工程的定义 3. 软件生存周期4.…

高校教务系统登录页面JS分析——西安交通大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文,你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习,勿用于非法用途。 一、密码加…

小插曲 -- 使用Visual Studio Code远程连接香橙派

在之前的学习中,代码的修改和保存都依赖于“vi”指令,而不得不承认vi指令的编辑界面非常原始,所以,如果可以将代码编辑放到更友好的环境里进行无疑是一件大快人心的事情。 本节介绍如何通过Visual Studio Code来进行远程连接: Vi…

Mybatis的SqlRunner执行流程

Mybatis的SqlRunner执行流程 SqlRunner exec new SqlRunner(connection); Map<String, Object> row exec.selectOne("SELECT * FROM PRODUCT WHERE PRODUCTID ?", "FI-SW-01");connection.close();assertEquals("FI-SW-01", row.ge…

strcpy函数

文章目录 strcpy函数描述函数使用总结目标空间为什么必须可变&#xff1f;模拟实现 strcpy函数描述 重点&#xff1a;including the terminating null character (and stopping at that point).意为拷贝的值包括停止字符 传参时第一个参数为要拷贝参数&#xff0c;第二个参数为…

springMVC中统一异常处理@ControllerAdvice

1.在DispatcherServlet中初始化HandlerExceptionResolver 2.controller执行完成后执行processDispatchResult(processedRequest,response,mappedHandler,mv,dispatchException),有异常则处理异常 3.ExcepitonHandlerExceptionResolver中执行方法doResolveHandlerMethodExceptio…