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

news2024/10/6 22:27:50

需求背景

以小时为周期不停地上报事件到事件平台,事件平台如果在连续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_cache

data_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_cache

data_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 timezone

data_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_cache

data_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.coloradmin.cn/o/1118333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

专访 Web3Go 新产品 Reiki:培育 AI 原生数字资产与创意新土壤

从 DeFi 到 NFTFi、SocialFi,web3 从业者在尝试 crypto 与区块链技术能为我们的生活、创作、娱乐和文化带来何种新体验,而生成式人工智能的突破性发展则为我们与链上世界的交互、社区内容创作等带来了新的体验,改变互动、交易和价值创造方式。…

C++入门——引用|内联函数|auto关键字|基于范围的for循环|指针空值

前言 C入门专栏是为了补充C的不足,并为后面学习类和对象打基础。在前面我们已经讲解了命名空间、输入输出、缺省参数、重载函数等,今天我们将完结C的入门。 下面开始我们的学习吧! 一、引用 1、引用是什么呢?为什么C添加了引用&a…

数据结构---HashMap和HashSet

HashMap和HashSet都是存储在哈希桶之中,我们可以先了解一些哈希桶是什么。 像这样,一个数组数组的每个节点带着一个链表,数据就存放在链表结点当中。哈希桶插入/删除/查找节点的时间复杂度是O(1) map代表存入一个key值,一个val值…

原型与原型链

一、原型:prototype 1.什么是原型? javascript常被描述为一种基于原型的语言(每个对象都拥有一个原型对象) 当访问一个对象的属性时,它不仅在该对象上寻找,还会寻找该对象的原型,以及该对象原…

【Java】人工智能交互智慧导诊系统源码

随着人工智能技术的快速发展,语音识别与自然语言理解技术的成熟应用,基于人工智能的智慧导诊导医逐渐出现在患者的生活视角中,智能导诊系统应用到医院就医场景中,为患者提供导诊、信息查询等服务,符合智慧医院建设的需…

Java利用反射和读取xml实现迷你容器

由于需要框架能实现多态,达到控制反转解耦。所以容器还是需要的,容器的存在可以简化对象获取工作,但是容器也不是万能的。合理使用即可,Spring对我来说太庞大了,用不着,为此给框架写一个迷你版容器。 容器…

Netty的高性能基石ByteBuf

前言 ​ NIO中缓冲区是数据传输的基础,JDK通过ByteBuffer实现,Netty框架中并未采用JDK原生的ByteBuffer,而是构造了ByteBuf。 ​ Netty中的ByteBuf对ByteBuffer做了大量的优化,比如说内存池,零拷贝,引用计数&#xf…

QFileDialog 文件对话框

文章目录 1、简介2、公共类型3、属性4、functions1、访问属性相关 function2、静态公共成员1、 通过对话框获取用户选择的文件路径:QFileDialog::getOpenFileName2、 通过对话框获取用户选择的文件夹路径:QFileDialog::getExistingDirectory 3、Public F…

家庭资产配置

不同家庭的资产配置 理财就是理人生 为人生的每件事,准备好相应的钱 生存的事 生活费 假设我们今年30岁,则至60岁期间所需的日常生活开支为: 4000元/月X 12月X30年144万 养老的事 养老费 吃饭居住娱乐其他开销60至80岁期间所需的养老…

用Wokwi仿真ESP-IDF项目

陈拓 2023/10/21-2023/10/21 1. 概述 Wokwi是一个在线的电子电路仿真器。你可以使用它来仿真Arduino、ESP32、STM32和许多其他流行的电路板、元器件以及传感器,免去使用开发板。 Wokwi提供基于浏览器的界面,您可以通过这种简单直观的方式快速开发一个…

农产品农货经营小程序商城的作用是什么

农产品行业涵盖的产品很多,以小麦、稻子、玉米、高粱等为主,还有粮油、果蔬、畜牧等产品。 自建技术团队,耗时耗力,培养成本较高,销售渠道单一、等客上门、产品无法高效宣传及促进用户购买,营销力不足&…

会声会影2023官方破解版激活码

随着短视频、vlog等媒体形式的兴起,视频剪辑已经成为了热门技能。甚至有人说,不会修图可以,但不能不会剪视频。实际上,随着各种智能软件的发展,视频剪辑已经变得越来越简单。功能最全的2023新版,全新视差转…

JavaWeb学生管理系统(详细源码+解析)

​ 很多人大学的第一个小项目就是使用JavaWeb实现了一个学生管理系统或者是图书管理系统。在没有项目经验的情况下,前后端都需要自己去完成,还是要耗费不少时间精力的。本次我就分享一下我在大学期间完成的第一个小项目:学生管理系统。采用的…

2023年【司钻(钻井)】及司钻(钻井)作业模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 司钻(钻井)是安全生产模拟考试一点通生成的,司钻(钻井)证模拟考试题库是根据司钻(钻井)最新版教材汇编出司钻(钻井&#…

Tuxera NTFS2023破解版苹果电脑磁盘读写工具

当您获得一台新 Mac 时,它只能读取 Windows NTFS 格式的 USB 驱动器。要将文件添加、保存或写入您的 Mac,您需要一个附加的 NTFS 驱动程序。Tuxera 的 Microsoft NTFS for Mac 是一款易于使用的软件,可以在 Mac 上打开、编辑、复制、移动或删…

性能优化:JIT即时编译与AOT提前编译

优质博文:IT-BLOG-CN 一、简介 JIT与AOT的区别: 两种不同的编译方式,主要区别在于是否处于运行时进行编译。 JIT:Just-in-time动态(即时)编译,边运行边编译:在程序运行时,根据算法计算出热点代码&#xf…

CVE-2019-1388 UAC提权实战

1.查看用户权限:guest来宾权限 2.右键-以管理员身份运行: 3.这个时候会弹出UAC,不用管它,点击:显示详细信息 4.然后点击蓝色字体:显示有关此发布者的证书信息 5.来到证书信息这里,点击颁发着…

线程是如何在 6 种状态之间转换的?

Java全能学习面试指南:https://javaxiaobear.cn 今天我们主要学习线程是如何在 6 种状态之间转换的。 线程的 6 种状态 就像生物从出生到长大、最终死亡的过程一样,线程也有自己的生命周期,在 Java 中线程的生命周期中一共有 6 种状态。 …

揭开 Amazon Bedrock 的神秘面纱 | 基础篇

在 2023 年 4 月,亚马逊云科技曾宣布将 Amazon Bedrock 纳入使用生成式人工智能进行构建的新工具集。Amazon Bedrock 是一项完全托管的服务,提供各种来自领先 AI 公司(包括 AI21 Labs、Anthropic、Cohere、Stability AI 和 Amazon 等&#xf…

Python学习第一天-安装Python

文章目录 前言一、下载Python二、执行安装程序三、命令行验证总结 前言 以下榜单来自于TIOBE编程语言流行指数 不多说了,Python天下第一 一、下载Python 从官网下载Python安装程序 二、执行安装程序 找到python-3.12.0-amd64.exe执行,选择Install …