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;
//添加字符串并設置過期時間
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)生任何影響。
其中對應的redis操作指令分別是:
- 在隊列左側(cè)新增:lpush
- 在隊列右側(cè)消費:rpop
在任務開始時向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í)行搶到邏輯
}到此這篇關于SpringBoot+Redis隊列實現(xiàn)Java版秒殺的示例代碼的文章就介紹到這了,更多相關SpringBoot Redis秒殺內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- 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)
相關文章
Java Instrumentation從概念到基本用法詳解
Java Instrumentation是java.lang.instrument包提供的 API,允許開發(fā)者在類被JVM 加載時對其進行修改,或者在運行時重新定義類的字節(jié)碼,本文給大家介紹Java Instrumentation從概念到基本用法詳解,感興趣的朋友一起看看吧2025-09-09
Spring的@Autowired加到接口上但獲取的是實現(xiàn)類的問題
這篇文章主要介紹了Spring的@Autowired加到接口上但獲取的是實現(xiàn)類的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10
Java實現(xiàn)base64圖片編碼數(shù)據(jù)轉(zhuǎn)換為本地圖片的方法
這篇文章主要介紹了Java實現(xiàn)base64圖片編碼數(shù)據(jù)轉(zhuǎn)換為本地圖片的方法,涉及java編碼轉(zhuǎn)換及圖片文件生成相關操作技巧,需要的朋友可以參考下2018-06-06
Java線程池運行狀態(tài)監(jiān)控實現(xiàn)解析
這篇文章主要介紹了Java線程池運行狀態(tài)監(jiān)控實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-10-10
SpringBoot加載SQLite數(shù)據(jù)源方式
文章介紹了SpringBoot中配置SQLite數(shù)據(jù)源的流程,包括DBeaver連接數(shù)據(jù)庫、執(zhí)行建表與數(shù)據(jù)插入、引入依賴、初始化連接、定義實體類與Mapper,以及測試查詢操作,同時提及多數(shù)據(jù)源適配的擴展方式2025-09-09
SpringBoot實現(xiàn)文件記錄日志及日志文件自動歸檔和壓縮
Logback是Java日志框架,通過Logger收集日志并經(jīng)Appender輸出至控制臺、文件等,SpringBoot配置logback-spring.xml可實現(xiàn)日志文件存儲,本文給大家介紹了SpringBoot實現(xiàn)文件記錄日志及日志文件自動歸檔和壓縮,需要的朋友可以參考下2025-05-05

