如何管理需要拼接的快取 Key

MArtian發表於2023-03-31

在日常開發中,我們經常會給某個使用者或訂單寫入一些臨時的快取資料,比如使用者簡訊驗證碼,或者某個被鎖定的商品庫存

// 儲存使用者 ID 為 1 的驗證碼
$code = Cache::put('user_sms_code_' . Auth::id(), '1234', 60);  // user_sms_code_1

// 儲存 ORDER_ID 為 1 商品秒殺庫存
$code = Cache::put('order_locked_stock_' . $order_id, '1', 60);  // order_locked_stock_1

以上場景是開發中經常遇到的,看上去沒什麼問題,但有個隱患是我們的 Cache key 是一個字串,如果我們需要在業務中頻繁的讀寫,那麼很可能會敲錯導致出現意外的 bug。


為了解決這個問題,我們需要將 Cache key 定義為一個常量。

define('USER_SMS_CODE', 'user_sms_code_%d');
define('ORDER_LOCKED_STOCK', 'order_locked_stock_%d');

再次回到上面的程式碼:

// 儲存使用者 ID 為 1 的驗證碼
$code = Cache::put(sprintf(USER_SMS_CODE, Auth::id()), '1234', 60);  // user_sms_code_1

// 儲存 ORDER_ID 為 1 商品秒殺庫存
$code = Cache::put(sprintf(ORDER_LOCKED_STOCK, $order_id), '1', 60);  // order_locked_stock_1

這樣我們在敲快取 key 時會有 IDE 提示,用 sprintf 方法可以直接把 id 替換,避免了拼接的形式導致程式碼可讀性變差。

這只是個簡單的例子,如果要更嚴謹還需要對 key 合法性進行判斷。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
我從未見過一個早起、勤奮、謹慎,誠實的人抱怨命運。

相關文章