學習秒殺 分布式秒殺的實現 記錄

2021-09-17 03:15:09 字數 2093 閱讀 6362

基於碼雲的學習

秒殺?sort_id=750901#秒殺七少買

從簡單到複雜

普通秒殺:

???1簡單 dao層更新的秒殺(多賣)

select number from seckill where seckill_id=?

update seckill set number=number-1 where seckill_id=?

???2程式鎖 service層第一行採用reentrantlock

(使用reentrantlock重入鎖,由於事物提交和鎖釋放的先後順序也會導致超賣。)

lock.lock();

........

finally

???3service方法上aop鎖(正常)

在aop的around處上鎖

(基於秒殺二場景的修復,鎖上移,事物提交後再釋放鎖,不會超賣。)

@servicelock

@component

@scope

@aspect

@order(1)

//order越小越是最先執行,但更重要的是最先執行的最後結束。order預設值是2147483647

public class lockaspect

@around("lockaspect()")

public object around(proceedingjoinpoint joinpoint) catch (throwable e) finally

return obj;

} }

???4悲觀鎖+限流(限流會導致少買)

採用ratelimiter限流 『for update』上鎖

例1: (明確指定主鍵,並且有此記錄,行級鎖)

select * from foods where id=1 for update;

select * from foods where id=1 and name=』咖啡色的羊駝』 for update;

例2: (明確指定主鍵/索引,若查無此記錄,無鎖)

select * from foods where id=-1 for update;

例3: (無主鍵/索引,表級鎖)

select * from foods where name=』咖啡色的羊駝』 for update;

例4: (主鍵/索引不明確,表級鎖)

select * from foods where id<>』3』 for update;

select * from foods where id like 『3』 for update;

select number from seckill where seckill_id=? for update
???5悲觀鎖(正常)

update鎖表

update seckill  set number=number-1 where seckill_id=? and number>0
???6樂觀鎖(正常)

seckill kill = seckillrepository.findone(seckillid);//根據秒殺商品id查版本號version

update seckill set number=number-?,version=version+1 where seckill_id=? and version = ?//樂觀鎖 看更新是否會成功

???7linkedblockingqueue+限流(少買)

在queue中新增成功的 秒殺成功

static blockingqueueblockingqueue = new linkedblockingqueue(queue_max_size);//size為總共商品數
還剩餘1個普通秒殺和4個分布式秒殺

redis分布式鎖 實現秒殺

使用springboot spring data jpa redis實現乙個簡單的後台秒殺程式 pom.xml org.springframework.bootgroupid spring boot starter data redisartifactid dependency controller...

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

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

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

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