业务场景 比如说我们在秒杀中需要按天生成的订单号 但是此时只是生成这个订单号不需要做到将订单号入库 可以采用redis 实现
@Override
public String createOrderNo() {
try {
//默认1500,redis分布式基于不同的业务进行加锁
boolean islock = cacheImpl.lock(ConstantKeyConstant.REDIS_LOCK_ORDER + busInessType, null);
if (!islock)
throw new ServiceException(busInessType+"业务的订单创建出现错误,请稍后重试!");
String timeStr =LocalDate.now().toString().replaceAll("-","");
//组合出当天的Key
String redisKey = busInessType+"_"+timeStr;
//用当天的时间进行自增
Long noCount=stringRedisTemplate.opsForValue().increment(redisKey,1);
String orderNo ;
//预计每天订单不超过1百万单
int num = 1000000;
if( noCount < num){
orderNo = "000000" + noCount;
//补0操作
orderNo = orderNo.substring(orderNo.length()-6,orderNo.length());
}else{
orderNo = String.valueOf(noCount);
}
orderNo=timeStr+orderNo;
return orderNo;
} finally {
cacheImpl.unLock(ConstantKeyConstant.REDIS_LOCK_ORDER + busInessType);
}
}
private String generateSn(String key){
String timeStr = DateUtil.toString(new Date(),"yyyyMMdd");
//组合出当天的Key
String redisKey = key+"_"+timeStr;
//用当天的时间进行自增
Long snCount=stringRedisTemplate.opsForValue().increment(redisKey,1);
String sn ;
//预计每天订单不超过1百万单
int num = 1000000;
if( snCount < num){
sn = "000000" + snCount;
sn = sn.substring(sn.length()-6,sn.length());
}else{
sn = String.valueOf(snCount);
}
sn=timeStr+sn;
return sn;
}
// 可以传不同的作为缓存 比如订单 交易之类的 用于区分
当然、redisは翌日にクリアする必要があります
@Override
public void cleanCache() {
Date yesterday = getYesterday();
String timeStr = DateUtil.toString(yesterday,"yyyyMMdd");
stringRedisTemplate.delete(CachePrefix.TRADE_SN_CACHE_PREFIX.getPrefix()+"_"+timeStr);
stringRedisTemplate.delete(CachePrefix.ORDER_SN_CACHE_PREFIX.getPrefix()+"_"+timeStr);
}