>  기사  >  데이터 베이스  >  springboot가 redis를 통합하고 전역적으로 고유한 인덱스 ID를 생성하는 방법

springboot가 redis를 통합하고 전역적으로 고유한 인덱스 ID를 생성하는 방법

PHPz
PHPz앞으로
2023-05-30 23:01:071484검색

springboot는 redis

pom 파일을 통합합니다

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

application.yaml 파일

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:

테스트 확인

이 인터페이스를 호출하고 22를 반환하면 redis 통합이 성공합니다.

springboot가 redis를 통합하고 전역적으로 고유한 인덱스 ID를 생성하는 방법

redis는 전역적으로 고유한 인덱스 ID를 생성합니다

redis RedisAtomicLong을 사용하면 분산된 자체 증가 ID 값을 생성할 수 있습니다.

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);
    }
}

이 도구 클래스를 공통 패키지에 배치해야 하므로 호출 시스템에 MybatisPlusConfig를 추가하고 프로젝트가 시작되면 bean (stringRedisTemplate) to In CustomIdGenerator (이렇게 이해하지만 이렇게 설명하지 않을 수도 있습니다)

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

테스트 확인

10개의 스레드를 시작하고 1000번 실행합니다.

springboot가 redis를 통합하고 전역적으로 고유한 인덱스 ID를 생성하는 방법

결과는 다음과 같습니다. 2s can 중복된 값 없이 평소대로 1000개의 항목을 실행하세요

springboot가 redis를 통합하고 전역적으로 고유한 인덱스 ID를 생성하는 방법

10000으로 변경해봐도 여전히 10000에 도달합니다. 각 스레드가 들어간 후 이 코드를 사용하여 재설정하는 것으로 나타났습니다. 이 키의 만료 시간은 2초로 충분합니다. 시스템 비즈니스에 따라 만료 시간을 사용자 정의하거나 늘릴 수 있습니다.

위 내용은 springboot가 redis를 통합하고 전역적으로 고유한 인덱스 ID를 생성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제