使用Redis的自增长功能来生成一个比上一个编码+1的新编码,同时使用synchroiniezd来解决并发问题,并考虑Redis宕机和Key过期时缓存重构的问题
同时这段代码具有通用性,可以为这一系列问题提供解决思路
//处理并发
private synchronized String codeGenerate(String codeRedisKey,String codePrefix) {
Long num = 0L;
Object value = redisTemplate.opsForValue().get(codeRedisKey);
if (value == null) {
//如果key因为过期 宕机等问题时需要取最大值来重构缓存
String maxCode = getBaseMapper().selectMaxCode();
if (StringUtils.isNotBlank(maxCode)) {
num = Long.parseLong(maxCode.substring(codePrefix.length()));
}
redisTemplate.opsForValue().set(codeRedisKey, num, 1, TimeUnit.DAYS);
}
// redis自增长
num = redisTemplate.opsForValue().increment(codeRedisKey);
String index = String.format("%06d", num);
return codePrefix + index;
}