<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) が 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 回実行:
結果は次のとおりです。通常どおり、問題なく 2 秒で 1000 スレッドを実行できます。値
を繰り返し、10000 に変更してみてください。それでも 10000 に達します。各スレッドが入った後、このコードが使用されます counter.expire(KEY_EXPIRE_TIME, TimeUnit.SECONDS); このキーの有効期限はリセットされていますが、2 秒で 100,000 エントリを生成すれば十分です。有効期限をカスタマイズして短縮したり、システム業務に応じて増やす;
以上がSpringboot が Redis を統合し、グローバルに一意のインデックス ID を生成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。