我的编程空间,编程开发者的网络收藏夹
学习永远不晚

redis如何监控失效的key

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

redis如何监控失效的key

小编给大家分享一下redis如何监控失效的key,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!

先来看一个问题:

如何处理订单过期自动取消,比如下单30分钟未支付自动更改订单状态?

解决方案:

可以利用redis天然的key自动过期机制,下单时将订单id写入redis,过期时间30分钟,30分钟后检查订单状态,如果未支付,则进行处理但是key过期了redis有通知吗?答案是肯定的。

开启redis key过期提醒

修改redis相关事件配置。找到redis配置文件redis.conf,查看“notify-keyspace-events”的配置项,如果没有,添加“notify-keyspace-events Ex”,如果有值,添加Ex,相关参数说明如下:

K:keyspace事件,事件以__keyspace@<db>__为前缀进行发布;         
E:keyevent事件,事件以__keyevent@<db>__为前缀进行发布;         
g:一般性的,非特定类型的命令,比如del,expire,rename等;        
$:字符串特定命令;         
l:列表特定命令;         
s:集合特定命令;         
h:哈希特定命令;         
z:有序集合特定命令;         
x:过期事件,当某个键过期并删除时会产生该事件;         
e:驱逐事件,当某个键因maxmemore策略而被删除时,产生该事件;         
A:g$lshzxe的别名,因此”AKE”意味着所有事件。

redis测试:

打开一个redis-cli ,监控db0的key过期事件

127.0.0.1:6379> PSUBSCRIBE __keyevent@0__:expired
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "__keyevent@0__:expired"
3) (integer) 1

打开另一个redis-cli ,发送定时过期key

127.0.0.1:6379> setex test_key 3 test_value

观察上一个redis-cli ,会发现收到了过期的keytest_key,但是无法收到过期的value test_value

127.0.0.1:6379> PSUBSCRIBE __keyevent@0__:expired
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "__keyevent@0__:expired"
3) (integer) 1
1) "pmessage"
2) "__keyevent@0__:expired"
3) "__keyevent@0__:expired"
4) "test_key"

在springboot中使用

pom 中添加依赖

<!-- redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

定义配置RedisListenerConfig

import edu.zut.ding.listener.RedisExpiredListener;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.listener.PatternTopic;import org.springframework.data.redis.listener.RedisMessageListenerContainer;@Configurationpublic class RedisListenerConfig {    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {

        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);//        container.addMessageListener(new RedisExpiredListener(), new PatternTopic("__keyevent@0__:expired"));
        return container;
    }
}

定义监听器,实现KeyExpirationEventMessageListener接口,查看源码发现,该接口监听所有db的过期事件keyevent@*:expired"

import edu.zut.ding.constants.SystemConstant;import edu.zut.ding.enums.OrderState;import edu.zut.ding.service.OrderService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.connection.Message;import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;import org.springframework.data.redis.listener.RedisMessageListenerContainer;import org.springframework.stereotype.Component;@Componentpublic class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {    public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {        super(listenerContainer);
    }    
    @Override
    public void onMessage(Message message, byte[] pattern) {        // 用户做自己的业务处理即可,注意message.toString()可以获取失效的key
        String expiredKey = message.toString();        if(expiredKey.startsWith("Order:")){            //如果是Order:开头的key,进行处理
        }
    }
}

或者打开RedisListenerConfig中 container.addMessageListener(new RedisExpiredListener(), new PatternTopic("__keyevent@0__:expired")); 注释,再定义监听器,监控__keyevent@0__:expired事件,即db0过期事件。这个地方定义的比较灵活,可以自己定义监控什么事件。

import org.springframework.data.redis.connection.Message;import org.springframework.data.redis.connection.MessageListener;public class RedisExpiredListener implements MessageListener {    
    @Override
    public void onMessage(Message message, byte[] bytes) {        byte[] body = message.getBody();// 建议使用: valueSerializer
        byte[] channel = message.getChannel();
        System.out.print("onMessage >> " );
        System.out.println(String.format("channel: %s, body: %s, bytes: %s"
                ,new String(channel), new String(body), new String(bytes)));
    }

}

看完了这篇文章,相信你对redis如何监控失效的key有了一定的了解,想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

redis如何监控失效的key

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

redis如何设置key缓存失效时间

Redis中可以使用`EXPIRE`命令设置一个key的缓存失效时间。命令格式如下:```EXPIRE key seconds```其中,`key`为要设置失效时间的缓存的键名,`seconds`为缓存的失效时间,以秒为单位。当命令执行成功
2023-09-05

如何监听Redis中Key值的变化(SpringBoot整合)

本文介绍了如何在SpringBoot中监听RedisKey值的变化。通过导入相关依赖,定义监听器和注册监听器,可以实时响应Key值变更事件。监听器将根据Key值变更类型执行相应的业务逻辑。需要注意的是,监听器执行线程是单线程的,不适用于高频Key值变更场景。
如何监听Redis中Key值的变化(SpringBoot整合)
2024-04-02

java面试题如何监控redis

本文介绍了Java中监控Redis的多种方法,包括使用客户端库、第三方工具、JMX、指标收集库和日志记录。关键指标包括连接数、内存使用量、命中率、命令执行时间、慢查询和键过期。最佳实践包括设置警报、定期检查、优化性能和使用Sentinel或Cluster。通过监控Redis,Java程序员可以确保其稳定性和性能。
java面试题如何监控redis
2024-04-02

如何监控和管理Redis的性能

要监控和管理Redis的性能,可以采取以下措施:使用redis-cli工具:通过redis-cli工具可以实时查看Redis的性能指标,如内存使用情况、命令执行时间等。可以通过命令INFO来查看Redis的状态信息。配置Redis监控工具:
如何监控和管理Redis的性能
2024-04-09

SpringBoot如何监听redis Key变化事件案例详解

项目中需要监听redis的一些事件比如键删除,修改,过期等,下面这篇文章主要给大家介绍了关于SpringBoot如何监听redis Key变化事件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2022-11-13

redis持久化db失效如何解决

当Redis持久化的数据库(db)失效时,可以通过以下几个步骤来解决问题:1. 检查是否启用了持久化机制:使用命令`config get save`来查看Redis配置文件中是否存在`save`指令。如果没有配置持久化,需要在配置文件中添加
2023-08-31

java如何设置redis数据key的

Java如何设置Redis数据Key?这篇指南介绍了在Java中使用RedisJava库设置Redis数据key的步骤。通过连接到Redis服务器、使用set()方法设置key-value对并设置附加选项,您可以有效地管理Rediskey。库还提供其他操作,例如获取值、删除key和查询key信息。了解RedisJava文档以探索更高级别的功能。
java如何设置redis数据key的
2024-04-02

java如何判断redis的key过期

本文介绍了在Java中判断Rediskey过期的四种方法:使用expireAt()设置过期时间戳。使用expire()设置过期时间段。使用ttl()获取剩余生存时间。使用exists()检查键是否存在。
java如何判断redis的key过期
2024-04-02

如何在Redis中监控内存使用情况

可以通过Redis自带的INFO命令来查看Redis实例的内存使用情况。具体步骤如下:连接到Redis服务器,可以使用redis-cli工具连接到Redis服务器。输入INFO命令,可以查看Redis实例的各种信息,包括内存使用情况。在IN
如何在Redis中监控内存使用情况
2024-04-09

编程热搜

目录