数据处理-链路统计redis到mysql2|学习笔记

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 快速学习数据处理-链路统计redis到mysql2

开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop框架搭建):数据处理-链路统计redis到mysql2】学习笔记与课程紧密联系,让用户快速学习知识

课程地址:https://developer.aliyun.com/learning/course/670/detail/11637


数据处理-链路统计 redis 到 mysql2

 

上节数据从 redis 里面读取数据,读取过来以后统计了某一个 redis 某一个 IP 的总和计算出来,并且写入到 LinkCount 里面。

写完以后,把它进行了返回。返回到了 linkCount,linkcount 里面记录的就是某一个IP对应的所有的总和。总和拿到了以后,得到的结果是一个 IP String 和一个和Integer。

如果有多个的时候,这里面就有可能多个值,Linkcount这里面就会有多个项目代码是LinkCount.keySet。keySet拿到了所有的key。拿到了所有的key,就变成了keySet。

而这个keySet又去遍历,如果这个是多个,就遍历其中的每一个,拿到了某一个IP serveAddr,到了这个IP。

后面来了一条hql语句,叫“from Datacollect where serve _name= :serveName”;。

这个 serveName 就是 params。这里面的 params 是个 map,是一个 string 和object。string 就叫做 serveName,实际上就是这个值,必须一模一样。

serverAddr中string key有了而value就是刚刚计算出来的 ip serveAddr。拿到了 ip以后,传到params里面。Hql和参数有了,接下来就执行这个hql。

“from Datacollect where serve _name= :serveName”;。找到爬虫中的datacollect。这里面的数据已经被导入进去,有一部分数据了,条件是 serve _name= :serveName,这个 serveName 指的就是  serveAddr,也就是当前的ip。

目前的ip就是100.160.这条datacollect数据就是返回的结果。假如现在的数据库是空的,一行数据都没有,在没有的情况下,第一次获取出来是空的,把数据写进去,先实例化 datacollect,初始化一个UUID().toString())。

这里面的key随便给一个值 UUID, serveName指的就是 serveAddr,也就是当前的ip。

datacollect也是一个bean,bean里面有id,serveName,beforeYesterdayNum和lastThreeDaysNum,就是数据表中datacollect所对应的bean12345这五个字段。

bean就是映射的表里面的数据和表里面的结构。实际上就是serverName,serveName 映射的是数据库里的 serve _name,这个就是 ip,服务器的ip就处理完了。

设置 lastThreeDaysNum 近三天的数据,近三天的数据等于 linkCount.get.( serveAddr).linkCount就是前面计算出来的ip和对应的总和,也就是map。get.(serveAddr)就是这个ip。

从这个ip中获取某一个key,对应的值给lastday,把beforeYesterdayNum设置成0,把setYesterdayNum设置成linkCount.get.( serveAddr)。

当第一次读取没有数据的时候,设置成这样一个值。初始化以后,调用datacollectDAO.save(datacollect),把数据保存到数据库里面,这是第一次读取没有数据的情况。现在读取是有数据的。有数据的时候就用到else里面。就可以计算昨天今天前天近三天的量,近三天的数据=昨天的数量+前天的数量+今天的数量。

Datacollect.setlastThreeDaysNum(inkCount.get.( serveAddr))就是刚刚统计出来的那个结果+datacollect.getYesterdayNum()+datacollect.getBeforeYesterdayNum())。

将昨天的数据赋值给前天,将今天的数据赋值给昨天,将最新的数据更新到数据库。近三天的数据=昨天的数量+前天的数量+今天的数量。

把数据库中的serve-name,before-yesterday-num 和 last-threeDays-num三个值进行更新,计算出了近三天的数据。把 servename 和 save 保存到了 mysql 里面。就实现了从 redis 读取数据写入到 mysql 的过程。

总结一下,trafficLinkInfo 传递的是前缀,前缀读取了所有的 key,遍历所有的 key中的每一个,计算出某一个 ip 的总和,全部都是在redis里面读取key,再去redis当中通过key取值,读完以后返回 linkCount,这里就是所有的 key 对应的总和,再去数据库里面查。如果数据库里对应的 ip没有,就设置一个值。

设置的值就是刚刚计算出来的结果,如果有,就将昨天的数据赋值给前天,将今天的数据赋值给昨天,将最新的数据更新到数据库,近三天的数据=昨天的数量+前天的数量+今天的数量。这就实现了 redis 读取数据并写入 mysql 过程

代码

public void SaveDataCollectData(){

Jediscluster jediscluster = Jedisconnectionutil . getJediscluster ();

Map < String , Integer > linkCount = TrafficUtil . trafficLinkInfo ( Constants . CSANTI _ MONITOR _ LP );

/循环存储所有的 IP

Set < String > keySet = linkCount . keySet ();

/遍历每一个  serverAddr 其中的一个 IP

for ( String serverAddr : keySet ){

/根据 serveraddr 查询链路历史数据

String hql =" from Datacollect where server _ name =: serverName "; Map く String ,0bject> params - new HashMap く~>0);

params . put (" serverName ", serverAddr )3//192.168.2.111//读取出数据库中 server _ name 与 serverAddr 相同的数据

Datacollect datacollect - datacollectDao , get ( hql , params );/ mysql 历史数据不存在,新存入数据

if ( datacollect ==nul1){

datacollect = new Datacollect ();

datacollect . setId ( UUID . randomUUID (). tostring() );

datacollect . setserverName ( serverAddr );

datacollect . setLastThreeDaysNum ( linkCount . get ( serverAddr ));

datacollect . setBeforeYesterdayNum ( 0 );

datacollect . setYesterdayNum ( linkCount . get ( serverAddr )); dataCollectDao . save ( datacollect );

} else {

//历史数据存在,累加

//近三天的数据=昨天的数量+前天的数量+今天的数量

datacollect . setLastThreeDaysNum ( linkCount . get ( serverAddr )

+ datacollect . getYesterdayNum ()

+ datacollect . getBeforeYesterdayNum ());

// 将昨天的数据赋值给 datacollect

// 将今天的数据赋值给昨天

 datacollect . setYesterdayNum ( linkCount . get ( serverAddr ));

//将最新的数据更新到数去

dataCollectDao . update ( datacOllect )3

setBeforeYesterdayNum ( datacollect . getYesterdayNum ());

3.bean 字段

//与数据库中的字段对应

private string id ;

private String serverName ;

private Integer beforeYesterdayNum ; private Integer yesterdayNum ;

private Integer lastThreeDaysNum ;

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
打赏
0
0
0
0
115
分享
相关文章
MySQL索引学习笔记
本文深入探讨了MySQL数据库中慢查询分析的关键概念和技术手段。
353 80
Redis和Mysql如何保证数据⼀致?
1. 先更新Mysql,再更新Redis,如果更新Redis失败,可能仍然不⼀致 2. 先删除Redis缓存数据,再更新Mysql,再次查询的时候在将数据添加到缓存中 这种⽅案能解决1 ⽅案的问题,但是在⾼并发下性能较低,⽽且仍然会出现数据不⼀致的问题,⽐如线程1删除了 Redis缓存数据,正在更新Mysql,此时另外⼀个查询再查询,那么就会把Mysql中⽼数据⼜查到 Redis中 1. 使用MQ异步同步, 保证数据的最终一致性 我们项目中会根据业务情况 , 使用不同的方案来解决Redis和Mysql的一致性问题 : 1. 对于一些一致性要求不高的场景 , 不做处理例如 : 用户行为数据 ,
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
Redis与MySQL的数据一致性
在高并发环境下,保持 Redis 和 MySQL 的数据一致性是一个复杂但重要的问题。通过采用读写穿透、写穿透、分布式锁、双写一致性保障和延时双删策略,可以有效地减少数据不一致的风险,确保系统的稳定性和可靠性。通过合理的缓存策略和数据同步机制,可以显著提升系统的性能和用户体验。
178 22
《docker高级篇(大厂进阶):1.Docker复杂安装详说》包括:安装mysql主从复制、安装redis集群
《docker高级篇(大厂进阶):1.Docker复杂安装详说》包括:安装mysql主从复制、安装redis集群
168 14
《docker基础篇:8.Docker常规安装简介》包括:docker常规安装总体步骤、安装tomcat、安装mysql、安装redis
《docker基础篇:8.Docker常规安装简介》包括:docker常规安装总体步骤、安装tomcat、安装mysql、安装redis
196 7
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
275 26
Linux安装jdk、mysql、redis
Linux安装jdk、mysql、redis
313 7
Redis和Mysql如何保证数据⼀致?
在项目中,为了解决Redis与Mysql的数据一致性问题,我们采用了多种策略:对于低一致性要求的数据,不做特别处理;时效性数据通过设置缓存过期时间来减少不一致风险;高一致性但时效性要求不高的数据,利用MQ异步同步确保最终一致性;而对一致性和时效性都有高要求的数据,则采用分布式事务(如Seata TCC模式)来保障。
127 14
MySQL和Redis的区别
**MySQL和Redis的区别** MySQL和Redis都是流行的数据存储解决方案,但它们在设计、用途和特性上有显著区别。理解这些区别有助于选择合适的数据库来满足不同的应用需求。本文将详细介绍MySQL和Redis的区别,包括它们的架构、使用场景、性能和其他关键特性。 ### 一、基本概述 **MySQL**: MySQL是一个关系型数据库管理系统(RDBMS),使用结构化查询语言(SQL)进行数据管理。它支持事务、复杂查询和多种存储引擎,广泛应用于各种Web应用、企业系统和数据分析项目。 **Redis**: Redis是一个基于内存的键值数据库,通常被称为NoSQL数
393 4

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等