<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
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 통합이 성공합니다.
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), '0',6); return dateStr + redisIdStr; } }
10개의 스레드를 시작하고 1000번 실행합니다.
결과는 다음과 같습니다. 2s can 중복된 값 없이 평소대로 1000개의 항목을 실행하세요
10000으로 변경해봐도 여전히 10000에 도달합니다. 각 스레드가 들어간 후 이 코드를 사용하여 재설정하는 것으로 나타났습니다. 이 키의 만료 시간은 2초로 충분합니다. 시스템 비즈니스에 따라 만료 시간을 사용자 정의하거나 늘릴 수 있습니다.
위 내용은 springboot가 redis를 통합하고 전역적으로 고유한 인덱스 ID를 생성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!