redis分布式鎖 實現秒殺

2021-10-23 18:25:59 字數 2336 閱讀 1008

使用springboot+spring data jpa +redis實現乙個簡單的後台秒殺程式:

pom.xml:

>

>

org.springframework.bootgroupid

>

>

spring-boot-starter-data-redisartifactid

>

dependency

>

controller層:

@restcontroller

("/skill"

)@slf4j

public

class

seckillcontroller")

public string query

(@pathvariable string productid)

throws exception

/** * 秒殺,沒有搶到獲得"被擠爆了,***x",搶到了會返回剩餘的庫存量

* @param productid

* @return

* @throws exception

*/("/order/"

)public string skill

(@pathvariable string productid)

throws exception

}

service層:

public

inte***ce

seckillservice

這其實就是多執行緒的具體場景,那麼最常見的方法是在 下單的方法上orderproductmockdiffuser加上synchronized關鍵字,但是這就會有缺陷:1、只能實現單機版應用,2、程式太慢。

所以考慮使用redis:

@service

public

class

seckillserviceimpl

implements

seckillservice

private string querymap

(string productid)

@override

public string queryseckillproductinfo

(string productid)

@override

public

void

orderproductmockdiffuser

(string productid)

//1.查詢該商品庫存,為0則活動結束。

int stocknum = stock.

get(productid);if

(stocknum ==0)

else

catch

(interruptedexception e)

stock.

put(productid,stocknum);}

//解鎖

redislock.

unlock

(productid,string.

valueof

(time));

}}

使用redis加鎖和解鎖:

@component

@slf4j

public

class

redislock

/** * 下面這段**如果不加,可能發生死鎖的情況

*///currentvalue=a 這兩個執行緒的value都是b 其中乙個執行緒拿到鎖

string currentvalue = template.

opsforvalue()

.get

(key)

;//如果鎖過期 currentvalue =(當前時間+過期時間)if(

!stringutils.

isempty

(currentvalue)

&& long.

parselong

(currentvalue)

< system.

currenttimemillis()

)}return

false;}

//解鎖

public

void

unlock

(string key,string value)

}catch

(exception e)

", e);}}

}

redis中文網:

用redis實現分布式鎖,秒殺案例

分布式鎖的簡單實現 created by liuyang on 2017 4 20.public class distributedlock 加鎖 param lockname 鎖的key param acquiretimeout 獲取超時時間 param timeout 鎖的超時時間 return...

使用redis分布式鎖實現「茅台」秒殺

分布式鎖就是 控制分布式系統有序的去對共享資源進行操作,通過互斥來保持一致性。舉個大白話一樣的例子 假設共享的資源是一輛共享汽車,這輛車在乙個時間只能有乙個人去駕駛,分布式系統就好比是要駕駛車的人,分布式鎖就是保證這個時間點只能乙個人駕駛,並且只有這一把鑰匙。然而,有好多人要租車,但是要按順序來排隊...

分布式鎖 使用Redis實現分布式鎖

關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...