[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

正文

根據前言描述的情況,在刪除數據的時候,因爲衆所周知的原因 ( 線上禁止使用 delkeys 等命令 ),需要使用 scanhscan 進行 key 或 hash 數據的循環刪除,在查閱網上的 predis ,大多缺少對 hscanscan 使用的說明。因此這裏簡單說一下如何在 laravel 框架中使用 predishscanscan 命令。

使用 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章