基於Redis Memcached的高併發秒殺設計

2022-09-01 07:54:08 字數 1268 閱讀 9494

如何設計高併發時的秒殺,是面試電商技術職位時必考的題目。今天在這裡分享一下基於redis或memcached的技術方案,能解決重複提交、超發、高併發的問題。

<?php 

//預定義總庫存

define("total_stock", 5);

//預定義商品編號

define("item_id", "item_001");

$userid = $_get['userid'];

$useridkey = item_id . '_' . $userid;

$redis = new redis();

//如果有多台redis伺服器,可根據商品編號雜湊後得到其中一台redis的位址

$result = $redis->connect('master104', 6379);

//獲取之前已經領取掉的數量

$requested = $redis->get("requested");

echo "領取前庫存: " . (string)(total_stock - $requested) . "

";//如果已領取大於預定義庫存,則認為庫存為零,不允許繼續

if ($requested && ($requested >= total_stock))

//通過設定使用者對該商品的領取狀態,來檢查該使用者是否已領取過

//如果使用memcached的話,可以使用cas()

if (!$redis->setnx($useridkey, 1))

//增加領取數量以減少庫存。

//高併發情況下可能會有多個incr()是成功的。但是沒關係,在領取數大於庫存數後,通過下面的if判斷後,後面的請求都是無效的。

$requested = $redis->incr("requested");

//如果嘗試增加的時候,發現庫存已經為零了,需要重置使用者領取狀態

if ($requested && ($requested > total_stock))

//以下可以做其他的後續操作,比如各種非同步並行操作,或是投遞訊息到佇列,等等

//step1

//...

//stepn

//如果步驟進行到這裡,不管以上的非同步操作進行得如何,我們都必須認為使用者已經領取成功。

//即使有任何失敗,我們都需要用技術手段幫使用者完成上述step1到stepn

echo "領取成功!

";echo "領取後庫存: " . (string)(total_stock - $requested) . "

";?>

redis memcache 效能比較

from redis和memcache非常像的,都是key,value的方式,將資料存放記憶體中。最近在學習redis,在網上看了一些這方面的資料,有三種觀點 1,redis讀寫記憶體比memcache快 2,memcache讀寫記憶體比redis快 3,memcache讀寫記憶體比redis快,但...

php中redis memcache等快取的應用

在web開發的過程中快取是必不可少的工具,無論是mamcache還是redis我想大家都很有所涉略。我分享一下我個人在工作中的一些使用後的想法。緩衝應用設計 對於快取的使用我想大家應該都會使用,簡單的key value 我就不多說什麼了 不會用的可以看下手冊 快取無外乎就是在應用於資料庫之間建立乙個...

AspectJ基於xml和基於註解

一 基於xml 執行的切入點中具體方法有返回值,則方法結束會立即執行後置通知,然後再執行環繞通知的放行之後的 2 連線點即所有可能的方法,切入點是正真被切的方法,連線點方法名 其中,只有環繞通知的切入點引數不一樣,是可以放行的切入點 3 異常通知是處理異常 切面類中的異常通知的方法引數列表中異常引數...