高并发下产生大量,随机,唯一的字符串,并输出到文件中

随机的条件比较好实现。
问题的关键是高并发下怎么产生唯一的字符串

1、由于需要判重且数量较大,所以选用Bloom Filter。
BloomFilter的特点是:
如果Bloom Filter判断一条记录不存在,则它一定不存在;
如果Bloom Filter判断一条记录存在,则它可能存在,也可能不存在。
我们只要不存在的记录,所以可以使用Bloom Filter

2、加锁
假设线程A和B同时产生"4InLove"字符串,且通过Bloom Filter判断没有产生过,那么就有可能将重复的两个数据输出到文件中,
所以需要加锁进行判断

以下是关键代码:

//用来判断是否产生过这个字符串
public static boolean putIfNotContain(String str){

        lock.lock();
        boolean flag = false;
        try {
            if(!bloomFilter.mightContain(str)){
                bloomFilter.put(str);
                flag = true;
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
        return flag;
    }

//产生字符串时需要判断
public static String getRandomActivationCode(int length) {
        String code = StringUtils.upperCase(YxStringUtils.randomString(length));
        while (!GenarateUniqueActivationCode.putIfNotContain(code)) {
            code = StringUtils.upperCase(YxStringUtils.randomString(length));
        }
        return code;
    }

posted on 2016-12-10 16:39  bendantuohai  阅读(461)  评论(0编辑  收藏  举报