springboot集成redis并使用redis生成全局唯一索引ID
部署redis
Windows下搭建Reids本地集群,可參考http://m.fzitv.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包,所以在調用系統(tǒng)上新增 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發(fā)電機
*
* @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返回的自增序列 規(guī)則:
* 根據傳入的 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條已經夠用了,大家可以根據系統(tǒng)業(yè)務,自定義縮短或增加失效時間;
到此這篇關于springboot集成redis并使用redis生成全局唯一索引ID的文章就介紹到這了,更多相關springboot redis生成全局唯一索引ID內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
IDEA2021.2配置docker如何將springboot項目打成鏡像一鍵發(fā)布部署
這篇文章主要介紹了IDEA2021.2配置docker如何將springboot項目打成鏡像一鍵發(fā)布部署,本文圖文實例相結合給大家介紹的非常詳細,需要的朋友可以參考下2021-09-09

