项目描述
最近做的一个项目有这么一个需求:需要生成一个唯一的11位的就餐码(类似于订单号的概念),就餐码的规则是:一共是11位的数字,前面6位是日期比如2019年07月20就是190720,后面五位是随机数且不能是自增的,不然容易让人看出一天的单量。
解决方案
五位随机数不能用随机生成的,不然可能不唯一,所以想到了预生成的方案:
采用redis
随机数生成
先生成10000~99999共9万个数(从1万开始是懒得再前面补0了),然后打乱分别 存入redis的list数据结构 90个key每个key存1000个数。取的时候通过LINDEX进行读取。
List numList=new ArrayList<>();
//90万个数 每个redis key 1000个数,要存90个key.
for (int i=10000;i<=99999;i++){
numList.add(String.valueOf(i));
}
//打乱顺序
Collections.shuffle(numList);
//生成key
for (int j=10;j<=99;j++){
String redisKey="qrcode:"+j;
List newList= test.subList((j-10)*1000,(j-10)*1000 + 1000);
jedisCluster.rpush(redisKey,newList.toArray(new String[newList.size()]));
}
这样每个key