黑名单如果上到一定规模,比如百万级别,其他的设计思路

  1. 布隆过滤器(Bloom Filter):

    原理:使用多个哈希函数和一个位数组来表示一个集合,快速判断元素是否可能在集合中。 优点:空间效率高,查询速度快。
    缺点:存在一定的误判率。 适用场景:需要快速判断元素是否在黑名单中,且可以容忍一定误判率的场景。
    示例:反垃圾邮件系统中,快速判断邮件地址是否可能是垃圾邮件地址。

import java.util.BitSet;
import java.util.Random;

public class BloomFilter {
    private static final int DEFAULT_SIZE = 2 << 24; // 布隆过滤器的位数组大小
    private static final int[] SEEDS = new int[]{3, 5, 7, 11, 13, 17, 19, 23, 29, 31}; // 哈希函数的种子
    private BitSet bits = new BitSet(DEFAULT_SIZE);
    private SimpleHash[] func = new SimpleHash[SEEDS.length];

    public BloomFilter() {
        for (int i = 0; i < SEEDS.length; i++) {
            func[i] = new SimpleHash(DEFAULT_SIZE, SEEDS[i]);
        }
    }

    // 添加元素到布隆过滤器
    public void add(String value) {
        for (SimpleHash f : func) {
            bits.set(f.hash(value), true);
        }
    }

    // 判断元素是否可能在布隆过滤器中
    public boolean contains(String value) {
        if (value == null) {
            return false;
        }
        boolean ret = true;
        for (SimpleHash f : func) {
            ret = ret && bits.get(f.hash(value));
        }
        return ret;
    }

    // 哈希函数类
    public static class SimpleHash {
        private int cap;
        private int seed;

        public SimpleHash(int cap, int seed) {
            this.cap = cap;
            this.seed = seed;
        }

        // 计算哈希值
        public int hash(String value) {
            int result = 0;
            int len = value.length();
            for (int i = 0; i < len; i++) {
                result = seed * result + value.charAt(i);
            }
            return (cap - 1) & result;
        }
    }

    public static void main(String[] args) {
        BloomFilter bloomFilter = new BloomFilter();
        bloomFilter.add("hello");
        bloomFilter.add("world");

        System.out.println(bloomFilter.contains("hello")); // 输出: true
        System.out.println(bloomFilter.contains("world")); // 输出: true
        System.out.println(bloomFilter.contains("java"));  // 输出: false
    }
}

  1. 分布式缓存:

    原理:使用分布式缓存(如Redis)存储黑名单数据,提供快速的查询性能。 优点:查询速度快,支持高并发,可以水平扩展。
    缺点:需要额外的缓存服务器,增加系统复杂性和成本。 适用场景:需要快速查询黑名单,且对查询性能有较高要求的场景。
    示例:实时风控系统中,快速查询用户是否在黑名单中。
    在这里插入图片描述

  2. 分片(Sharding):

    原理:将黑名单数据分片存储在多个数据库或缓存节点上,提高查询性能和系统可扩展性。 优点:提高查询性能,支持高并发,可以水平扩展。
    缺点:需要设计和实现分片逻辑,增加系统复杂性。 适用场景:黑名单数据量巨大,且需要高并发查询的场景。
    示例:大型社交平台中,存储和管理用户黑名单。

  3. 倒排索引(Inverted Index):

    原理:将黑名单中的每个元素作为索引项,快速查找包含该元素的记录。 优点:查询速度快,适用于大规模数据集。
    缺点:需要额外的索引构建和维护成本。 适用场景:黑名单数据量巨大,且需要快速查找包含特定元素的记录的场景。
    示例:内容过滤系统中,快速查找包含特定敏感词的文档。

import java.util.*;

public class UserBlacklistIndex {
    private Set<String> blacklist = new HashSet<>();

    // 添加用户到黑名单
    public void addToBlacklist(String userId) {
        blacklist.add(userId);
    }

    // 检查用户是否在黑名单中
    public boolean isBlacklisted(String userId) {
        return blacklist.contains(userId);
    }

    public static void main(String[] args) {
        UserBlacklistIndex blacklistIndex = new UserBlacklistIndex();

        // 添加用户到黑名单
        blacklistIndex.addToBlacklist("user1");
        blacklistIndex.addToBlacklist("user3");

        // 检查用户是否在黑名单中
        System.out.println("User1 is blacklisted: " + blacklistIndex.isBlacklisted("user1")); // 输出: true
        System.out.println("User2 is blacklisted: " + blacklistIndex.isBlacklisted("user2")); // 输出: false
        System.out.println("User3 is blacklisted: " + blacklistIndex.isBlacklisted("user3")); // 输出: true
    }
}

  1. 哈希表(Hash Table):

    原理:使用哈希函数将键映射到数组中的一个位置,实现常数时间的查找性能。 优点:查询速度快,适用于需要快速查找的场景。
    缺点:存储空间较大,数据量巨大时可能面临哈希冲突问题。 适用场景:黑名单数据量较大,且需要快速查找的场景。
    示例:用户认证系统中,快速查找用户是否在黑名单中。

import java.util.HashMap;
import java.util.Map;

public class BlacklistHashTable {
    private Map<String, Boolean> blacklist = new HashMap<>();

    // 添加用户到黑名单
    public void addToBlacklist(String userId) {
        blacklist.put(userId, true);
    }

    // 检查用户是否在黑名单中
    public boolean isBlacklisted(String userId) {
        return blacklist.containsKey(userId);
    }

    public static void main(String[] args) {
        BlacklistHashTable blacklistHashTable = new BlacklistHashTable();

        // 添加用户到黑名单
        blacklistHashTable.addToBlacklist("user1");
        blacklistHashTable.addToBlacklist("user3");

        // 检查用户是否在黑名单中
        System.out.println("User1 is blacklisted: " + blacklistHashTable.isBlacklisted("user1")); // 输出: true
        System.out.println("User2 is blacklisted: " + blacklistHashTable.isBlacklisted("user2")); // 输出: false
        System.out.println("User3 is blacklisted: " + blacklistHashTable.isBlacklisted("user3")); // 输出: true
    }
}

在实际应用中,可以根据具体的需求和场景选择合适的设计思路,并结合多种方法来实现高效的黑名单管理和查询。

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

@淡 定

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

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

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

打赏作者

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

抵扣说明:

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

余额充值