복붙노트

[REDIS] 레디 스 알림 : 만기에 키와 값을 가져옵니다

REDIS

레디 스 알림 : 만기에 키와 값을 가져옵니다

우리는 다음과 같은 사용 사례가 : 특정 키가 만료 될 때마다, 우리는 그것의 값을 기준으로 뭔가를 통보하는 데 필요한 및 않습니다. 화재에게 만료 된 이벤트를 레디 스 때 우리가 당연히 예상되는, 나중에 액세스하려고 할 때, 키는 이미 DB에서 제거되었습니다.

이 만료 된 후 이제 다시 항목에 액세스 할 수있는 방법은 무엇입니까? 그럴 것 같아요.

그래서 두 번째 옵션 : 이러한 이벤트를 보낼 때 전체 값 개체를 게시 할 레디 스에게 대신 키의 할 수있는 방법이 있나요? 나는 루아를 통해 추가 할 수 있지만, 가능하면 내가 더 쉬운 옵션에 관심이있는 거라고 생각한다. 주로 원자 과정을 가지고, 우리는 또한 우리가 기본적으로 이벤트가 수신되면,하지 키 (우리가하는 GET을 할 수있는 가치를 게시 할 모든 알림을 필요로 다른 이벤트에 대해이 동작을 필요로하지만 우리는 두 번째 전화를 주위 싶어 값 때문에) 이벤트를 게시하고 값을 검색하는 GET을하는 사이에 변화 할 수 있었다.

이 이해할 수 있기를 바랍니다. 어쩌면 우리는 사전에 감사합니다, 그래서 명백한을 볼 수 없습니다!

해결법

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

    1.엘리가 연결되어 있다는 특징은 키가 만료되면 당신이들을 수 있습니다. 그러나, 그것은 당신에게 키 값을 제공하지 않습니다. 곧면 적 (https://github.com/antirez/redis/issues/1876) 언제 내장이 기능을 기대할 수 있습니다처럼 Futhermore의 신청 github의 문제에 따라이 보이지 않는다. 이 솔루션의 I를 사용하면 실제 값이 키에 연결된 특별한 "그림자"만료 키를 생성하는 것입니다.

    엘리가 연결되어 있다는 특징은 키가 만료되면 당신이들을 수 있습니다. 그러나, 그것은 당신에게 키 값을 제공하지 않습니다. 곧면 적 (https://github.com/antirez/redis/issues/1876) 언제 내장이 기능을 기대할 수 있습니다처럼 Futhermore의 신청 github의 문제에 따라이 보이지 않는다. 이 솔루션의 I를 사용하면 실제 값이 키에 연결된 특별한 "그림자"만료 키를 생성하는 것입니다.

    그래서 당신은 키라고 testkey을 말할 수 있으며 또한, 키가되는 당신이 키의 값을 얻으려면 포인트 10 초 후에 만료됩니다 (100)의 정수 값을 갖는다. (어쩌면 당신은 존재 10 초간 키를 증가했다).

    먼저 당신은 키 스페이스 이벤트에 대한 설정 청취 할 필요가있다. 특히 당신이 만료 이벤트를 수신합니다. 당신은 당신의 설정에서이 작업을 수행하거나 레디 스의 구성 설정 명령을 사용할 수 있습니다. (자세한 정보를 원하시면 여기를 참조하십시오 http://redis.io/topics/notifications)

    CONFIG SET notify-keyspace-events Ex
    

    지금 당신은 당신이 키가 만료되었다는 메시지가 나타납니다 특수의 KeyEvent 채널을 구독 할 수 있습니다.

    SUBSCRIBE __keyevent@0__:expired
    

    구독하는 채널의 형식은 __keyevent입니다 @ __ . 우리의 예에서 우리는 우리가 기본 데이터베이스 0로 작업 가정하고 우리는 만료 된 이벤트를 수신하고 싶습니다.

    testkey이 만료되면 이제 메시지가 만료 된 키의 이름입니다 __keyevent__ 채널에서 메시지를 받게됩니다. 우리는 더 이상 값을 액세스 할 수 있도록 물론이 시점에서 키 사라하지 않습니다! 이 솔루션은 특별한 만료 키를 사용하는 것입니다.

    당신이 당신의 testkey는 "그림자"키를 만료 특별한을 만들 만들 때 (실제 testkey를 만료되지 않습니다). 예를 들면 :

    SET testkey 100
    SET shadowkey:testkey "" EX 10
    

    이제 __keyevent @ 0 __에서 : 만료 된 채널 당신은 키 shadowkey 있음을 알려주는 메시지가 나타납니다 testkey이 만료되었습니다. 메시지의 값 (키의 이름입니다) (어떤 분리 당신이 사용하기로 결정 나) 대장에, 분할을 한 후 수동으로 키 값을 얻을 삭제합니다.

    // set your key value
    SET testkey 100 
    //set your "shadow" key, note the value here is irrelevant
    SET shadowkey:testkey "" EX 10 
    // Get an expiration message in the channel __keyevent@0__:expired
    // Split the key on ":", take the second part to get your original key
    // Then get the value and do whatever with it
    GET testkey
    // Then delete the key
    DEL testkey
    

    이 대답 (값없이 레디 스 저장소 키)에 따라 빈 문자열 ""입니다 가능한 가장 작은 값을 사용할 수 있도록 shadowkey의 값이 사용되지 않습니다. 이 설정에 조금 더 작업입니다하지만 위의 시스템은 사용자가 원하는 기능을 수행합니다. 오버 헤드는 몇 가지 추가 명령이 실제로 검색하고 키 플러스 빈 키의 저장 비용을 삭제하는 것입니다.

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

    2.당신은 2.8에 있다면, 당신은 (이 페이지에서 참조)이 새로운 기능을 시도 할 수 있습니다. 당신은 2.8 어쨌든에 있다면 그것은 확실히 불안정하고 잘 테스트하지 않는 것,하지만 ...

    당신은 2.8에 있다면, 당신은 (이 페이지에서 참조)이 새로운 기능을 시도 할 수 있습니다. 당신은 2.8 어쨌든에 있다면 그것은 확실히 불안정하고 잘 테스트하지 않는 것,하지만 ...

    문제 페이지에서 짧은 소개 :

  3. from https://stackoverflow.com/questions/18328058/redis-notifications-get-key-and-value-on-expiration by cc-by-sa and MIT license