个人技术分享

使用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;
}