SpringBoot+Redis隊列實現(xiàn)Java版秒殺的示例代碼
項目場景:
需求是做一個秒殺系統(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)文章希望大家以后多多支持腳本之家!
- Springboot+redis+Vue實現(xiàn)秒殺的項目實踐
- springboot?+rabbitmq+redis實現(xiàn)秒殺示例
- SpringBoot+RabbitMQ+Redis實現(xiàn)商品秒殺的示例代碼
- 基于Redis結(jié)合SpringBoot的秒殺案例詳解
- SpringBoot之使用Redis實現(xiàn)分布式鎖(秒殺系統(tǒng))
- SpringBoot使用Redisson實現(xiàn)分布式鎖(秒殺系統(tǒng))
- springboot集成redis實現(xiàn)簡單秒殺系統(tǒng)
- 基于SpringBoot+Redis+Lua 實現(xiàn)高并發(fā)秒殺系統(tǒng)
相關(guān)文章
windows下JDK21安裝與環(huán)境變量配置完全指南(附詳細圖文)
在Java開發(fā)前JDK是必不可少的環(huán)境,這篇文章主要介紹了windows下JDK21安裝與環(huán)境變量配置完全指南的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2026-04-04
基于java.lang.IllegalArgumentException異常報錯問題及解決
這篇文章主要介紹了基于java.lang.IllegalArgumentException異常報錯問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
IntelliJ IDEA代碼提示忽略大小寫的具體設(shè)置步驟
在IDEA開發(fā)過程中,代碼補全功能是提升編碼效率的核心特性之一,默認情況下,IDEA的代碼提示會嚴格匹配大小寫,這對于遵循命名規(guī)范的項目是合理的,然而,在某些場景下,開發(fā)者可能希望代碼提示忽略大小寫,以提升輸入靈活性,所以本文介紹了如何設(shè)置IDEA提示忽略大小寫2025-06-06
SpringBoot集成Mybatis的實現(xiàn)步驟
這篇文章主要介紹了SpringBoot集成Mybatis的實現(xiàn)步驟,本文通過SpringBoot +MyBatis 實現(xiàn)對數(shù)據(jù)庫學(xué)生表的查詢操作,需要的朋友可以參考下2020-12-12
關(guān)于log4j日志擴展---自定義PatternLayout
這篇文章主要介紹了關(guān)于log4j日志擴展---自定義PatternLayout,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
Springboot+Spring Security實現(xiàn)前后端分離登錄認證及權(quán)限控制的示例代碼
本文主要介紹了Springboot+Spring Security實現(xiàn)前后端分離登錄認證及權(quán)限控制的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11

