Redission 实现全局自增ID案例记录

一、依赖和yaml配置

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
        <groupId>org.redisson</groupId>
        <artifactId>redisson</artifactId>
        <version>3.15.3</version>
</dependency>
spring:
  redis:
    # TODO 密码
    password: 1234567890
    sentinel:
      # TODO 集群名
      master: mymaster
      # TODO 集群
      nodes:
        - 192.168.125.125:8190
        - 192.168.125.125:8191
        - 192.168.125.125:8192

二、RedisConfig

@Configuration
public class RedisConfig {

    @Value("${spring.application.name}")
    private String serverName;

    @Bean
    public RedissonClient redisson(RedisProperties redisProperties){

        Config config = new Config();
        if (redisProperties.getSentinel() != null) {
            SentinelServersConfig sentinelServersConfig =  config.useSentinelServers();
            sentinelServersConfig.setMasterName(redisProperties.getSentinel().getMaster());
            sentinelServersConfig.setPassword(redisProperties.getPassword());
            for (String node : redisProperties.getSentinel().getNodes()) {
                sentinelServersConfig.addSentinelAddress("redis://"+node);
            }
            sentinelServersConfig.setKeepAlive(true);
            sentinelServersConfig.setDatabase(redisProperties.getDatabase());
            sentinelServersConfig.setMasterConnectionMinimumIdleSize(10);
            sentinelServersConfig.setSlaveConnectionMinimumIdleSize(10);
            sentinelServersConfig.setMasterConnectionPoolSize(getMaxActive(redisProperties));
            sentinelServersConfig.setSlaveConnectionPoolSize(getMaxActive(redisProperties));
            sentinelServersConfig.setTimeout(getTimeout(redisProperties));
            sentinelServersConfig.setClientName(serverName);
            sentinelServersConfig.setCheckSentinelsList(false);

        }else{

            SingleServerConfig singleServerConfig = config.useSingleServer();
            singleServerConfig.setAddress("redis://"+redisProperties.getHost()+":"+redisProperties.getPort());
            singleServerConfig.setPassword(redisProperties.getPassword());
            singleServerConfig.setKeepAlive(true);
            singleServerConfig.setDatabase(redisProperties.getDatabase());
            singleServerConfig.setClientName(serverName);
        }

        return Redisson.create(config);
    }


    private int getTimeout(RedisProperties redisProperties){

        int timeout = 1000;
        if (null != redisProperties.getLettuce() && null != redisProperties.getLettuce().getPool() && null != redisProperties.getLettuce().getPool().getMaxWait() ) {
            timeout = (int) redisProperties.getLettuce().getPool().getMaxWait().toMillis();
        }

        if (null != redisProperties.getJedis() && null != redisProperties.getJedis().getPool() && null != redisProperties.getJedis().getPool().getMaxWait()) {
            timeout = (int) redisProperties.getJedis().getPool().getMaxWait().toMillis();
        }



        return timeout;
    }


    private int getMaxActive(RedisProperties redisProperties){
        int macActive = 50;

        if (null != redisProperties.getLettuce() && null != redisProperties.getLettuce().getPool() &&redisProperties.getLettuce().getPool().getMaxActive() > 0) {
            macActive = redisProperties.getLettuce().getPool().getMaxActive();
        }

        if (null != redisProperties.getJedis() && null != redisProperties.getJedis().getPool() && redisProperties.getJedis().getPool().getMaxActive() > 0) {
            macActive = redisProperties.getJedis().getPool().getMaxActive();
        }

        return macActive;
    }

三、IdUtils

/**
 * 流程ID生成器
 *
 * @author lvzb
 * @date 2022/08/18  19:06
 **/
@Slf4j
@Component
public class IdUtils {

    @Autowired
    private RedissonClient client;

    /**
     * 服务前缀
     */
    public static final String SERVER_PREFIX = "DEM_";

    public static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");

    public String nextId(String prefix) {
        prefix = prefix != null ? prefix : "FL";

        String now = LocalDate.now().format(DATE_TIME_FORMATTER);
        prefix = prefix.concat(now);
        String key = SERVER_PREFIX.concat(prefix);
        // 通过redis的自增获取序号
        RAtomicLong atomicLong = client.getAtomicLong(key);
        // 设置到期时间1天
        atomicLong.expire(1, TimeUnit.DAYS);
        long num = atomicLong.incrementAndGet();
        // num不够5位数时左补齐0
        return String.format(prefix.concat("%05d"), num);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值