首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Jedis发出Redis密钥过期通知

使用Jedis发出Redis密钥过期通知
EN

Stack Overflow用户
提问于 2014-10-16 21:56:58
回答 2查看 23K关注 0票数 17

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-16 22:12:10

您可以使用Redis发布-订阅模型来实现,只需启动Redis服务器

将redis.conf中的notify-keyspace-events更改为redis文档http://redis.io/topics/notifications中给出的KEA (这取决于您的要求).Details。

Redis Java Client (Jedis),请尝试以下操作:

通知监听程序:

代码语言:javascript
复制
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");--此方法接受完整/准确的通道名称

代码语言:javascript
复制
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*__:*");

    }

}

测试类:

代码语言:javascript
复制
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.You,将看到以下输出:

代码语言:javascript
复制
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

现在有一个用例,其中您还对过期密钥的 value 感兴趣。

备注: Redis仅在密钥到期时通过通知密钥空间事件提供密钥,密钥过期后价值丢失。为了让你的密钥的值过期,你可以做以下工作,如下所示的影子密钥的棘手概念:

在创建notify密钥时,还要创建一个特殊的即将过期的“影子”密钥(不要使实际的notify过期)。例如:

代码语言:javascript
复制
// 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中的过期消息//拆分key on“:”(或者您决定使用的任何分隔符),取第二部分获取原始key

代码语言:javascript
复制
// Then get the value and do whatever with it
GET notify
// Then delete the key
DEL notify

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

否则,您必须以这样一种方式准备您的密钥,即它包含附加在它后面的值。

希望能对你有所帮助!

票数 36
EN

Stack Overflow用户

发布于 2014-10-16 22:01:18

这可能会对你有帮助。

代码语言:javascript
复制
        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) {

        }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26406303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档