溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

springboot集成redis并生成全局唯一索引ID的方法

發(fā)布時(shí)間:2022-03-29 09:12:29 來(lái)源:億速云 閱讀:514 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容主要講解“springboot集成redis并生成全局唯一索引ID的方法”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“springboot集成redis并生成全局唯一索引ID的方法”吧!

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 #連接超時(shí)時(shí)間
    lettuce:
      pool:
        #連接池最大連接數(shù)
        max-active: 8
        #最大阻塞等待時(shí)間(負(fù)數(shù)表示沒(méi)限制)
        max-wait: 1
        #連接池最大空閑連接
        max-idle: 5
        #連接池最小空閑連接
        min-idle: 0
    #單機(jī)模式
#    database: 0 # 集群模式該參數(shù)不生效
#    host: 127.0.0.1
#    port: 6379
    #集群模式開(kāi)啟
    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:

測(cè)試驗(yàn)證

調(diào)用該接口,返回 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);
    }
}

由于此工具類需要放在 common包,所以在調(diào)用系統(tǒng)上新增 MybatisPlusConfig,在項(xiàng)目啟動(dòng)時(shí)候,將bean(stringRedisTemplate)送進(jìn)到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發(fā)電機(jī)
 *
 * @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;
    }

    /**
     * 年月日時(shí)分秒 +6位 redis返回的自增序列(如000001、000002、000003...)
     * redis返回的自增序列 規(guī)則:
     * 根據(jù)傳入的 key(相當(dāng)于字段名)生成自增的序列,2s后重新自增;
     * 由于redis的incr原子性,也能保證每次返回的結(jié)果不會(huì)出現(xiàn)相同的值,
     */
    @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;
    }
}

測(cè)試驗(yàn)證

開(kāi)始10個(gè)線程,跑1000次:

springboot集成redis并生成全局唯一索引ID的方法

結(jié)果如下,2s可以照常跑1000條完無(wú)重復(fù)值

springboot集成redis并生成全局唯一索引ID的方法

改成10000試試, 還是跑到了 10000,原來(lái)是 每一條線程進(jìn)去后,走這個(gè)代碼 counter.expire(KEY_EXPIRE_TIME, TimeUnit.SECONDS);將這個(gè)key的失效時(shí)間重新設(shè)置了一下,不過(guò)2s生成100000條已經(jīng)夠用了,大家可以根據(jù)系統(tǒng)業(yè)務(wù),自定義縮短或增加失效時(shí)間;

到此,相信大家對(duì)“springboot集成redis并生成全局唯一索引ID的方法”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI