如何管理需要拼接的缓存 Key
在日常开发中,我们经常会给某个用户或订单写入一些临时的缓存数据,比如用户短信验证码,或者某个被锁定的商品库存
// 存储用户 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 协议》,转载必须注明作者和本文链接
佬,你为啥不独立出来做
ENUM
,或者在对应的Model
中做Const
,而是选择了全局常量?我一般会定义一个获取cachekey的方法
define()
的方式个人见解:最不优雅的方式我一般都是写一个缓存类