当前位置: 首页 > 知识库问答 >
问题:

Jedis的Redis密钥过期通知

巫马俊力
2023-03-14

当我的密钥在redis数据存储中过期时,我试图用redis实现过期密钥通知。redis网站提供了一些如何http://redis.io/topics/notifications,但我找不到任何像Jedis这样使用redis java客户端的例子?

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

共有2个答案

史懿轩
2023-03-14

这可能会对你有所帮助。

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

        }
卞经业
2023-03-14

您可以使用pub-sub模型仅启动Redis服务器

将redis.conf中的通知键空间事件更改为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__:通知");--此方法采用完整/准确的通道名称

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仅在密钥过期时通过通知密钥空间事件提供密钥,一旦密钥过期,值将丢失。为了获得密钥到期时的值,您可以使用阴影密钥这一棘手的概念进行如下处理:

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

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

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

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

请注意,未使用shadowkey的值,因此您希望使用尽可能最小的值,可以是空字符串“”。这是一个多一点的工作来设置,但上述系统正是你所需要的。开销是实际检索和删除密钥所需的几个额外命令加上一个空密钥的存储成本。

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

希望对你有帮助!

 类似资料:
  • 问题内容: 当我的密钥在Redis数据存储区中过期时,我正在尝试使用Redis实施过期密钥通知。redis网站提供了一些有关http://redis.io/topics/notifications的描述,但是我无法找到任何示例,例如使用Jedis的redis java客户端如何做到这一点? 任何可能的带有插图的代码都将非常有用,因为它们是redis的新功能。 问题答案: 您只能使用 pub-sub

  • 问题内容: 当我的Redis存储区中的易失性密钥过期时,我想收到通知。redis网站在http://redis.io/topics/notifications中提供了一些有关如何实现此目标的描述,但我想知道是否可以使用python redis api来完成。 设置后:在我的redis.conf文件中 并进行测试: 仅在被调用时被调用,但没有按预期在五秒钟后被调用 问题答案: 惊喜(当密钥的生存时间

  • 当我的redis存储中的易失性密钥过期时,我希望得到通知。redis网站提供了一些关于如何在http://redis.io/topics/notifications中实现这一点的描述,但我想知道是否可以使用python redis api来完成。 设置后: 并将其作为测试运行: 只有在被调用时才被调用,但没有像预期的那样晚五秒钟

  • 在这个expire方法中,我们需要提供而不是。但是我需要过期而不是。 那么,请帮助我如何处理过期?

  • 问题内容: 当生存时间达到0时,我的Redis服务器不会删除密钥。 这是一个示例代码: 如果我通过redis检查信息返回,它说0个密钥已过期。 任何想法? 谢谢。 问题答案: 由于您正在执行“ …”,因此很难确定,但是我要说的是您在该部分设置了mykey,这将有效地消除过期。 从EXPIRE手册 仅当使用DEL命令删除密钥或使用SET或GETSET命令覆盖密钥时,才清除超时 另外,关于TTL的-1

  • 14:52:46.692[pool-1-thread-12]信息EndtoEnditTests-设置版本时间1548062566687 14:52:46.693[pool-1-thread-6]信息EndtoEnditTests-设置版本时间1548062566687 14:52:46.693[pool-1-thread-20]信息EndtoEndittest-设置版本时间154806256668