복붙노트

[REDIS] 어떻게 레디 스에서 "HSET"아이의 키를 "EXPIRE"로?

REDIS

어떻게 레디 스에서 "HSET"아이의 키를 "EXPIRE"로?

그때 1개월 오래된 레디 스 해시의 모든 키를 만료해야합니다.

해결법

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

    1.이 레디 스을 단순하게하기 위해서, 수 없습니다.

    이 레디 스을 단순하게하기 위해서, 수 없습니다.

    Quoth Antirez, 레디 스의 제작자 :

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

    2.레디 스 전체 해시 만료 것이다 상단 키 이외의 해시에 TTL을 가진 지원하지 않습니다. 당신이 분산됩니다 클러스터를 사용하는 경우, 당신이 사용할 수있는 또 다른 방법이있다. 이 방법은 모든 시나리오에서 유용 할 수없고 성능 특성은 예상과 다를 수 있습니다. 아직 언급 할만큼 가치 :

    레디 스 전체 해시 만료 것이다 상단 키 이외의 해시에 TTL을 가진 지원하지 않습니다. 당신이 분산됩니다 클러스터를 사용하는 경우, 당신이 사용할 수있는 또 다른 방법이있다. 이 방법은 모든 시나리오에서 유용 할 수없고 성능 특성은 예상과 다를 수 있습니다. 아직 언급 할만큼 가치 :

    해시를 가진 경우, 구조는 기본적으로 다음과 같습니다

    hash_top_key
      - child_key_1 -> some_value
      - child_key_2 -> some_value
      ...
      - child_key_n -> some_value
    

    우리 아이 키에 TTL을 추가 할 수 있기 때문에, 우리는 상위 키로 이동할 수 있습니다. 주요 포인트는 키가 지금 hash_top_key와 자식 키의 조합해야한다는 것입니다 :

    {hash_top_key}child_key_1 -> some_value
    {hash_top_key}child_key_2 -> some_value
    ...
    {hash_top_key}child_key_n -> some_value
    

    우리는 목적에 {} 표기법을 사용하고 있습니다. 이것은 모든 키가 동일한 해시 슬롯에 빠질 수 있습니다. 당신은 여기에 대한 자세한 내용을보실 수 있습니다 : https://redis.io/topics/cluster-tutorial

    우리는 해시의 동일한 작업을 수행하려는 지금, 우리는 할 수있다 :

    HDEL hash_top_key child_key_1 => DEL {hash_top_key}child_key_1
    
    HGET hash_top_key child_key_1 => GET {hash_top_key}child_key_1
    
    HSET hash_top_key child_key_1 some_value => SET {hash_top_key}child_key_1 some_value [some_TTL]
    
    HGETALL hash_top_key => 
      keyslot = CLUSTER KEYSLOT {hash_top_key}
      keys = CLUSTER GETKEYSINSLOT keyslot n
      MGET keys
    

    여기서 흥미로운는 HGETALL입니다. 먼저 우리는 우리의 모든 아이들 키의 해시 슬롯을 얻는다. 그런 다음 우리는 특정 해시 슬롯의 키를 얻을 그리고 마지막으로 우리는 값을 검색 할 수 있습니다. 그 해시 슬롯 이상의 n 개의 키가있을 수 있으며, 또한 우리가에 관심이있는 것이 아니라 그들이 동일한 해시 슬롯을 가지고 키가있을 수 있기 때문에 우리는 여기에주의 할 필요가있다. 우리는 실제로 EVAL 또는 EVALSHA 명령을 실행하여 서버에서 이러한 단계를 수행하기 위해 루아 스크립트를 작성할 수 있습니다. 다시 말하지만, 당신은 당신의 특정 시나리오에 대한 고려 사항으로이 방법의 성능을해야합니다.

    좀 더 참조 :

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

    3.입력 TTL 지원하는 구현 해시 맵 개체입니다 Redisson 자바 프레임 워크가있다. 그것은 HMAP 사용하고 레디 스 후드에서 개체를 ZSET. 사용 예 :

    입력 TTL 지원하는 구현 해시 맵 개체입니다 Redisson 자바 프레임 워크가있다. 그것은 HMAP 사용하고 레디 스 후드에서 개체를 ZSET. 사용 예 :

    RMapCache<Integer, String> map = redisson.getMapCache('map');
    map.put(1, 30, TimeUnit.DAYS); // this entry expires in 30 days
    

    이 방법은 매우 유용하다.

  4. ==============================

    4.NodeJS 구현에 관해서는, 나는 해시에 저장 오브젝트에서 사용자 지정 expiryTime 필드를 추가했습니다. 그런 다음 특정 기간의 시간 후, 나는 다음과 같은 코드를 사용하여 만료 된 해시 항목을 지우 :

    NodeJS 구현에 관해서는, 나는 해시에 저장 오브젝트에서 사용자 지정 expiryTime 필드를 추가했습니다. 그런 다음 특정 기간의 시간 후, 나는 다음과 같은 코드를 사용하여 만료 된 해시 항목을 지우 :

    client.hgetall(HASH_NAME, function(err, reply) {
        if (reply) {
            Object.keys(reply).forEach(key => {
                if (reply[key] && JSON.parse(reply[key]).expiryTime < (new Date).getTime()) {
                    client.hdel(HASH_NAME, key);
                }
            })
        }
    });
    
  5. ==============================

    5.당신은 예를 들어, 저장할 때 키 / 레디 스의 값은 다르게 당신의 키에 접두사 또는 네임 스페이스를 추가하여,이를 달성하기 위해 저장할 수 "hset_"

    당신은 예를 들어, 저장할 때 키 / 레디 스의 값은 다르게 당신의 키에 접두사 또는 네임 스페이스를 추가하여,이를 달성하기 위해 저장할 수 "hset_"

     SET hset_key value
     EXPIRE hset_key
    

    참고 : 키를 사용하여 큰 데이터베이스가 특히 성능에 영향을 줄 수있는 전체 데이터베이스에서 키를 일치를 위해 조회됩니다.

    노트 :

  6. ==============================

    6.우리는 같은 문제에 대해 논의했다.

    우리는 같은 문제에 대해 논의했다.

    우리는 레디 스 해시, 해시 항목 (이름 / 값 쌍)에 키를 가지고, 우리는 각 해시 항목을 개별 만료 시간을 길게 할 필요가 있었다.

    우리는 해시 항목 값을 쓸 때 N 부호화 만료 정보를 포함하는 프리픽스 바이트의 데이터를 가산하여 구현, 또한 값이 기록되기에 포함 된 시간에 만료 키를 설정.

    그런 다음, 읽기에, 우리는 접두사를 디코딩 및 만료를 확인하십시오. 이 추가 오버 헤드는, 그러나,이 O (n)이 여전히 마지막 해시 항목이 만료되면 전체 키가 만료 읽습니다.

  7. ==============================

    7.당신은 할 수 있습니다. 다음은 예이다.

    당신은 할 수 있습니다. 다음은 예이다.

    redis 127.0.0.1:6379> hset key f1 1
    (integer) 1
    redis 127.0.0.1:6379> hset key f2 2
    (integer) 1
    redis 127.0.0.1:6379> hvals key
    1) "1"
    2) "1"
    3) "2"
    redis 127.0.0.1:6379> expire key 10
    (integer) 1
    redis 127.0.0.1:6379> hvals key
    1) "1"
    2) "1"
    3) "2"
    redis 127.0.0.1:6379> hvals key
    1) "1"
    2) "1"
    3) "2"
    redis 127.0.0.1:6379> hvals key
    

    사용이 만료되거나 EXPIREAT 명령.

    당신은 오래된을 1 달 해시의 특정 키를 만료합니다. 이건 불가능 해. 레디 스 명령은 해시의 모든 키입니다 만료됩니다. 당신이 매일 해시 키를 설정하면 살 키 시간을 설정할 수 있습니다.

    hset key-20140325 f1 1
    expire key-20140325 100
    hset key-20140325 f1 2
    
  8. ==============================

    8.당신은 쉽게에서 레디 스 해시를 만료 될 수 있습니다 예 사용하여 파이썬

    당신은 쉽게에서 레디 스 해시를 만료 될 수 있습니다 예 사용하여 파이썬

    import redis
    conn = redis.Redis('localhost')
    conn.hmset("hashed_user", {'name': 'robert', 'age': 32})
    conn.expire("hashed_user", 10)
    

    이 10 초 후에 해시 hashed_user의 모든 하위 키를 만료됩니다

    레디 스-CLI에서 같은,

    127.0.0.1:6379> HMSET testt username wlc password P1pp0 age 34
    OK
    127.0.0.1:6379> hgetall testt
    1) "username"
    2) "wlc"
    3) "password"
    4) "P1pp0"
    5) "age"
    6) "34"
    127.0.0.1:6379> expire testt 10
    (integer) 1
    127.0.0.1:6379> hgetall testt
    1) "username"
    2) "wlc"
    3) "password"
    4) "P1pp0"
    5) "age"
    6) "34"
    

    10 초 후에

    127.0.0.1:6379> hgetall testt
    (empty list or set)
    
  9. ==============================

    9.당신은 psubscribe 및 사용하여 레디 스 키 스페이스 알림을 사용할 수있다 "__keyevent을 @ __ : 만료".

    당신은 psubscribe 및 사용하여 레디 스 키 스페이스 알림을 사용할 수있다 "__keyevent을 @ __ : 만료".

    그것으로, 키가 만료 될 때마다, 당신은 당신의 레디 스 연결에 게시 된 메시지를 받게됩니다.

    귀하의 질문에 관해서는 것은 기본적으로는 S / MS에 만료 시간이 임시 "정상적인"키를 사용하여 설정을 만들 수 있습니다. 그것은 당신이 당신의 세트에서 삭제하고자하는 키의 이름과 일치해야합니다.

    임시 키를 잡고 당신의 레디 스 연결에 게시되는 바와 같이, "__keyevent @ 0 __ : 만료"가 만료 될 때 메시지가 키의 이름을해야합니다, 당신은 쉽게 원래 세트에서 키를 삭제할 수 있습니다.

    해당 페이지에 실제로 간단한 예 : https://medium.com/@micah1powell/using-redis-keyspace-notifications-for-a-reminder-service-with-node-c05047befec3

    문서 : https://redis.io/topics/notifications (플래그 XE에 대한보기)

  10. ==============================

    10.당신은 점수로 타임 스탬프와 TTL 용기를 얻을 레디 스 정렬 설정을 사용할 수 있습니다. 예를 들어, 세트에 이벤트 문자열을 삽입 할 때마다 당신은 이벤트 시간에 그 점수를 설정할 수 있습니다. 따라서 당신은 호출하여 언제든지 윈도우의 데이터를 얻을 수 있습니다 zrangebyscore "당신의 세트 이름"최소 시간 최대 시간

    당신은 점수로 타임 스탬프와 TTL 용기를 얻을 레디 스 정렬 설정을 사용할 수 있습니다. 예를 들어, 세트에 이벤트 문자열을 삽입 할 때마다 당신은 이벤트 시간에 그 점수를 설정할 수 있습니다. 따라서 당신은 호출하여 언제든지 윈도우의 데이터를 얻을 수 있습니다 zrangebyscore "당신의 세트 이름"최소 시간 최대 시간

    또한, 우리는 이전 이벤트를 제거하는 "당신의 세트 이름"최소 시간 최대 시간을 zremrangebyscore를 사용하여 만료 할 수 있습니다.

    은 여기 환급이 세트의 크기를 유지하기 위해 외부인 과정에서 하우스 키핑을 할 필요가있다.

  11. from https://stackoverflow.com/questions/16545321/how-to-expire-the-hset-child-key-in-redis by cc-by-sa and MIT license