[ PHP ] laravel predis 使用 hscan 和 scan
前言
前言的前言 1,線上 redis
版本爲 2.8.19
,無法使用 unlink
。
前言的前言 2,此處描述的 redis
hash 數據,實時性,完整性要求不高。
前言的前言 3,框架爲 laravel 5.6
,使用 predis
。
根據項目功能的要求,需要根據已經生成好的中間數據,重新生成 hash 類型的 redis
數據。
所以爲減少重新生成的複雜度,解決方案的順序爲:
1. 生成臨時的 key 爲 tmp_key 的 hash 數據
2. 將原 key 的 hash 數據刪除
3. 將 tmp_key rename 爲 key
正文
根據前言描述的情況,在刪除數據的時候,因爲衆所周知的原因 ( 線上禁止使用 del
、keys
等命令 ),需要使用 scan
、hscan
進行 key 或 hash 數據的循環刪除,在查閱網上的 predis
,大多缺少對 hscan
,scan
使用的說明。因此這裏簡單說一下如何在 laravel
框架中使用 predis
的 hscan
和 scan
命令。
使用 hscan 進行刪除的例子
代碼如下
<?php
namescape Test\Tmp;
use Redis;
class TestRedis{
public function delHashByScan($key, $match = '', $count = 500){
$pattern_arr['COUNT'] = $count;
if($match){
$pattern_arr['MATCH'] = $match;
}
$cursor = '0';
while($cursor !== 0){
// 命令位置 vendor\predis\predis\src\Command\HashScan.php
$info = Redis::hscan($key, $cursor, $pattern_arr);
$cursor = intval($info[0]);
$list = $info[1] ?? [];
if($list){
$del_field = [];
foreach($list as $field=>$v){
$del_field[] = $field;
}
Redis::hdel($key, $del_field);
}
}
}
}
使用 scan 獲取 key 列表的例子
public function getKeysByScan($cursor = 0, $count = 500, $match = ''){
$pattern_arr['COUNT'] = $count;
if($match){
$pattern_arr['MATCH'] = $match;
}
return Redis::scan($cursor, $pattern_arr);
}
以上例子如果不妥之處,歡迎下方留言提示,多謝
That’s all