복붙노트

[REDIS] Laravel - 지우기 모든 캐시 / 특정 문자열이 포함 된 키를 레디 스

REDIS

Laravel - 지우기 모든 캐시 / 특정 문자열이 포함 된 키를 레디 스

그것은 특정 문자열과 일치 Laravel을 사용하여 레디 스에있는 모든 키를 삭제할 수 있습니까? 나는 단어 제품을 가지고 키를 잊지하기를 원한다면 예를 들어, 다음과 같은 키를 잊어 버린 것입니다 :

laravel : 896235872385237588327582370375acaca235325 : 제품 목록 laravel : 896235872385237588327582370375acaca235325 : 제품 범주

직접 Laravel을 통해 실행할 수 있습니다 더 나은 아무것도가 있다면 나는 레디 스 서버에서이 작업을 실행하는 것입니다하지만 난 궁금하네요 :

레디 스-CLI 키 "*"| 그렙 "제품"| xargs를의 레디 스-CLI DEL

해결법

  1. ==============================

    1.왜 :

    왜 :

    public function forget($key_name)
    {
        $redis = Cache::getRedis();
        $keys = $redis->keys("*$key_name*");
        $count = 0;
        foreach ($keys as $key) {
            $redis->del($key);
            $count++;
        }      
        return $count;  
    }
    

    생산 환경 커서 SCAN [MATCH 패턴 [COUNT 카운트]은 "키"대신에 사용되어야

    http://redis.io/commands/scan

    당신이 경우에 메모리가 부족하지 않기 때문에 당신은 레디 스에서 수천 키의 수만을 가지고, 당신은 "키"를 사용하여 전체 레디 스 인스턴스를 차단하고 싶지 않아요.

  2. ==============================

    2.이 키 대신 스캔을 사용하여 대안입니다. 필요한 경우 재귀 함수로 변환 주시기 바랍니다.

    이 키 대신 스캔을 사용하여 대안입니다. 필요한 경우 재귀 함수로 변환 주시기 바랍니다.

    public function forgetWildcard(string $pattern, int $maxCountValue = 1000)
    {
            $redis = Cache::getRedis();
            $currentCursor = '0';
            do {
                $response = $redis->scan($currentCursor, 'MATCH', $pattern, 'COUNT', $maxCountValue);
                $currentCursor = $response[0];
                $keys = $response[1];
                if (count($keys) > 0) {
                    // remove all found keys
                    $redis->del($keys);
                }
            } while ($currentCursor !== '0'); // finish if current Cursor is reaching '0'
    }
    

    힌트 : $ this-> getPrefix () '*'.이 접두사 Laravel을 위해 일하게 나는 다음과 패턴을 교체했다 $ 패턴.

  3. ==============================

    3.내가 할 수있는 방법 알아 냈어 그래서 - 너무 자주하고 싶지 뭔가를이 키가 명령 레디 스를 사용하기 때문에 :

    내가 할 수있는 방법 알아 냈어 그래서 - 너무 자주하고 싶지 뭔가를이 키가 명령 레디 스를 사용하기 때문에 :

    public function forget($key_name)
        {
            $redis = Cache::getRedis();
            $keys = $redis->keys("*");
            $count = 0;
            foreach ($keys as $key) {
                if (strpos($key, $key_name)) {
                    $redis->del($key);
                    $count++;
                }
            }      
            return $count;  
        }
    
  4. from https://stackoverflow.com/questions/35074418/laravel-erase-all-cache-redis-keys-that-contain-a-specific-string by cc-by-sa and MIT license