Home  >  Article  >  Database  >  How springboot integrates redis and generates a globally unique index ID

How springboot integrates redis and generates a globally unique index ID

PHPz
PHPzforward
2023-05-30 23:01:071485browse

springboot integrated redis

pom file

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

application.yaml file

spring:
  #redis 缓存
  redis:
     connect-timeout: 180000 #连接超时时间
    lettuce:
      pool:
        #连接池最大连接数
        max-active: 8
        #最大阻塞等待时间(负数表示没限制)
        max-wait: 1
        #连接池最大空闲连接
        max-idle: 5
        #连接池最小空闲连接
        min-idle: 0
    #单机模式
#    database: 0 # 集群模式该参数不生效
#    host: 127.0.0.1
#    port: 6379
    #集群模式开启
    cluster:
      nodes: 127.0.0.1:6379,127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003,127.0.0.1:7004,127.0.0.1:7005
      max-redirects: 3
    password:

Test verification

Call this interface and return 22, then integrate redis Success;

How springboot integrates redis and generates a globally unique index ID

redis generates a globally unique index ID

Using redis's RedisAtomicLong can generate a distributed self-increasing ID value; go directly to the code:

import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.wd.basic.common.support.component.CustomIdGenerator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;

import javax.annotation.Resource;

/**
 * mybatis 配置
 *
 * @author 上官婉儿
 * @date 2022/03/21
 */
@Slf4j
@Configuration
public class MybatisPlusConfig {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Bean
    public IdentifierGenerator idGenerator() {
        return new CustomIdGenerator(stringRedisTemplate);
    }
}

Since this tool class needs to be placed in the common package, MybatisPlusConfig is added to the calling system. When the project is started, the bean (stringRedisTemplate) is sent to the CustomIdGenerator (this is how I understand it, but it may not be explained this way)

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.wd.basic.common.exception.BasicException;
import com.wd.basic.common.exception.enums.IDGeneratorExceptionEnum;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.support.atomic.RedisAtomicLong;

import java.util.Date;
import java.util.Objects;
import java.util.concurrent.TimeUnit;

/**
 * 自定义id发电机
 *
 * @author 上官婉儿
 * @date 2022/03/21
 */
public class CustomIdGenerator {

    private static final String I_KEY_PREFIX = "IKey:generator";

    public static final int KEY_EXPIRE_TIME = 2;

    private final StringRedisTemplate stringRedisTemplate;

    public CustomIdGenerator(StringRedisTemplate stringRedisTemplate) {
        this.stringRedisTemplate = stringRedisTemplate;
    }

    /**
     * 年月日时分秒 +6位 redis返回的自增序列(如000001、000002、000003...)
     * redis返回的自增序列 规则:
     * 根据传入的 key(相当于字段名)生成自增的序列,2s后重新自增;
     * 由于redis的incr原子性,也能保证每次返回的结果不会出现相同的值,
     */
    @Override
    public String nextUUID(Object entity) {
        String bizKey = entity.getClass().getName();
        String dateStr = DateUtil.format(new Date(), DatePattern.PURE_DATETIME_MS_FORMATTER);
        RedisAtomicLong counter = new RedisAtomicLong(I_KEY_PREFIX + bizKey, Objects.requireNonNull(stringRedisTemplate.getConnectionFactory()));
        counter.expire(KEY_EXPIRE_TIME, TimeUnit.SECONDS);
        long redisId = counter.incrementAndGet();
        String redisIdStr = StrUtil.fillBefore(String.valueOf(redisId), &#39;0&#39;,6);
        return dateStr + redisIdStr;
    }
}

Test verification

Start 10 threads and run 1000 times:

How springboot integrates redis and generates a globally unique index ID

The results are as follows, you can run 1000 threads in 2 seconds as usual without any problem Repeat the value

How springboot integrates redis and generates a globally unique index ID

and try changing it to 10000. It still reaches 10000. It turns out that after each thread enters, it uses this code counter.expire(KEY_EXPIRE_TIME, TimeUnit.SECONDS); The expiration time of this key has been reset, but generating 100,000 entries in 2 seconds is enough. You can customize the expiration time to shorten or increase it according to the system business;

The above is the detailed content of How springboot integrates redis and generates a globally unique index ID. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:yisu.com. If there is any infringement, please contact admin@php.cn delete