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

SpringBoot+Redis隊(duì)列實(shí)現(xiàn)Java版秒殺的示例代碼

 更新時(shí)間:2023年06月09日 09:41:01   作者:可樂(lè)漢堡cola  
本文主要介紹了SpringBoot+Redis隊(duì)列實(shí)現(xiàn)Java版秒殺的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

項(xiàng)目場(chǎng)景:

需求是做一個(gè)秒殺系統(tǒng),比如大家來(lái)?yè)?00臺(tái)手機(jī),先到先得。

解決方案:

這里用的是springboot的StringRedisTemplate

工具類:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import java.time.Duration;
import java.util.Collection;
@Service
public class RedisServiceImpl {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    //添加字符串并設(shè)置過(guò)期時(shí)間
    public void addString(String key, String value, Duration duration) {
        stringRedisTemplate.opsForValue().set(key, value, duration);
    }
    //查找字符串
    public String findString(String key) {
        return stringRedisTemplate.opsForValue().get(key);
    }
    //根據(jù)Key刪除
    public Boolean deleteByKey(String key) {
        return stringRedisTemplate.delete(key);
    }
    //在隊(duì)列尾部減少一個(gè)對(duì)象
    public String removeOneEntryOnListRight(String listName) {
        return stringRedisTemplate.opsForList().rightPop(listName);
    }
    //在隊(duì)列頭部新增對(duì)象
    public Long addEntriesOnListLeft(String listName, Collection<String> args) {
        return stringRedisTemplate.opsForList().leftPushAll(listName, args);
    }
}

主要使用的是最后兩個(gè)方法,最后一個(gè)方法,在隊(duì)列頭部新增對(duì)象,如果沒(méi)有這個(gè)隊(duì)列,他會(huì)創(chuàng)建出來(lái)這個(gè)隊(duì)列,然后將一個(gè)集合統(tǒng)統(tǒng)塞到這個(gè)redis隊(duì)列中。倒數(shù)第二個(gè)方法每調(diào)用一次,會(huì)刪除隊(duì)列中最后一個(gè)元素,然后返回這個(gè)元素的值,如果隊(duì)列中已經(jīng)沒(méi)有元素了(隊(duì)列已經(jīng)沒(méi)了)那么他會(huì)返回null,他們都是原子操作。

如此,每個(gè)請(qǐng)求都無(wú)需經(jīng)過(guò)加鎖操作,直接利用redis的單線程特性,即可實(shí)現(xiàn)高并發(fā)下的秒殺:請(qǐng)求到達(dá)redis,redis會(huì)逐個(gè)執(zhí)行,每一次執(zhí)行要么返回一個(gè)值,要么返回null。很顯然,返回值的就是搶到了,返回null的就是沒(méi)搶到。而且可以靈活的為這個(gè)隊(duì)列新加入一些元素(老板發(fā)話再加100臺(tái))或者直接把這個(gè)隊(duì)列刪了(老板說(shuō)不行,不賣了)都不會(huì)對(duì)代碼產(chǎn)生任何影響。

其中對(duì)應(yīng)的redis操作指令分別是:

  • 在隊(duì)列左側(cè)新增:lpush
  • 在隊(duì)列右側(cè)消費(fèi):rpop

在任務(wù)開始時(shí)向redis中插入一個(gè)大隊(duì)列

List<String> entriesList = new LinkedList<>();
   for (int i = 0; i < 100; i++){
       entriesList.add("某個(gè)商品");
   }
   redisService.addEntriesOnListLeft("隊(duì)列名",entriesList);

突然想到這個(gè)實(shí)現(xiàn)即使秒殺100臺(tái)不同型號(hào)的手機(jī)(并且在秒到時(shí)就通知用戶秒到的是啥),也不用改代碼。

每次秒殺執(zhí)行:

String redisResult = redisService.removeOneEntryOnListRight("隊(duì)列名");
    if (null == redisResult) {
        //說(shuō)明沒(méi)搶到
    }else{
 //說(shuō)明搶到了 執(zhí)行搶到邏輯
}

到此這篇關(guān)于SpringBoot+Redis隊(duì)列實(shí)現(xiàn)Java版秒殺的示例代碼的文章就介紹到這了,更多相關(guān)SpringBoot Redis秒殺內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • windows下JDK21安裝與環(huán)境變量配置完全指南(附詳細(xì)圖文)

    windows下JDK21安裝與環(huán)境變量配置完全指南(附詳細(xì)圖文)

    在Java開發(fā)前JDK是必不可少的環(huán)境,這篇文章主要介紹了windows下JDK21安裝與環(huán)境變量配置完全指南的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-04-04
  • 基于java.lang.IllegalArgumentException異常報(bào)錯(cuò)問(wèn)題及解決

    基于java.lang.IllegalArgumentException異常報(bào)錯(cuò)問(wèn)題及解決

    這篇文章主要介紹了基于java.lang.IllegalArgumentException異常報(bào)錯(cuò)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • IntelliJ IDEA代碼提示忽略大小寫的具體設(shè)置步驟

    IntelliJ IDEA代碼提示忽略大小寫的具體設(shè)置步驟

    在IDEA開發(fā)過(guò)程中,代碼補(bǔ)全功能是提升編碼效率的核心特性之一,默認(rèn)情況下,IDEA的代碼提示會(huì)嚴(yán)格匹配大小寫,這對(duì)于遵循命名規(guī)范的項(xiàng)目是合理的,然而,在某些場(chǎng)景下,開發(fā)者可能希望代碼提示忽略大小寫,以提升輸入靈活性,所以本文介紹了如何設(shè)置IDEA提示忽略大小寫
    2025-06-06
  • java中對(duì)象轉(zhuǎn)json字符串的三種常用方式

    java中對(duì)象轉(zhuǎn)json字符串的三種常用方式

    本文主要介紹了java中對(duì)象轉(zhuǎn)json字符串的三種常用方式,包含Jackson庫(kù),Gson庫(kù)和Hutool工具類這三種,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • Java中的WeakHashMap源碼分析

    Java中的WeakHashMap源碼分析

    這篇文章主要介紹了Java中的WeakHashMap源碼分析,WeakHashMap可能平時(shí)使用的頻率并不高,但是你可能聽過(guò)WeakHashMap會(huì)進(jìn)行自動(dòng)回收吧,下面就對(duì)其原理進(jìn)行分析,需要的朋友可以參考下
    2023-09-09
  • SpringBoot集成Mybatis的實(shí)現(xiàn)步驟

    SpringBoot集成Mybatis的實(shí)現(xiàn)步驟

    這篇文章主要介紹了SpringBoot集成Mybatis的實(shí)現(xiàn)步驟,本文通過(guò)SpringBoot +MyBatis 實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)學(xué)生表的查詢操作,需要的朋友可以參考下
    2020-12-12
  • 關(guān)于log4j日志擴(kuò)展---自定義PatternLayout

    關(guān)于log4j日志擴(kuò)展---自定義PatternLayout

    這篇文章主要介紹了關(guān)于log4j日志擴(kuò)展---自定義PatternLayout,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java靜態(tài)代理的含義及用法

    java靜態(tài)代理的含義及用法

    在本篇文章里小編給大家整理的是一篇關(guān)于java靜態(tài)代理的含義及用法,有需要的朋友們可以跟著學(xué)習(xí)參考下。
    2021-06-06
  • Springboot+Spring Security實(shí)現(xiàn)前后端分離登錄認(rèn)證及權(quán)限控制的示例代碼

    Springboot+Spring Security實(shí)現(xiàn)前后端分離登錄認(rèn)證及權(quán)限控制的示例代碼

    本文主要介紹了Springboot+Spring Security實(shí)現(xiàn)前后端分離登錄認(rèn)證及權(quán)限控制的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • springcloud如何配置文件加載順序

    springcloud如何配置文件加載順序

    這篇文章主要介紹了springcloud如何配置文件加載順序問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評(píng)論

平顺县| 来安县| 海门市| 丰都县| 博湖县| 泊头市| 大洼县| 谢通门县| 万载县| 八宿县| 苏尼特右旗| 凤冈县| 全椒县| 桃园市| 八宿县| 会昌县| 高平市| 绥阳县| 辰溪县| 宽甸| 永州市| 佛坪县| 安国市| 阜阳市| 江永县| 商河县| 泸溪县| 辰溪县| 东至县| 三穗县| 东兴市| 铜梁县| 微山县| 武平县| 涿鹿县| 固原市| 舟曲县| 合阳县| 德保县| 齐齐哈尔市| 招远市|