最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot如何使用redis的incr創(chuàng)建分布式自增id

 更新時(shí)間:2022年11月19日 14:24:01   作者:有點(diǎn)兒困  
這篇文章主要介紹了springboot如何使用redis的incr創(chuàng)建分布式自增id,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

使用redis的incr創(chuàng)建分布式自增id

測試使用springboot加載類測試,使用本地redis, 模擬多線程去生成規(guī)律的自增id

@Component
public class Common implements CommandLineRunner {
? ? @Autowired
? ? private RedisTemplate redisTemplate;
?
? ? @Override
? ? public void run(String... args) throws Exception {
? ? ? ? long start = System.currentTimeMillis();
? ? ? ? Thread thread1 = new Thread(new Test1());
? ? ? ? Thread thread2 = new Thread(new Test1());
? ? ? ? Thread thread3 = new Thread(new Test1());
? ? ? ? thread1.start();
? ? ? ? thread2.start();
? ? ? ? thread3.start();
? ? ? ? long end = System.currentTimeMillis();
? ? ? ? System.out.println("耗時(shí):"+(end-start));
? ? }
?
? ? class Test1 implements Runnable{
?
? ? ? ? @Override
? ? ? ? public void run() {
? ? ? ? ? ? getId();
?
? ? ? ? }
?
? ? }
?
? ? public void getId(){
? ? ? ? synchronized (this) {
? ? ? ? ? ? RedisAtomicLong entityIdCounter = null;
?
? ? ? ? ? ? for(int i=0;i<10;i++){
? ? ? ? ? ? ? ? if(!redisTemplate.hasKey("ceid")){
? ? ? ? ? ? ? ? ? ? redisTemplate.opsForValue().increment("ceid", 1);
? ? ? ? ? ? ? ? ? ? System.out.println("test1使用redis緩存保存數(shù)據(jù)成功");
? ? ? ? ? ? ? ? ? ? entityIdCounter= new RedisAtomicLong("ceid", redisTemplate.getConnectionFactory());
? ? ? ? ? ? ? ? ? ? //incr 默認(rèn)初始值從0開始,
? ? ? ? ? ? ? ? ? ? //可以設(shè)置初始值,
? ? ? ? ? ? ? ? ? ? entityIdCounter.set(123);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? entityIdCounter=new RedisAtomicLong("ceid", redisTemplate.getConnectionFactory());
? ? ? ? ? ? ? ? long increment=0;
?
? ? ? ? ? ? ? ? increment = entityIdCounter.incrementAndGet();
? ? ? ? ? ? ? ? if (i == 5) {
? ? ? ? ? ? ? ? ? ? increment = entityIdCounter.decrementAndGet();
? ? ? ? ? ? ? ? ? ? System.out.println("test1:失敗,返回上個(gè)id");
? ? ? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? System.out.println(increment);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
?
? ? ? ? }
? ? }
?
}

redis配置在application.properties中

# REDIS
# Redis數(shù)據(jù)庫索引(默認(rèn)為0)
spring.redis.database=0 ?
# Redis服務(wù)器地址 (默認(rèn)為127.0.0.1)
spring.redis.host=127.0.0.1
# Redis服務(wù)器連接端口 (默認(rèn)為6379)
spring.redis.port=6379 ?
# Redis服務(wù)器連接密碼(默認(rèn)為空)
spring.redis.password= ?
# 連接超時(shí)時(shí)間(毫秒)
spring.redis.timeout=2000ms

springboot redis自增編號控制 踩坑

近段期間,公司 接手一個(gè)訂單號生成服務(wù),規(guī)則的話已經(jīng)由項(xiàng)目經(jīng)理他們規(guī)定好了,主要是后面的四位數(shù)代表的關(guān)于當(dāng)前訂單號已經(jīng)執(zhí)行第幾個(gè)了。而這里面有一個(gè)要求就是支持分布式。

為了實(shí)現(xiàn)這個(gè)東西,剛開始我使用了redis的incr來解決這個(gè)問題,因?yàn)槲覀兒蠖碎_發(fā)用的是Spring boot,所以我網(wǎng)上找了一個(gè)代碼如下:

/**
     *
     * @param key
     * @param liveTime
     * @return
     */
    public Long incr(String key, long liveTime) {
        RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
        Long increment = entityIdCounter.getAndIncrement();

        if ((null == increment || increment.longValue() == 0) && liveTime > 0) {//初始設(shè)置過期時(shí)間
            entityIdCounter.expire(liveTime, TimeUnit.SECONDS);
        }

        return increment;
    }

結(jié)果測試的時(shí)候,看著后面的數(shù)很滿意,心里面有點(diǎn)小小的激動哦~~

但是當(dāng)我將數(shù)據(jù)從小到大排序的時(shí)候,發(fā)現(xiàn)了一點(diǎn)異樣,即剛開始的幾個(gè)是存在問題的。

所以通過測試發(fā)現(xiàn)了,當(dāng)redis里面還沒有設(shè)置計(jì)時(shí)器的一剎那,分布式服務(wù)下,會存在前幾個(gè)重復(fù)的現(xiàn)象。

發(fā)現(xiàn)這個(gè)問題之后,于是我通過redis鎖,當(dāng)判斷redis下面還沒存在計(jì)數(shù)key的情況下,鎖住,然后在鎖住的情況下,其他人進(jìn)來調(diào)用的時(shí)候,線程睡眠500ms,然后再往下執(zhí)行。順利解決~~~

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決SpringBoot application.yaml文件配置schema 無法執(zhí)行sql問題

    解決SpringBoot application.yaml文件配置schema 無法執(zhí)行sql問題

    這篇文章主要介紹了解決SpringBoot application.yaml文件配置schema 無法執(zhí)行sql問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java防鎖屏小程序代碼實(shí)例

    Java防鎖屏小程序代碼實(shí)例

    這篇文章主要介紹了Java防鎖屏小程序代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • spring容器初始化遇到的死鎖問題解決

    spring容器初始化遇到的死鎖問題解決

    這篇文章主要給大家介紹了關(guān)于spring容器初始化時(shí)候遇到的死鎖問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • JAVA中跳出當(dāng)前多重嵌套循環(huán)的方法詳解

    JAVA中跳出當(dāng)前多重嵌套循環(huán)的方法詳解

    今天在看面試題時(shí),發(fā)現(xiàn)了這個(gè)問題,因?yàn)樵赑HP中跳出多次循環(huán)可以使用break數(shù)字來跳出多層循環(huán),但這在java中并不好使,這篇文章主要給大家介紹了關(guān)于JAVA中跳出當(dāng)前多重嵌套循環(huán)的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • java 數(shù)據(jù)結(jié)構(gòu)中棧結(jié)構(gòu)應(yīng)用的兩個(gè)實(shí)例

    java 數(shù)據(jù)結(jié)構(gòu)中棧結(jié)構(gòu)應(yīng)用的兩個(gè)實(shí)例

    這篇文章主要介紹了java 數(shù)據(jù)結(jié)構(gòu)中棧結(jié)構(gòu)應(yīng)用的兩個(gè)實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 帶你快速搞定java多線程(3)

    帶你快速搞定java多線程(3)

    這篇文章主要介紹了java多線程編程實(shí)例,分享了幾則多線程的實(shí)例代碼,具有一定參考價(jià)值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下
    2021-07-07
  • Mybatis-plus selectByMap條件查詢方式

    Mybatis-plus selectByMap條件查詢方式

    這篇文章主要介紹了Mybatis-plus selectByMap條件查詢方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java?設(shè)計(jì)模式以虹貓藍(lán)兔的故事講解簡單工廠模式

    Java?設(shè)計(jì)模式以虹貓藍(lán)兔的故事講解簡單工廠模式

    簡單工廠模式是屬于創(chuàng)建型模式,又叫做靜態(tài)工廠方法(Static Factory Method)模式,但不屬于23種GOF設(shè)計(jì)模式之一。簡單工廠模式是由一個(gè)工廠對象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例。簡單工廠模式是工廠模式家族中最簡單實(shí)用的模式,可以理解為是不同工廠模式的一個(gè)特殊實(shí)現(xiàn)
    2022-03-03
  • 詳解spring boot實(shí)現(xiàn)websocket

    詳解spring boot實(shí)現(xiàn)websocket

    這篇文章主要介紹了詳解spring boot實(shí)現(xiàn)websocket,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • java發(fā)送form-data請求實(shí)現(xiàn)文件上傳的示例代碼

    java發(fā)送form-data請求實(shí)現(xiàn)文件上傳的示例代碼

    最近做一個(gè)需求,需要請求第三方接口上傳文件,該請求類型是form-data請求,本文就來介紹一下java發(fā)送form-data請求實(shí)現(xiàn)文件上傳的示例代碼,感興趣的可以了解一下
    2023-12-12

最新評論

西畴县| 大埔县| 江源县| 普宁市| 叙永县| 天等县| 霍城县| 土默特左旗| 营口市| 新郑市| 上思县| 阳东县| 远安县| 闽侯县| 商洛市| 什邡市| 灌南县| 尉犁县| 宁乡县| 克什克腾旗| 九龙城区| 阿鲁科尔沁旗| 河津市| 成安县| 淮阳县| 慈溪市| 拜城县| 龙山县| 读书| 柳江县| 松溪县| 长海县| 宜宾县| 衡水市| 崇阳县| 新乐市| 五莲县| 宕昌县| 阳信县| 鹤山市| 阿勒泰市|