java redis 去重_基于flink+redis的请求泛化去重

本文介绍了一种基于Flink和Redis的请求去重解决方案。首先,作者指出使用Flink的时间窗口进行批处理在某些场景下并不适用,然后提出通过提取请求的关键词进行哈希,并利用Redis进行去重的思路。主要步骤包括:Flink流处理负责数据泛化,FlatMap用于分类处理请求,而RedisUtil工具类协助操作Redis。不同类型的请求(如URL、GET、POST等)被处理并存储在Redis的不同库中,以便于后续扫描器高效地获取数据。
摘要由CSDN通过智能技术生成

1.概述

上个文章已经说了泛化去重部分是想用flink去实现,然后实现的时候发现,如果使用flink的数据聚合和stream sql去实现很蠢,因为如果使用时间窗口进行批处理,在当前我的需求的情况下,完全不符合,用大炮打蚊子的感觉。

后来想到的通过提取请求包中的关键字进行hash,然后以hash,原数据的方式存在redis,通过redis进行去重处理。(后来看ysrc的被动扫描,发现这是人家三年前就想到的的思路……)

那么flink部分就只需要用flatmap对数据进行泛化处理,然后插入redis即可。(其实这里拿python 整个kafka的消费者就行,没必要用flink,但是我想明白的时候已经快写完了。)

还剩最后大头的扫描器了,想抄别人的看着都费劲,我要裂开了。

2.main

本质上就是一个kafka的消费者,拿到数据流进flatmap处理。

1

2

3

4

5

6

7

8

9

10

11

12

13public static void main(String[] args) throws Exception {

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

env.enableCheckpointing(1000);

Properties properties = new Properties();

properties.setProperty("bootstrap.servers", "xx.xx.xx.xx:xx");

properties.setProperty("zookeeper.connect", "xx.xx.xx.xx:xx");

properties.setProperty("group.id", "test");

FlinkKafkaConsumer myConsumer = new FlinkKafkaConsumer("proxy", new SimpleStringSchema(), properties);

myConsumer.setStartFromEarliest();

DataStream stream = env.addSource(myConsumer);

stream.flatMap(new generalization());

env.execute("proxy");

}

3.flatmap

这里的思路就是分类处理,由于我kafka里是统一格式的json串,所以这里处理的时候,value就是kafka里的每一条数据,直接写个java bean就行。

Url.Generalization功能是获取所有目录的url,进行敏感文件之类的扫描

Get和POST就很明显了,是对有无body的请求,进行分开处理。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20public void flatMap(String value, Collector> out) {

try {

RedisUtil jedis = new RedisUtil("xx.xx.xx.xx", 6379);

Gson gson = new Gson();

Packet packet = gson.fromJson(value, Packet.class);

Url.Generalization(jedis, value, packet);

if (packet.getContent_length() == null) {

Get.Generalization(jedis, value, packet);

} else {

Post.Generalization(jedis, value, packet);

}

jedis.close();

} catch (Exception e) {

e.printStackTrace();

}

}

4.RedisUtil

RedisUtil就是通过调用jedis实现的一个工具类,这里需要说一下的是,一个redis实例有0-15,16个库,泛化过程中会将完成的各类请求包,存在不同序号的库中,这样扫描器扫描取数据的时候,就非常的方便。

目前这里用到的库,0为url,1为get请求,2为json post,3为xml post,4为标准post,5为上传请求,6为其他请求。

5.URL

这里很简单,获取目录,然后遍历出来每一级的目录,最后特征计算hash,存入redis。

2c5ad02ac904fbab811b150db4b0b801.png

6.GET

GET这里首先判断了有无参数,然后将参数的key全部提出来,做一个简单的排序以后,跟其他特征拼起来计算hash,存入redis。

20986d9be5e73a33bd1c6955a2f46a9f.png

7.POST

7.1 PostUtil

这个工具类就是对body进行类型判断的

eea8b996c65944b92a3ab0c94e2ebe79.png

7.2 Json Post

content-type和isJson判断

af67d1d86615492fe27cb75f1121f398.png

7.3 XML Post

这里跟群友激烈讨论后,觉得xml的请求,同一接口,多个不同参数的情况较少,处理xml的key又非常麻烦,所以就只简单判断了接口

fec7438f1475689e016a1f8ea89dfae8.png

7.4 上传请求

通过content-type判断

5e8e9cb91498bc09257481a052b19dbd.png

7.5 标准请求

等同于GET的处理

7.6 其他请求

各种各样的其他请求,直接用content做hash关键字,只单纯去重

eb5b30f0dcf0872479390839ed6ba76f.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值