首頁 > 軟體

springboot整合redis並使用redis生成全域性唯一索引ID

2022-03-28 19:00:52

部署redis

Windows下搭建Reids本地叢集,可參考https://www.jb51.net/article/242520.htm

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成功;

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

由於此工具類需要放在 common包,所以在呼叫系統上新增 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次:

結果如下,2s可以照常跑1000條完無重複值

改成10000試試, 還是跑到了 10000,原來是 每一條執行緒進去後,走這個程式碼 counter.expire(KEY_EXPIRE_TIME, TimeUnit.SECONDS);將這個key的失效時間重新設定了一下,不過2s生成100000條已經夠用了,大家可以根據系統業務,自定義縮短或增加失效時間;

 到此這篇關於springboot整合redis並使用redis生成全域性唯一索引ID的文章就介紹到這了,更多相關springboot redis生成全域性唯一索引ID內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com