redis事務如何解決超賣問題
更新時間:2024年11月05日 11:02:37 作者:路西法_Lucifer
使用Redis事務可以有效避免超賣問題,首先,通過MULTI命令開啟事務,將需要執(zhí)行的多個命令加入到事務中,然后通過EXEC命令提交事務,確保這些命令可以一次性、順序地執(zhí)行,在事務執(zhí)行期間,Redis服務器不會執(zhí)行其他客戶端的命令
redis事務解決超賣問題
Redis的事務提供了一種將多個命令請求打包,然后一次性、按順序性地執(zhí)行多個命令的機制。
在事務執(zhí)行期間,服務器不會中斷事務而去執(zhí)行其它客戶端的命令請求,它會將事務中的所有命令執(zhí)行完畢,然后才去處理其它客戶端的命令請求。
事務以MULTI命令開始,然后將多個命令放到事務當中,最后由EXEC命令將這個事務提交給服務器執(zhí)行。
1.引入相關jar包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.7.0</version> </dependency>
2.代碼段
package com.example.demo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.data.redis.core.RedisOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.SessionCallback; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.UUID; /** * @author lucifer * @description TODO * @date 2022-08-10 */ @RestController public class Controller { @Autowired RedisTemplate redisTemplate; //寫入緩存中,因為這里的模擬的是一個商品被多人搶,所以value值隨便吧 @GetMapping("/test1") public void test1(){ redisTemplate.opsForValue().set("item1",UUID.randomUUID().toString()); } //模擬多人搶一個商品,并且只有一件 @GetMapping("/test") public String test(){ //生成隨機的userid(模擬多用戶去搶一個商品) String userid=UUID.randomUUID().toString(); //redis key 商品id 為了模擬寫成1 String key="item"+1; //如果redis中不存在搶這個商品的緩存,就代表搶失敗 //商品獨一份 if(!redisTemplate.hasKey(key)){ throw new RuntimeException("你沒有搶到"); } //執(zhí)行redis的事務 redisTemplate.execute(new SessionCallback() { @Override public Object execute(RedisOperations operations) throws DataAccessException { //在使用multi()開始的事務期間觀察給定的修改key operations.watch(key); //標記事務塊的開始。 命令將被排隊 operations.multi(); //設置key-value operations.opsForValue().set(key,userid); //如果任何被監(jiān)視的key已被修改,則操作將失敗 return operations.exec(); } }); //刪除 避免這個商品被其他人搶到了 redisTemplate.delete(key); //todo....數據庫操作 return "你搶到了"; } }
3.測試
用50個線程并發(fā)去調用接口,模擬多人并發(fā)搶商品的功能;
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。