Flink 使用 Guava cache来实现维表数据热存储之资料整理

需求分析:

  Flink实时流处理过程中,需要使用维表数据,我们需要加载维表数据进行join,一般分3种方式

1,使用预加载,在open方法里面读取数据

  也可以定时读写redis的数据,同步更新内存数据

2,使用分布式缓存--不推荐

3,使用Guava cache 异步IO缓存

1)导入依赖:

<dependency>

    <groupId>com.google.guava</groupId>

    <artifactId>guava</artifactId>

     <version>25.0-jre</version>

</dependency>

2)简单使用代码

// 通过CacheBuilder构建一个缓存实例
Cache<String, String> cache = CacheBuilder.newBuilder()
                .maximumSize(100) // 设置缓存的最大容量
                .expireAfterWrite(1, TimeUnit.MINUTES) // 设置缓存在写入一分钟后失效
                .concurrencyLevel(10) // 设置并发级别为10
                .recordStats() // 开启缓存统计
                .build();
// 放入缓存
cache.put("key", "value");
// 获取缓存
String value = cache.getIfPresent("key");

定时刷新:

CacheBuilder.newBuilder()
        // 设置缓存在写入10分钟后,通过CacheLoader的load方法进行刷新
        .refreshAfterWrite(10, TimeUnit.SECONDS)
        // jdk8以后可以使用 Duration
        // .refreshAfterWrite(Duration.ofMinutes(10))
        .build(new CacheLoader<String, String>() {
            @Override
            public String load(String key) throws Exception {
                // 缓存加载逻辑
                ...
            }
        });

具体案例代码:

访问接口返回的json数据:
{“ids”:[
“/cnaz1/filebeat/h_realtime_qavlog_flink_cluster.yml”,
“/cnaz1/filebeat/ops-flink-cluster.yml”,
“/cnaz1/filebeat/h-realtime-order-cluster.yml”,
“/cnaz1/filebeat/h_realtime_hotdog_flink_cluster.yml”,
“/cnaz1/filebeat/h_realtime_log_distributor_cluster.yml”]
}

package test.utils;


import com.alibaba.fastjson.JSONObject;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @Author:renxin.tang
 * @Desc:
 * @Date: Created in 14:29 2019/4/23
 */
public class IdsCache {

    private LoadingCache<String, Map<String,String>> caches = CacheBuilder.newBuilder()
            // 1分钟后刷新
            .refreshAfterWrite(1, TimeUnit.MINUTES)
            .build(new CacheLoader<String, Map<String,String>>() {
                @Override
                public Map<String,String> load(String key) throws Exception {
                    final String url = "http://域名/api/v1/logs?zone=cnaz1";
                    JSONObject jsonObject = JSONObject.parseObject(GetHttpData.getData(url));
                    String list  = jsonObject.get("ids").toString();
                    List<String> list1=  JSONObject.parseArray(list).toJavaList(String.class);
                    HashMap<String, String> map = new HashMap<>();
                    for (String s : list1) {
                        map.put(s,s);
                    }
                    return map;
                }
            });
    public LoadingCache<String, Map<String,String>> getCache(){
        return this.caches;
    }
    public static void main(String[] args) {
        LoadingCache<String, Map<String, String>> caches = new IdsCache().getCache();
        try {
            while (true)
            {
                Map<String,String> map2 = caches.get("ids");
                System.out.println(map2.size());
                Thread.sleep(2000);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

猜你喜欢

转载自blog.csdn.net/qq_31866793/article/details/105950810