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

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

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

項目場景:

需求是做一個秒殺系統(tǒng),比如大家來搶100臺手機,先到先得。

解決方案:

這里用的是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è)置過期時間
    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);
    }
    //在隊列尾部減少一個對象
    public String removeOneEntryOnListRight(String listName) {
        return stringRedisTemplate.opsForList().rightPop(listName);
    }
    //在隊列頭部新增對象
    public Long addEntriesOnListLeft(String listName, Collection<String> args) {
        return stringRedisTemplate.opsForList().leftPushAll(listName, args);
    }
}

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

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

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

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

在任務(wù)開始時向redis中插入一個大隊列

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

突然想到這個實現(xiàn)即使秒殺100臺不同型號的手機(并且在秒到時就通知用戶秒到的是啥),也不用改代碼。

每次秒殺執(zhí)行:

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

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

相關(guān)文章

最新評論

新晃| 边坝县| 康马县| 金寨县| 丘北县| 普兰店市| 仁寿县| 安新县| 柘城县| 扬中市| 云霄县| 清涧县| 石棉县| 酉阳| 平果县| 洱源县| 定兴县| 长治县| 汾阳市| 沛县| 普陀区| 阿城市| 集贤县| 鄢陵县| 东光县| 潞西市| 安龙县| 高密市| 赣榆县| 乌拉特中旗| 陵川县| 乃东县| 吴川市| 绍兴县| 贵德县| 郑州市| 大丰市| 堆龙德庆县| 无极县| 罗江县| 怀仁县|