redis事務(wù)如何解決超賣問題
redis事務(wù)解決超賣問題
Redis的事務(wù)提供了一種將多個(gè)命令請(qǐng)求打包,然后一次性、按順序性地執(zhí)行多個(gè)命令的機(jī)制。
在事務(wù)執(zhí)行期間,服務(wù)器不會(huì)中斷事務(wù)而去執(zhí)行其它客戶端的命令請(qǐng)求,它會(huì)將事務(wù)中的所有命令執(zhí)行完畢,然后才去處理其它客戶端的命令請(qǐng)求。
事務(wù)以MULTI命令開始,然后將多個(gè)命令放到事務(wù)當(dāng)中,最后由EXEC命令將這個(gè)事務(wù)提交給服務(wù)器執(zhí)行。
1.引入相關(guān)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;
//寫入緩存中,因?yàn)檫@里的模擬的是一個(gè)商品被多人搶,所以value值隨便吧
@GetMapping("/test1")
public void test1(){
redisTemplate.opsForValue().set("item1",UUID.randomUUID().toString());
}
//模擬多人搶一個(gè)商品,并且只有一件
@GetMapping("/test")
public String test(){
//生成隨機(jī)的userid(模擬多用戶去搶一個(gè)商品)
String userid=UUID.randomUUID().toString();
//redis key 商品id 為了模擬寫成1
String key="item"+1;
//如果redis中不存在搶這個(gè)商品的緩存,就代表搶失敗
//商品獨(dú)一份
if(!redisTemplate.hasKey(key)){
throw new RuntimeException("你沒有搶到");
}
//執(zhí)行redis的事務(wù)
redisTemplate.execute(new SessionCallback() {
@Override
public Object execute(RedisOperations operations) throws DataAccessException {
//在使用multi()開始的事務(wù)期間觀察給定的修改key
operations.watch(key);
//標(biāo)記事務(wù)塊的開始。 命令將被排隊(duì)
operations.multi();
//設(shè)置key-value
operations.opsForValue().set(key,userid);
//如果任何被監(jiān)視的key已被修改,則操作將失敗
return operations.exec();
}
});
//刪除 避免這個(gè)商品被其他人搶到了
redisTemplate.delete(key);
//todo....數(shù)據(jù)庫操作
return "你搶到了";
}
}3.測(cè)試
用50個(gè)線程并發(fā)去調(diào)用接口,模擬多人并發(fā)搶商品的功能;


總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Redis存儲(chǔ)斷點(diǎn)續(xù)傳文件狀態(tài)的最佳實(shí)踐
在斷點(diǎn)續(xù)傳系統(tǒng)中,如何高效地存儲(chǔ)和更新文件上傳狀態(tài)是關(guān)鍵,得益于 Redis 高效的內(nèi)存操作和多種數(shù)據(jù)結(jié)構(gòu)的支持,它非常適合用于存儲(chǔ)上傳過程中的臨時(shí)狀態(tài)信息,下面,我們將探討如何利用 Redis 實(shí)現(xiàn)文件上傳狀態(tài)的存儲(chǔ),需要的朋友可以參考下2024-12-12
CentOS 7下安裝 redis 3.0.6并配置集群的過程詳解
這篇文章主要給大家介紹了CentOS 7下安裝 redis 3.0.6并配置集群的過程,文中通過示例代碼和詳細(xì)的步驟介紹的很相信,對(duì)大家具有一定的參考價(jià)值,有需要的朋友們下面來一起看看吧。2017-01-01
Redis常用的數(shù)據(jù)結(jié)構(gòu)及實(shí)際應(yīng)用場(chǎng)景
本文介紹了Redis中常用的數(shù)據(jù)結(jié)構(gòu),包括字符串、列表、集合、哈希表、有序集合和Bitmap,并詳細(xì)說明了它們?cè)诟鞣N場(chǎng)景下的使用,需要的朋友可以參考下2024-05-05
深度剖析Redis字符串操作指南從入門到實(shí)戰(zhàn)應(yīng)用
Redis字符串類型二進(jìn)制安全,支持文本、數(shù)字、二進(jìn)制等數(shù)據(jù),涵蓋基礎(chǔ)操作、數(shù)字計(jì)算、過期管理及分布式鎖等應(yīng)用,結(jié)合優(yōu)化策略提升系統(tǒng)性能,本文給大家介紹Redis字符串操作指南,感興趣的朋友一起看看吧2025-07-07
Redis 使用跳表實(shí)現(xiàn)有序集合的方法
Redis有序集合底層為什么使用跳表而非其他數(shù)據(jù)結(jié)構(gòu)如平衡樹、紅黑樹或B+樹的原因在于其特殊的設(shè)計(jì)和應(yīng)用場(chǎng)景,跳表提供了與平衡樹類似的效率,同時(shí)實(shí)現(xiàn)更簡(jiǎn)單,調(diào)試和修改也更加容易,感興趣的朋友一起看看吧2024-09-09
Redis數(shù)據(jù)結(jié)構(gòu)之跳躍表使用學(xué)習(xí)
這篇文章主要為大家介紹了Redis數(shù)據(jù)結(jié)構(gòu)之跳躍表使用學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07

