亿级数据如何分钟级别写入缓存?

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 亿级数据如何分钟级别写入缓存?

1.背景

在做用户画像的过程中经常会遇到,需要将用户数据入缓存的需求,提供给线上服务进行调用,因为最终加工的画像数据普遍会存储在离线表(Hive)或者一些其他存储中(HDFS、Doris 等等)

但是这类数据存储的特点非常明显适合一些内部运营系统做数据分析,但是用来做线上系统的高QPS、低延迟的服务,显然是不能满足的。

因此就必须将画像数据写入到redis 这种类似的分布式缓存当中。

那么如此大量的数据(亿级),如何能更快地写入到缓存当中呢?

2.系统架构设计

(1)利用Spark rdd 多分区的方式来进行并行写入缓存,提升写入缓存速度

(2)数据量太大,写入redis qps 较高,避免对redis 产生较大压力,进行限流控制

核心代码

result.foreachPartition(it -> {
            Jedis jedis = RedisInstance.getInstance(properties.getProperty("redis.ip"), Integer.parseInt(properties.getProperty("redis.port")), properties.getProperty("redis.pwd"));
            System.out.println(it.hashCode());
            Pipeline pipeline = jedis.pipelined();
            AtomicLong atomicLong = new AtomicLong();
            long start = System.currentTimeMillis();
            it.forEachRemaining(v -> {
                        //System.out.println(v.getString(0)+":"+v.getString(1));
                        atomicLong.incrementAndGet();
                        qpsControll(start, requiredQps, atomicLong, it.hashCode());
                        pipeline.sadd(v.getString(0), v.getString(1));
                        if (atomicLong.get() % 3 == 0) {
                            //每1000条提交一次
                            pipeline.sync();
                        }
                    }
            );
            pipeline.close();
            jedis.close();
        });

限流控制

private static void qpsControll(long start, int requiredQps, AtomicLong count, int x) {
        //System.out.println("current count:"+x+":"+ count.get());
        long actualQps = 1000 * count.get() / (System.currentTimeMillis() - start);
        System.out.println(x + ":" + actualQps);
        if (actualQps > (long) requiredQps) {
            System.out.println("=====stop =====");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                System.out.println(e);
            }
        }
    }

3.线上效果

能看到写入的qps 是在我们控制的范围内,一旦超过范围就会暂停一小段时间,项目源码已经开源,欢迎大家star,fork

https://gitee.com/ZhuGeZiFang/spark-redis

https://github.com/zhugezifang/hdfs-to-redis


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
5天前
|
存储 缓存 NoSQL
Redis入门到通关之Redis缓存数据实战
Redis入门到通关之Redis缓存数据实战
12 0
|
1月前
|
缓存 NoSQL Java
【九】springboot整合redis实现启动服务时热点数据保存在全局和缓存
【九】springboot整合redis实现启动服务时热点数据保存在全局和缓存
45 0
|
2月前
|
存储 缓存 算法
使用Java实现高效的数据缓存系统
【2月更文挑战第3天】在大规模的应用程序中,数据缓存是提高应用程序性能的一种重要方法。本文介绍了如何使用Java实现高效的数据缓存系统。我们将讨论缓存的设计原则和缓存算法的选择,同时详细说明如何使用Java内置的缓存库和其他开源工具来构建一个可靠、高效的数据缓存系统。
|
3月前
|
canal 缓存 关系型数据库
Springcloud Alibaba使用Canal将Mysql数据实时同步到Redis保证缓存的一致性
canal [kə'næl] ,译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。其诞生的背景是早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。
|
4月前
|
SQL 缓存 分布式计算
Apache Zeppelin系列教程第九篇——Zeppelin NoteBook数据缓存
Apache Zeppelin系列教程第九篇——Zeppelin NoteBook数据缓存
104 0
|
4月前
|
缓存 Java 关系型数据库
Spring Boot与Spring中的数据缓存Cache支持与实战(附源码)
Spring Boot与Spring中的数据缓存Cache支持与实战(附源码)
49 0
Spring Boot与Spring中的数据缓存Cache支持与实战(附源码)
|
4月前
|
缓存 Cloud Native 调度
Fluid支持分层数据缓存本地性调度(Tiered Locality Scheduling)
依赖容器化带来的高效部署、敏捷迭代,以及云计算在资源成本和弹性扩展方面的天然优势,以 Kubernetes 为代表的云原生编排框架吸引着越来越多的 AI 与大数据应用在其上部署和运行。但是数据密集型应用计算框架的设计理念和云原生灵活的应用编排的分歧,导致了数据访问和计算瓶颈。 CNCF开源项目Fluid作为 AI 与大数据云原生应用提供一层高效便捷的数据抽象,将数据从存储抽象出来,针对具体的场景(比如大模型),加速计算访问数据。
745 0
|
5月前
|
SQL 存储 缓存
Flink CDC中flink sql 如果缓存起来所有的数据,然后基于这个数据做查询?
Flink CDC中flink sql 如果缓存起来所有的数据,然后基于这个数据做查询?
67 1
|
5月前
|
存储 缓存 小程序
微信小程序数据交互和缓存
前言: 在开发微信小程序时,数据交互和缓存是非常重要的方面。本文将介绍如何进行数据交互并有效地使用缓存来提高小程序的性能和用户体验。
181 0
|
1月前
|
缓存 NoSQL 安全
【Redis】缓存穿透
【Redis】缓存穿透
30 0