在大流量程序開發中,必然會遇到高并發的應用的場景。解決方案大致分為兩個方向,消息隊列、鎖.
redis 實現消息隊列核心簡單版本
????????$key?=?'quque'; ????????/** ?????????*?秒殺商品數量有限,預先存儲到消息隊列 ?????????*/ ????????public?function?qnquque()?{ ????????????for($i?=?1?;?$ilpush($key,$i); ????????????} ????????} ???????? ????????/** ?????????*?這里省略掉業務邏輯處理,默認業務邏輯處理完,出隊列 ?????????*/ ????????public?function?dequque()?{ ????????????$redis->rpop($key); ????????????/** ?????????????*??這里開始商品購買后的業務邏輯處理 ?????????????*/ ????????}
消息隊列是防止超買超賣很好的一種解決方案,要實現消息隊列的高級功能需要用到專業的消息隊列工具例如(rabbitmq).用戶Redis 用戶redis實現消息隊列還是有一些缺點的,可以自行查找文章補充。這邊不一一概述。最大問題還是分布式集群的問題。
Redis 樂觀鎖實現秒殺功能
它的優點如下:
消息隊列對內存消耗較大,10000個請求,需要操作10000 出隊列。容易造成內存資源瞬間爆棚
使用樂觀鎖的邏輯,CPU相對來說消耗較低、內存資源占用少
????$redis?=?new?redis(); ????$result?=?$redis->connect('127.0.0.1',?6379); ????$cachekey?=?$redis->get("cachekey"); ????$number?=?100;???//搶購數量 ????if($cachekeywatch("cachekey"); ????????$redis->multi(); ???????? ????????//設置延遲,方便測試效果。 ????????sleep(5); ????????//插入搶購數據 ????????$redis->hSet("cachekeyList","user_id_".mt_rand(1,?9999),time()); ????????$redis->set("cachekey",$cachekey+1); ????????$result?=?$redis->exec(); ????????if($result){ ????????????$cachekeyList?=?$redis->hGetAll("cachekeyList"); ????????????echo?"恭喜".$cachekeyList."搶購成功!<br>"; ????????}else{ ????????????echo?"再接再厲"; ????????????exit; ????????} ????}
更多redis知識請關注redis入門教程欄目。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END
喜歡就支持一下吧
相關推薦