Redis实现全局唯一id生成
Redis实现全局唯一id生成
废话不多说直接上代码importorg。springframework。beans。factory。annotation。Autowired;importorg。springframework。data。redis。core。RedisTemplate;importorg。springframework。stereotype。Component;importorg。springframework。util。Assert;importjava。time。LocalDate;importjava。time。format。DateTimeFormatter;importjava。util。Calendar;importjava。util。concurrent。TimeUnit;描述:唯一ID生成器authorjimmycreate2020110616:06ComponentpublicclassGenerateIDUtil{AutowiredprivateRedisTemplateredisTemplate;生成每天的初始IdparamkeyreturnpublicStringinitPrimaryId(Stringkey){Assert。hasLength(key,hashName不能为空);StringhashColLocalDate。now()。format(DateTimeFormatter。ofPattern(yyyyMMdd));自定义编号规则StringhashColValhashCol00001;redisTemplate。opsForHash()。putIfAbsent(hashName,hashCol,hashColVal);LongexpiresTimegetSecondsNextEarlyMorning();redisTemplate。opsForValue()。set(key,Long。valueOf(hashColVal),expiresTime,TimeUnit。SECONDS);returnhashColVal;}获取分布式IdparamkeyreturnpublicStringgetPrimaryId(Stringkey){Stringid;if(redisTemplate。hasKey(key)){redisTemplate。opsForValue()。get(key);redisTemplate。delete(key);idString。valueOf(redisTemplate。opsForValue()。increment(key,1));}else{idinitPrimaryId(key);}returnid;}判断当前时间距离第二天凌晨的秒数return返回值单位为〔s:秒〕publicLonggetSecondsNextEarlyMorning(){CalendarcalCalendar。getInstance();cal。add(Calendar。DAYOFYEAR,1);cal。set(Calendar。HOUROFDAY,0);cal。set(Calendar。SECOND,0);cal。set(Calendar。MINUTE,0);cal。set(Calendar。MILLISECOND,0);return(cal。getTimeInMillis()System。currentTimeMillis())1000;}}
写法很简单,没什么可说的。