使用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...