ホームページ  >  記事  >  データベース  >  Springboot が Redis を統合し、グローバルに一意のインデックス ID を生成する方法

Springboot が Redis を統合し、グローバルに一意のインデックス ID を生成する方法

PHPz
PHPz転載
2023-05-30 23:01:071533ブラウズ

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) が 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 を生成する方法

結果は次のとおりです。通常どおり、問題なく 2 秒で 1000 スレッドを実行できます。値

Springboot が Redis を統合し、グローバルに一意のインデックス ID を生成する方法

を繰り返し、10000 に変更してみてください。それでも 10000 に達します。各スレッドが入った後、このコードが使用されます counter.expire(KEY_EXPIRE_TIME, TimeUnit.SECONDS); このキーの有効期限はリセットされていますが、2 秒で 100,000 エントリを生成すれば十分です。有効期限をカスタマイズして短縮したり、システム業務に応じて増やす;

以上がSpringboot が Redis を統合し、グローバルに一意のインデックス ID を生成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。