使用perl分析web log 数据存储redis
发布时间:2020-12-15 23:53:52 所属栏目:大数据 来源:网络整理
导读:package redisControl;use strict;use warnings;use Redis;use Data::Dumper;use POSIX qw(strftime);sub new { my $self = {}; my $class = shift; bless $self; return $self;}# 插入数值到redissub insertHKey { my $self = shift; my ( $r,$sIp,$cIp,$da
package redisControl; use strict; use warnings; use Redis; use Data::Dumper; use POSIX qw(strftime); sub new { my $self = {}; my $class = shift; bless $self; return $self; } # 插入数值到redis sub insertHKey { my $self = shift; my ( $r,$sIp,$cIp,$date,$timestamp,$count,$seal,$type,$level ) = @_; $r->hmset( 'blackList',#设置key "$sIp:$cIp:date" => $date,#设置日期 "$sIp:$cIp:timestamp" => $timestamp,#设置unix时间戳 "$sIp:$cIp:count" => $count,#插入总次数 "$sIp:$cIp:seal" => $seal,#是否被封 "$sIp:$cIp:type" => $type,#IP或者CALL类型 "$sIp:$cIp:level" => $level #哪种级别被封 ); } sub insertKey { my $self = shift; my ( $r,$level ) = @_; my $minDate = strftime( "%Y%m%d%H%M",localtime(time) ); my $houDate = strftime( "%Y%m%d%H",localtime(time) ); $r->sadd( $date => "$sIp:$cIp" ); #按天来存储IP信息 $r->sadd( $minDate => "$sIp:$cIp" ); #按分钟存储IP信息 $r->sadd( $houDate => "$sIp:$cIp" ); $r->sadd( "$sIp:$date" => "$sIp:$cIp" ); $r->sadd( "$sIp:$minDate" => "$sIp:$cIp" ); $r->sadd( "$sIp:$houDate" => "$sIp:$cIp" ); $r->set( "$sIp:$cIp:$date:count" => $count ); #详细按天的数据 $r->set( "$sIp:$cIp:$date:seal" => $seal ); $r->set( "$sIp:$cIp:$date:type" => $type ); $r->set( "$sIp:$cIp:$date:timestamp" => $timestamp ); $r->set( "$sIp:$cIp:$date:level" => $level ); $r->set( "$sIp:$cIp:$minDate:count" => $count ); #详细按分钟的数据 $r->set( "$sIp:$cIp:$minDate:seal" => $seal ); $r->set( "$sIp:$cIp:$minDate:type" => $type ); $r->set( "$sIp:$cIp:$minDate:timestamp" => $timestamp ); $r->set( "$sIp:$cIp:$minDate:level" => $level ); $r->set( "$sIp:$cIp:$houDate:count" => $count ); #详细按小时的数据 $r->set( "$sIp:$cIp:$houDate:seal" => $seal ); $r->set( "$sIp:$cIp:$houDate:type" => $type ); $r->set( "$sIp:$cIp:$houDate:timestamp" => $timestamp ); $r->set( "$sIp:$cIp:$houDate:level" => $level ); } #IP每10分钟抽出最新 sub ipCountMin { my $self = shift; my ( $r,$data,$end ) = @_; #my $llen = $r->llen($data); my ($ser) = ( split /:/,$data )[0]; my $list = $r->lrange( $data,$end ); return $list; } #IP排行榜统计 sub ipTop { my $self = shift; my ( $r,$date ) = @_; my $top100Ip; my @ips = $r->sort( $date,"by","*:$date:count","limit",100,"desc" ); for my $value (@ips) { push @{ $top100Ip->{$value} },$r->mget( "$value:$date:count","$value:$date:level","$value:$date:type","$value:$date:seal","$value:$date:timestamp" ); } return $top100Ip; } #刷新每分钟IP的次数 sub realTimeDateIp { my $self = shift; my $sData; my ( $r,$sec) = @_; my $startTime = strftime( "%Y%m%d%H%M",localtime( time() - $sec ) ); my $dataFrom = $r->smembers("$startTime") ; #统计服务器的各个时间段IP成员 unless ($dataFrom) { #如果IP没有被封 my $sIp; my $ifconfig = `ifconfig`; $sIp = $1 if $ifconfig =~ /eth0(?!:)[sS]+?inet[^:]+:((?:d{1,3}.){3}d{1,3})/ ; #获取服务器IP $sData->{$sIp} = 0; } for (@$dataFrom) { my ( $sIp,$cIp ) = split /:/; $sData->{$sIp}++; } for my $sIp ( keys %$sData ) { $r->lpush( "$sIp:min" => $sData->{$sIp} ) ; #根据IP分别统计每分钟的次数 } } sub realHourDateIp { my $self = shift; my $sData; my ( $r,$sec) = @_; my $startTime = strftime( "%Y%m%d%H",$cIp ) = split /:/; $sData->{$sIp}++; } for my $sIp ( keys %$sData ) { $r->lpush( "$sIp:hour" => $sData->{$sIp} ) ; #根据IP分别统计每小时的次数 } } 1; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Delphi数学常用操作函数一
- actionscript-3 – 如何修改Perlin Noise [参见线程中的示例
- Delphi的没落有三个原因(比较贴切)
- 如何让Perl的Spreadsheet :: WriteExcel用VLOOKUP创建公式?
- [VB.NET]datagridview 问题
- lua4.0数值定义
- Lua直接调用动态链接库(DLL或so文件)
- php – Laravel:在视图中调用base_controller中定义的函数
- delphi – TTypeInfo之前的“身份指针”是什么?
- 314. Binary Tree Vertical Order Traversal - Medium