您好,登錄后才能下訂單哦!
本篇內容主要講解“springboot集成redis并生成全局唯一索引ID的方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“springboot集成redis并生成全局唯一索引ID的方法”吧!
<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); } }
由于此工具類需要放在 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并生成全局唯一索引ID的方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。