flink-操作redis

redis中存储了部分域名与ip的对应关系数据,由于网络或者其他原因,会导致域名的ip地址为8.8.8.8,所以需要将这部分数据更新,现用flink进行相关操作。

package com.myproject.analyse

import com.myproject.utils.{RedisUtil, UrlUtil}
import org.apache.flink.configuration.Configuration
import org.apache.flink.streaming.api.functions.sink.RichSinkFunction
import org.apache.flink.streaming.api.functions.source.{RichSourceFunction, SourceFunction}
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.connectors.redis.common.mapper.{RedisCommand, RedisCommandDescription, RedisMapper}
import redis.clients.jedis.Jedis
import scala.collection.JavaConverters._

/**
  * Author: Admin
  * Date: 2023/3/15 9:54
  * Description:
  * 将redis中8.8.8.8的ip重新获取(后续可将filter去掉 全量重新获取的和原有的不同时 更新)
  **/
object SourceAndSinkRedis {
  def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    //    env.setParallelism(4)
    /* val conf = new FlinkJedisPoolConfig.Builder()
       .setHost("192.168.0.30")
       .setDatabase(2)
       .build()*/
    val stream = env.addSource(new MyRedisSource("*")).filter(_._2 == "8.8.8.8")

    //    stream.print()
    stream.map(x => {
      val (host, oldIp) = x
      val ip = UrlUtil.getHostIp(host)
      ((host, ip), oldIp)
    }).filter(x => {
      x._1._2 != x._2
    }).map(_._1)
      //      .addSink(new RedisSink[(String, String)](conf, new MyRedisSink))
      .addSink(new MyRedisSinkSet)


    env.execute()
  }

  class MyRedisSource(keyPattern: String) extends RichSourceFunction[(String, String)] {
    var jedisClient: Jedis = _

    override def open(parameters: Configuration): Unit = {
      jedisClient = RedisUtil.getJedisClient
      jedisClient.select(2)
    }

    override def run(ctx: SourceFunction.SourceContext[(String, String)]): Unit = {
      val keys = jedisClient.keys(keyPattern)
      /*  val keysIter = keys.iterator()
        while (keysIter.hasNext) {
          val key = keysIter.next()
          ctx.collect(key, jedisClient.get(key))
        }*/
      keys.asScala.foreach(key => {
        ctx.collect(key, jedisClient.get(key))
      })
    }

    override def cancel(): Unit = {
      jedisClient.close()
    }
  }


  class MyRedisSink extends RedisMapper[(String, String)] {
    override def getCommandDescription: RedisCommandDescription = new RedisCommandDescription(RedisCommand.SET)

    override def getKeyFromData(data: (String, String)): String = data._1

    override def getValueFromData(data: (String, String)): String = data._2
  }

  class MyRedisSinkSet extends RichSinkFunction[(String, String)] {
    var jedisClient: Jedis = _

    override def open(parameters: Configuration): Unit = {
      jedisClient = RedisUtil.getJedisClient
      jedisClient.select(2)
    }

    override def invoke(value: (String, String)): Unit = {
      println(value)
      if (value._2 != null)
        jedisClient.set(value._1, value._2)

    }

    override def close(): Unit = jedisClient.close()

  }

}

  • 23
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不加班程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值