Redis 触发器

Redis 触发器

监听 Redis 中Key超时失效的事件

Redis中的key可以设置生存时间,当该key超时失效时会触发一个事件

“过期事件通过Redis的订阅与发布功能(pub/sub)来进行分发。”

首先需要修改Redis 的配置文件,将 notify-keyspace-events 的值改为 Ex

1.监听程序


import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisPubSub;
 
/**
 * 监听器,监听redis中键到期自动删除事件,(键需要设置过期时间)
 * 
 * 需要在redis配置文件中设置 notify-keyspace-events 的值为 Ex
 */
public class RedisTimerListener extends JedisPubSub {
 
    //获取jedis连接
    Jedis jedis ;
    public void init(){
 
        JedisPool jedisPool = new JedisPool(new JedisPoolConfig(),"127.0.0.1",6379,0,"redis",0);
        jedis = jedisPool.getResource();
    }
 
    /**
     * 监听器被加载时执行该方法
     */
    @Override
    public void onPSubscribe(String pattern, int subscribedChannels) {
        init();
        System.out.println("onPSubscribe "
                + pattern + " " + subscribedChannels);
    }
 
    /**
     * 键到期自动删除时触发该方法
     */
    @Override
    public void onPMessage(String pattern, String channel, String message) {
        init();
        System.out.println(jedis.get(message));
        System.out.println("onPMessage pattern "
                        + pattern + " " + channel + " " + message);
        
    }
 
 
}

2.订阅者

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
 
/**
 * 订阅者   
 */
public class RedisSubscribe {
  
    public static void main(String[] args) {
        
 
        JedisPool jedisPool = new JedisPool(new JedisPoolConfig(),"127.0.0.1",6379,0,"redis",0);
        Jedis jedis = jedisPool.getResource();
        
        //订阅信息
        jedis.psubscribe(new RedisTimerListener(), "__keyevent@0__:expired");
        
    }
 
}

3.测试类

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
 
/**
 * 测试类
 */
public class RedisTimerTest {
    
    public static void main(String[] args) {
        
        JedisPool jedisPool = new JedisPool(new JedisPoolConfig(),"127.0.0.1",6379,0,"redis",0);
        Jedis jedis = jedisPool.getResource();
        
        
        //将键放入redis,并设置生存时间 5s
        jedis.set("shorderid_12", "a12");
        jedis.expire("shorderid_12", 5);
        
        //删除键  (手动删除键时不触发事件)
        jedis.del("shorderid_12");
 
        jedis.set("shorderid_14", "a14");
        jedis.expire("shorderid_14", 7);
        
//        jedis.del("shorderid_14");
 
    
    }
 
}
 

注意:

过期监听的管道默认是__keyevent@0__:expired,艾特后面的0表示第几号是数据库,(0-15)

作者:liyongbing1122
来源:CSDN
原文:https://blog.csdn.net/liyongbing1122/article/details/80888790
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中使用Redis到期触发器可以实现在某个key过期时自动执行一些操作,比如删除相关的数据或发送通知等。 在Spring Boot中,可以通过使用RedisTemplate来操作RedisRedisTemplate中有一个方法叫做opsForValue(),可以返回一个ValueOperations对象,用于操作String类型的数据。在ValueOperations对象中,可以使用expire()方法设置key的过期时间,使用getExpire()方法获取key的过期时间。 当key过期时,Redis会自动触发一个事件,可以通过配置一个监听器来处理这个事件。在Spring Boot中,可以使用@EventListener注解来定义一个监听器,然后使用@RedisKeyExpired注解来监听Redis的key过期事件。 下面是一个示例代码: ``` @Component public class RedisKeyExpiredListener { @Autowired private RedisTemplate<String, String> redisTemplate; @EventListener public void onKeyExpired(RedisKeyExpiredEvent<String> event) { String key = event.getKey(); System.out.println("Key " + key + " expired"); // do something here } public void setKey(String key, String value, long expireTime) { ValueOperations<String, String> ops = redisTemplate.opsForValue(); ops.set(key, value); ops.expire(key, expireTime, TimeUnit.SECONDS); } } ``` 在上面的代码中,RedisKeyExpiredListener是一个监听器,用于处理Redis的key过期事件。setKey()方法用来设置一个key并设置过期时间。当key过期时,onKeyExpired()方法会被自动调用,可以在这里处理一些业务逻辑。 要使用RedisKeyExpiredListener,需要在配置文件中添加以下配置: ``` spring.redis.listener.enabled=true ``` 这样就可以在Redis中使用到期触发器了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值