基於碼雲的學習
秒殺?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分布式鎖實現「茅台」秒殺
分布式鎖就是 控制分布式系統有序的去對共享資源進行操作,通過互斥來保持一致性。舉個大白話一樣的例子 假設共享的資源是一輛共享汽車,這輛車在乙個時間只能有乙個人去駕駛,分布式系統就好比是要駕駛車的人,分布式鎖就是保證這個時間點只能乙個人駕駛,並且只有這一把鑰匙。然而,有好多人要租車,但是要按順序來排隊...