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

简介: 快速学习数据处理-链路统计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 ;

相关文章
|
2月前
|
缓存 NoSQL 关系型数据库
MySQL 与 Redis 如何保证双写一致性?
我是小假 期待与你的下一次相遇 ~
407 7
|
5月前
|
关系型数据库 应用服务中间件 nginx
Docker一键安装中间件(RocketMq、Nginx、MySql、Minio、Jenkins、Redis)
本系列脚本提供RocketMQ、Nginx、MySQL、MinIO、Jenkins和Redis的Docker一键安装与配置方案,适用于快速部署微服务基础环境。
|
7月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
2月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
504 5
|
6月前
|
NoSQL Linux Redis
每天百万访问也不怕,Redis帮你搞定UV统计
本文介绍了使用Redis实现高性能UV统计系统的方法。Redis凭借其内存数据库特性,支持毫秒级响应和自动去重,非常适合高并发场景下的访客统计。核心思路是利用Redis的Set数据结构作为"每日签到墙",通过记录用户访问ID实现自动去重,并设置24小时过期时间。文章提供了Python代码示例,展示如何记录用户访问和获取当日UV统计数据,还可扩展实现多页面UV统计。相比传统数据库方案,Redis方案更加轻量高效,是中小型网站实现流量统计的理想选择。
530 0
|
11月前
|
存储 关系型数据库 MySQL
MySQL索引学习笔记
本文深入探讨了MySQL数据库中慢查询分析的关键概念和技术手段。
735 81
|
9月前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
1. 先更新Mysql,再更新Redis,如果更新Redis失败,可能仍然不⼀致 2. 先删除Redis缓存数据,再更新Mysql,再次查询的时候在将数据添加到缓存中 这种⽅案能解决1 ⽅案的问题,但是在⾼并发下性能较低,⽽且仍然会出现数据不⼀致的问题,⽐如线程1删除了 Redis缓存数据,正在更新Mysql,此时另外⼀个查询再查询,那么就会把Mysql中⽼数据⼜查到 Redis中 1. 使用MQ异步同步, 保证数据的最终一致性 我们项目中会根据业务情况 , 使用不同的方案来解决Redis和Mysql的一致性问题 : 1. 对于一些一致性要求不高的场景 , 不做处理例如 : 用户行为数据 ,
|
9月前
|
消息中间件 缓存 NoSQL
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
|
11月前
|
缓存 NoSQL 关系型数据库
Redis与MySQL的数据一致性
在高并发环境下,保持 Redis 和 MySQL 的数据一致性是一个复杂但重要的问题。通过采用读写穿透、写穿透、分布式锁、双写一致性保障和延时双删策略,可以有效地减少数据不一致的风险,确保系统的稳定性和可靠性。通过合理的缓存策略和数据同步机制,可以显著提升系统的性能和用户体验。
528 22
|
12月前
|
NoSQL 关系型数据库 Redis
《docker高级篇(大厂进阶):1.Docker复杂安装详说》包括:安装mysql主从复制、安装redis集群
《docker高级篇(大厂进阶):1.Docker复杂安装详说》包括:安装mysql主从复制、安装redis集群
341 14

推荐镜像

更多