随机的条件比较好实现。
问题的关键是高并发下怎么产生唯一的字符串
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;
}