Redis Key 过期通知与 Jedis

2022-09-03 00:07:59

我正在尝试使用 redis 实现过期密钥通知,当我的密钥在 redis 数据存储中过期时。redis网站提供了一些关于 http://redis.io/topics/notifications 的描述,但是我无法找到任何例子,如何使用Redis java客户端(如Jedis)来做到这一点?

任何带有插图的可能代码都将非常有用,因为我是redis的新手。


答案 1

您可以使用发布子模型仅启动 Redis 服务器来执行此操作

将 redis.conf 中的 notify-keyspace-events 更改为 KEA(这取决于您的要求)。redis 文档中提供的详细信息 http://redis.io/topics/notifications

Redis Java Client (Jedis) ,试试下面这些:

通知侦听器:

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


}

订户:

注意** jedis.psubscribe(new KeyExpiredListener(), “__key*__:*”);-- 此方法支持基于正则表达式模式的通道,而 jedis。subscribe(new KeyExpiredListener(), “”__keyspace@0__:notify“);--此方法采用完整/精确的通道名称

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*__:*");

    }

}

测试类:

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

    }
}

现在,首先启动订阅服务器,然后运行 TestJedis。您将看到以下输出:

onPSubscribe __key*__:* 1
onPMessage pattern __key*__:* __keyspace@0__:notify set
onPMessage pattern __key*__:* __keyevent@0__:set notify
onPMessage pattern __key*__:* __keyspace@0__:notify expire
onPMessage pattern __key*__:* __keyevent@0__:expire notify
onPMessage pattern __key*__:* __keyspace@0__:notify expired
onPMessage pattern __key*__:* __keyevent@0__:expired notify

现在,您也对过期密钥的值感兴趣。

注意:Redis仅在密钥过期时通过通知密钥空间事件提供密钥,密钥过期后值将丢失。为了获得密钥 expire 上的值,您可以使用阴影密钥的棘手概念执行下面显示的以下工作:

创建通知密钥时,还要创建一个特殊的过期“影子”密钥(不要让实际通知过期)。例如:

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

在通道中获取过期消息 keyevent@0:expire // 拆分“:”(或您决定使用的任何分隔符)上的密钥,获取第二部分以获取原始密钥

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

请注意,不使用 shadowkey 的值,因此您希望使用尽可能小的值,可以是空字符串 “”。设置起来需要做更多的工作,但上述系统完全可以满足您的需求。开销是实际检索和删除密钥的一些额外命令,以及空密钥的存储成本。

否则,您必须以包含附加值的方式准备密钥。

希望它能帮助你!


答案 2

这可能会对您有所帮助。

        JedisPool jedisPool=null;
        JedisPoolConfig poolConfig = null;

        try {

            poolConfig=new JedisPoolConfig();
            jedisPool = new JedisPool(poolConfig,"127.0.0.1" /*Host IP*/,1234 /*Port*/, 0);             
            Jedis jedis=jedisPool.getResource();            
            jedis.expire("KeyName", 10 /*Key Expires in 10 seconds*/);  

        } catch (Exception e) {

        }

推荐