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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容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
相关文章
|
3月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
156 1
|
3月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
60 2
数据的存储--Redis缓存存储(二)
|
2月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
60 5
|
2月前
|
存储 缓存 算法
分布式缓存有哪些常用的数据分片算法?
【10月更文挑战第25天】在实际应用中,需要根据具体的业务需求、数据特征以及系统的可扩展性要求等因素综合考虑,选择合适的数据分片算法,以实现分布式缓存的高效运行和数据的合理分布。
|
3月前
|
缓存 监控 前端开发
处理页面缓存中数据不一致的问题
【10月更文挑战第9天】
70 2
|
3月前
|
消息中间件 缓存 NoSQL
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
93 2
|
5月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
159 1
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
5月前
|
缓存 NoSQL 算法
【Azure Redis 缓存】Redis导出数据文件变小 / 在新的Redis复原后数据大小压缩近一倍问题分析
【Azure Redis 缓存】Redis导出数据文件变小 / 在新的Redis复原后数据大小压缩近一倍问题分析
|
5月前
|
存储 缓存 Java
Java本地高性能缓存实践问题之使用@CachePut注解来更新缓存中数据的问题如何解决
Java本地高性能缓存实践问题之使用@CachePut注解来更新缓存中数据的问题如何解决
140 0
|
5月前
|
存储 缓存 Java
Java本地高性能缓存实践问题之使用@CachePut注解来更新缓存中的数据的问题如何解决
Java本地高性能缓存实践问题之使用@CachePut注解来更新缓存中的数据的问题如何解决
130 0