大批量URL去重的架构设计(redis-bitmap+redisson)

1. 引言

  • 什么是数据去重?
    • 在大数据处理中,去重是指消除重复数据,只保留唯一的数据记录。
  • 去重的重要性
    • 提高数据处理效率,节省存储空间,提升数据分析的准确性。
  • 常见的去重技术
    • 基于哈希函数、布隆过滤器、位图等方法。

2. 大规模URL去重的挑战

  • 数据量巨大:处理数亿甚至数十亿的URL。
  • 高并发:实时接收和处理大量URL请求。
  • 内存与存储:高效利用内存和存储资源,降低成本。
  • 低延迟:确保去重操作的快速响应,满足实时性要求。
  • 高可用性与扩展性:系统需具备高可用性,并能够根据数据量增长进行水平扩展。

3. 架构概述

采用MurmurHash3哈希算法将URL映射为哈希值,再利用Redis位图存储这些哈希值对应的位状态,以实现高效的去重操作。Redis位图的优势在于其内存效率高、位操作速度快,适合大规模数据的去重需求。

4. 技术选型

MurmurHash3

  • 特点
    • 高效的非加密哈希函数,适合大数据量处理。
    • 良好的散列分布性,减少哈希冲突。
    • 开源且易于实现。

Redis 位图(Bitmap)

  • 特点
    • 每个位只占用一个比特位,内存利用率高。
    • 支持高效的位操作,如设置、获取和统计。
    • 支持持久化和分布式部署。

Redisson客户端

  • 特点

    • 基于Redis的Java客户端,提供高级功能和分布式数据结构支持。
    • 支持异步操作、事务、分布式锁等。
    • 简化Redis操作,提升开发效率。

5. 系统架构设计

数据流与组件

  1. 数据接收模块:接收待去重的URL。
  2. 哈希计算模块:使用MurmurHash3将URL转换为哈希值。
  3. Redis位图模块:根据哈希值在Redis位图中进行设置和检查。
  4. 去重结果处理:根据Redis位图的检查结果,判断URL是否重复并进行相应处理。

6. Java实现细节

技术栈

  • 编程语言:Java
  • 哈希库 reids(提供MurmurHash3实现)
  • Redis客户端:Redisson

关键步骤

1. MurmurHash3 计算

使用Guava的Hashing库进行MurmurHash3计算。

java 复制代码
import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;
import java.nio.charset.StandardCharsets;

public class HashUtil {
    private static final HashFunction murmur3 = Hashing.murmur3_128();

    public static long computeHash(String url) {
        // 获取128位哈希值,并取前64位
        return murmur3.hashString(url, StandardCharsets.UTF_8).asLong();
    }
}

运行实例图:

2. 去重逻辑整合(Redis 位图操作------伪代码)
java 复制代码
public class RedisBitMapUtils {
    private RedissonClient redissonClient;
    private RBitSet test;

    private void  setUrlData(){

        test = redissonClient.getBitSet("url");
        for (int i = 0; i < 1000000; i++) {
            test.set(computeHash("https://www.baidu.com/" + i), true);
        }
    }

    private boolean isExist(long urlnum) {

        if (test.get(urlnum)) {
            return true;
        }
        return false;
    }


}

补充知识点分布式id生成:

java 复制代码
public class RedisIDUtils {
    private RedissonClient redisson;
    RIdGenerator generator = redisson.getIdGenerator( "shujie:id");
    RAtomicLong atomicLong = redisson.getAtomicLong("shujie:id");
    /**
     * 分布式id生成
     * @return
     */
    private long genIds(){
        //初始值及步长
        generator.tryInit(1,1000);
        //返回id
        return  generator.nextId();
    }

    /**
     * 自增id
     * @return
     */
    private long getAtomicId(){
        // 初始化计数器的起始值
        atomicLong.set(1);
        // 获取返回分布式主键
        return atomicLong.incrementAndGet();
    }
}

7. 总结

  • MurmurHash3 与 Redis 位图结合

    • 提供了一种高效、内存节省的数据去重方案。
    • 适用于大规模数据处理和高并发场景。
  • 关键优势

    • 高性能、低内存消耗、易于实现和扩展。
  • 应用场景

    • URL去重、日志去重、用户行为分析、实时数据统计等。

8. 附录:参考资料

  1. MurmurHash3 详解

  2. Redis 位图使用指南

  3. Redisson GitHub 仓库

  4. Google Guava Hashing

相关推荐
SuperW8 分钟前
Qt C++数据库实验
数据库
Json_1817901448018 分钟前
Alibaba国际站商品详情AP接口概述,json数据示例返回参考
大数据·数据库
♡喜欢做梦37 分钟前
【MySQL】聚合查询 和 分组查询
数据库·mysql
TDengine (老段)1 小时前
TDengine 订阅不到数据问题排查
java·数据库·tdengine
为美好的生活献上中指1 小时前
java每日精进 4.29【框架之自动记录日志并插入如数据库流程分析】
java·linux·数据库
不畏惧的少年1 小时前
Redis的底层数据结构
redis
我学上瘾了1 小时前
链表反转_leedcodeP206
网络·redis·链表
极小狐2 小时前
如何创建极狐GitLab 私密议题?
数据库·ci/cd·gitlab·devops·mcp
Seven972 小时前
缓存穿透的解决方式?—布隆过滤器
java·数据结构·redis