Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Notificação de expiração da chave Redis com Jedis


Você pode fazer isso com o pub-sub model onlyIniciar servidor Redis

Altere o notify-keyspace-events em redis.conf para KEA (isso depende de sua necessidade).Detalhes fornecidos na documentação do redis http://redis.io/topics/notifications.

Redis Java Client (Jedis), tente o seguinte:

Ouvinte de notificação:

public class KeyExpiredListener extends JedisPubSub {

@Override
    public void onPSubscribe(String pattern, int subscribedChannels) {
        System.out.println("onPSubscribe "
                + pattern + " " + subscribedChannels);
    }

@Override
    public void onPMessage(String pattern, String channel, String message) {

        System.out
                .println("onPMessage pattern "
                        + pattern + " " + channel + " " + message);
    }

//add other Unimplemented methods


}

Assinante:


****Observação** jedis.psubscribe (new KeyExpiredListener(), "__key*__:*"); -- Este método suporta canal baseado em padrão regex enquanto jedis.subscrever (new KeyExpiredListener(), ""[email protected]__:notify"); --Este método recebe o nome completo/exato do canal
public class Subscriber {

    public static void main(String[] args) {
        JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost");

        Jedis jedis = pool.getResource();
        jedis.psubscribe(new KeyExpiredListener(), "__key*__:*");

    }

}

Aula de teste:

public class TestJedis {

    public static void main(String[] args) {
        JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost");

        Jedis jedis = pool.getResource();
        jedis.set("notify", "umq");
        jedis.expire("notify", 10);

    }
}

Agora, primeiro inicie seu Assinante e execute o TestJedis. Você verá a seguinte saída:
onPSubscribe __key*__:* 1
onPMessage pattern __key*__:* [email protected]__:notify set
onPMessage pattern __key*__:* [email protected]__:set notify
onPMessage pattern __key*__:* [email protected]__:notify expire
onPMessage pattern __key*__:* [email protected]__:expire notify
onPMessage pattern __key*__:* [email protected]__:notify expired
onPMessage pattern __key*__:* [email protected]__:expired notify

Agora, um caso de uso em que você está interessado no valor da chave expirada também.

Observação: O Redis fornece a chave apenas na expiração da chave por meio de notificação de eventos de keyspace, o valor é perdido quando a chave expira. Para que o valor da sua chave expire, você pode fazer o seguinte trabalho como mostrado abaixo com o complicado conceito de chave de sombra:

Ao criar sua chave de notificação, crie também uma chave "sombra" especial que expira (não expire a notificação real). Por exemplo:
// set your key value
SET notify umq 
//set your "shadow" key, note the value here is irrelevant
SET shadowkey:notify "" EX 10 

// Recebe uma mensagem de expiração no canal [email protected] :expired// Divida a chave em ":"(ou qualquer separador que você decidir usar), pegue a segunda parte para obter sua chave original
// Then get the value and do whatever with it
GET notify
// Then delete the key
DEL notify

Observe que o valor do shadowkey não é usado, então você deseja usar o menor valor possível, pode ser uma string vazia "". É um pouco mais trabalhoso para configurar, mas o sistema acima faz exatamente o que você precisa. A sobrecarga são alguns comandos extras para realmente recuperar e excluir sua chave, além do custo de armazenamento de uma chave vazia.

Caso contrário, você deve preparar sua chave de forma que inclua o valor anexado a ela.

Espero que ajude você!