Redis
 sql >> Base de données >  >> NoSQL >> Redis

Notification d'expiration de la clé Redis avec Jedis

Vous pouvez le faire avec le pub-sub modèle uniquementDémarrer le serveur Redis

Remplacez les événements notify-keyspace-events dans redis.conf par KEA (cela dépend de vos besoins). Détails donnés dans la documentation redis http://redis.io/topics/notifications.

Client Redis Java (Jedis), essayez ce qui suit :

Écouteur des notifications :

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


}

Abonné :

****Remarque** jedis.psubscribe (new KeyExpiredListener(), "__key*__:*"); -- Cette méthode prend en charge le canal basé sur le modèle regex, alors que jedis.s'abonner (new KeyExpiredListener(), ""[email protected]__:notify"); --Cette méthode prend le nom complet/exact du 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*__:*");

    }

}

Classe d'essai :

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);

    }
}

Maintenant, démarrez d'abord votre abonné, puis exécutez le TestJedis. Vous verrez le résultat suivant :

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

Maintenant, un cas d'utilisation où vous êtes intéressé par la valeur de la clé expirée également.

Remarque : Redis ne fournit la clé qu'à l'expiration de la clé via la notification des événements d'espace de clés, la valeur est perdue une fois la clé expirée. Afin d'obtenir l'expiration de la valeur de votre clé, vous pouvez effectuer le travail suivant illustré ci-dessous avec le concept délicat de clé fantôme :

Lorsque vous créez votre clé de notification, créez également une clé "fantôme" spéciale qui expire (n'expirez pas la notification réelle). Par exemple :

// set your key value
SET notify umq 
//set your "shadow" key, note the value here is irrelevant
SET shadowkey:notify "" EX 10 

// Récupère un message d'expiration dans le canal [email protected] :expired// Divisez la clé sur ":" (ou tout autre séparateur que vous décidez d'utiliser), prenez la deuxième partie pour obtenir votre clé d'origine

// Then get the value and do whatever with it
GET notify
// Then delete the key
DEL notify

Notez que la valeur de shadowkey n'est pas utilisée, vous souhaitez donc utiliser la plus petite valeur possible, il peut s'agir d'une chaîne vide "". C'est un peu plus de travail à configurer, mais le système ci-dessus fait exactement ce dont vous avez besoin. La surcharge correspond à quelques commandes supplémentaires pour récupérer et supprimer votre clé, plus le coût de stockage d'une clé vide.

Sinon, vous devez préparer votre clé de manière à ce qu'elle inclue la valeur ajoutée avec elle.

J'espère que cela vous aidera !