복붙노트

[REDIS] 해시 키 이름에 따라 대량으로 삭제 레디 스의 해시 값

REDIS

해시 키 이름에 따라 대량으로 삭제 레디 스의 해시 값

이 유사하지만, 대신에 일반 키의 해시에 대한 해결책을 필요로 어떻게 레디 스를 사용하여 패턴과 일치하는 원자 적으로 삭제 키

내가 좋아하는 접두사와 해시의 무리가 : "접두사를"

"XX"는 2 문자 코드이다 "cc_XX"각 해시에서 같은 키의 무리입니다.

내 모든 레디 스 해시를 통해 몇 가지 방법 루프가 필요하고, cc_XX 하위 키 몇 가지 방법을 각각 삭제하고, (하나와 큰되지 않음)이 작업을 수행하는 CLI / 루아 방법을 찾고 있어요.

어떤 조언을 주시면 감사하겠습니다.

해결법

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

    1.다음 EVAL 스크립트는 당신이 원하는 일을해야한다 :

    다음 EVAL 스크립트는 당신이 원하는 일을해야한다 :

    local keys = redis.call('KEYS',KEYS[1])
    for i,k in ipairs(keys) do
        local res = redis.call('HKEYS',k)
        for j,v in ipairs(res) do
            if string.find(v,ARGV[1]) then
                redis.call('HDEL',k,v)
            end
        end
    end
    

    다음 매개 변수를 제공하여 호출해야합니다 :

    EVAL <script> 1 prefix:* cc_..
    

    스크립트가 완료 될 때까지 키의 수가 많은 경우 잠시 동안 레디 스를 고정 할 수 있도록 레디 스의 이벤트 루프 그것을 블록을 유의하시기 바랍니다. 자성은 가격이 있습니다.

    최신 정보:

    당신은 자성이 필요하지 않은 경우, 다음 스크립트는 거대한 글로벌 키 번호 또는 해시 객체 중 하나가 큰 경우가 있다면 그것은 여전히 ​​차단합니다, 너무 오래 레디 스를 막지 않도록 (그러나 참고하시기 바랍니다 것입니다 :있다 방법은)이 문제를 방지 할 수 있습니다.

    ./redis-cli keys 'prefix:*' | awk '
    BEGIN {
        script = "local res = redis.call('\''HKEYS'\'',KEYS[1]); \
              for j,v in ipairs(res) do                          \
                if string.find(v,ARGV[1]) then                   \
                  redis.call('\''HDEL'\'',KEYS[1],v);            \
                end                                              \
              end"
    }
    {
        printf "EVAL \"%s\" 1 %s cc_..\n", script, $1
    }' | ./redis-cli
    

    (떠들썩한 파티 테스트)

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

    2.우리가 레디 스에서 해시를 저장하는 방법은, 우리는 해시 내에서 개체 유형에 의해 해시 요소 ID 키를 접미사. 때로는 데이터 모델에서, 우리는 개체를 업데이트하고 우리는 배치에 따라 지정된 객체 유형의 모든 해시 요소를 삭제해야합니다. 우리는 전체 해시를 삭제하지 않고이 작업을 수행하고 싶었다.

    우리가 레디 스에서 해시를 저장하는 방법은, 우리는 해시 내에서 개체 유형에 의해 해시 요소 ID 키를 접미사. 때로는 데이터 모델에서, 우리는 개체를 업데이트하고 우리는 배치에 따라 지정된 객체 유형의 모든 해시 요소를 삭제해야합니다. 우리는 전체 해시를 삭제하지 않고이 작업을 수행하고 싶었다.

    예를 들면 :

    127.0.0.1:6379> keys client*
    1) "client"
    
    127.0.0.1:6379> type client
    hash
    
    127.0.0.1:6379> hkeys client
     1) "123-obj1"
     2) "123-obj2"
     3) "123-obj3"
     4) "123-obj4"
     5) "123-obj5"
     6) "456-obj1"
     7) "456-obj2"
     8) "456-obj3"
     9) "456-obj4"
    10) "456-obj5"
    

    우리는 기본 값으로 OBJ5와 세트로 응용 프로그램에서 새 필드를 추가하는 경우, 우리는 "HDEL 클라이언트 * -obj5"에 해당를 실행해야합니다. 그러나,이 레디 스-CLI에서 작동하지 않습니다.

    내가 BASH를 통해 다음과 같은 작품을 발견했다 :

    redis-cli HKEYS 'client' | grep obj5 | awk '{ printf "HDEL client %s\n", $1 }' | redis-cli
    

    사용자 환경에서 다른 레디 스 데이터베이스를 사용하는 경우, 레디 스-CLI에서 "선택 X"에 해당되는 "-n X"스위치를 추가합니다. 이 경우, 데이터베이스 4를 선택 :

    redis-cli -n 4 HKEYS 'client' | grep obj5 | awk '{ printf "HDEL client %s\n", $1 }' | redis-cli -n 4
    
  3. from https://stackoverflow.com/questions/17224817/delete-redis-hash-values-in-bulk-based-on-the-hash-key-name by cc-by-sa and MIT license