借助 redis 的 key 失效通知设置优惠券状态| 学习笔记

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 快速学习借助 redis 的 key 失效通知设置优惠券状态。

开发者学堂课程【使用 Redis 消息队列完成秒杀过期订单处理 :借助 redis 的 key 失效通知设置优惠券状态】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/729/detail/13022


借助 redis 的 key 失效通知设置优惠券状态

 

内容介绍

一.配置监听 redis 的通知

1. 定义一个消息的监听器

2.将监听类配置到 Spring 配置文件中去

3.编写测试

 

一、配置监听 redis 的通知

Coupon-achieve 中创建好了一张优惠券,并且存入到数据库,同时再 redis 设置了其失效时间后,在第二个程序 coupon-expired 中配置监听器,去监听 reids 失效 key 的通知,在其中配置或监听 redis 的通知操作步骤为两步:

图片1.png

1.定义一个消息的监听器

在 listener 包下创建一个 RedisMessageListener 类同时添加 MessageListener 接口,实现后在 onMessage 方法中去处理消息。

图片2.png

package cn.itcast.redis.listener;

import org.springframework.data.redis.connection.Message;

public class RedisHessageListener implements MessageListener {

//因为需要运用到数据库,注入数据库相关,在此使用 mybits,hmerinate 和 jdbc 都行

@Autowired

private CouponMapper couponMapper;

//处理消息

/**

*完整的处理逻辑如下:

*此时获取的为失效 key 通知

*发送的消息为:key(coupon: 优惠券 id)

* 因此需要的步骤有:

*1.接收到消息获取消息(同时因为获取消息有许多,还需要验证是否是优惠券失效的key)

*2.验证通过后,再从消息中分离出优惠券id

*3.查询数据库获取优惠券对象

*4.设置失效状态,更新数据库

*

*/

public void onMessage(Message message,byte[] pattern){ //通过传入的 message 的 getBody() 方法得到 key,同时还需要强转为 String 类型,因为 getBody() 函数返回值是一个 byte[]数组

String key = new String (message.getBody());

//判断是否是对优惠券的处理,通过if来判断,判断条件为 coupon,因为所有的优惠券都是用 coupon 进行验证的

if(key.startswith( "coupon")) {

//是 coupon 表示对优惠券的处理,之后分离出优惠券 id,在此使用冒号:来拆分数组得到第二个元素 id

String id = key.split(": ")[1];

//得到 id 之后开始查询数据库来获取优惠券对象,在此调用 couponMapper 中的 selectCouponById 方法,同时传入一个 long 类型的参数,而这采用 Long.parseLong(id) 进行了强制转换为 long 类型

Coupon coupon = couponMapper. selectCouponById(Long.parseLong(id));

//设置它的状态,0-有效,1-失效,2-已使用,所以在此设置状态为1已失效

coupon.setState(1);

//同时将 coupon 对象传入,借助 couponMapper 更新

couponMapper.updateCoupon(coupon);

}

}

}

到此全部的处理过程就已经全部结束。

2.将监听类配置到 Spring 配置文件中去

而配置了一个监听类后还需要将其配置到 Spirng 配置文件中去。

图片3.png 

首先打开 resources 中的 applicationContext.xml 配置文件,即其主配置文件,其中定义了数据库操作相关内容,同时其中还引入了 applicationContext-data-redis.xml 配置文件,打开后可以看到其中定义了 redisTemplate、connectionFactory 和 poolConfig 等等,以及消息监听,而消息监听中的<constructor-arg></constructor-arg>注入的就是自定义的监听类。

  • 代码如下:

<! --配置监听-->

<bean class="org.springframework.data.redis.listener.adapter.NessageListenerAdapter" id="messagelListener">

<constructor-arg>

<bean class="cn.itcast.redis.listener.RedisMessggeListener"/>

</constructor-arg>

</bean>

但在监听容器中的<constructor-arg>的value值不能和之前测试类一样写为随意的 ITCAST,而必须改为__keyevent@0__:expired。

  • 代码如下:

<!--监听器容器-->

<bean class="org.springframework.data.redis.Listener.RedisMessageListenerContainer" id="redisContainer">

<!--

*由于需要和 redis 进行交互,注入连接工厂

1.订阅的消息主题

2.接收到消息之后处理的监听器

-->

<property name="connectionFactory" ref="connectionFactory">

</property>

<property name="messageListeners">

<map>

<entry key-ref="messageListener">

<! -- topic 的集合:订阅的主题

订阅了一个主题消息:主题的名称(ITCAST)

接收到一条消息之后,交由自定义的消息监听器来进行处理-->

<list>

<bean class="org. springframework.data.redis.listener.ChannelTopic>

<constructor-arg value="__keyevent@0__:expired"></constructor-arg>

</bean>

</list>

</entry>

</map>

</property>

</bean>

</beans>

3.编写测试

完成了监听和配置到 Spring 配置中后,编写程序让 spring 容器去加载消息监听器让其一直不断的监听 redis 服务器通知。测试的代码核心主要为重写一个 main 方法,再在其中使用 ApplicationContext。

  • 测试类 RedisTest2 的代码如下:

package cn.itcast.redis;

import org.springframework.context.ApplicationContext;

public class RedisTest2{

public static void main(String[]args) {

ApplicationContext ac = new ClassPathxmlApplicationContext("applicationContext.xml");

}

}

Run AS 等待运行成功后,再次运行 CouponTest 就能够获取新的优惠券,当一分钟的失效时间过后,查看是否将优惠券的状态置为失效。可以看到优惠券上又添加了一条新的数据,状态为0。

图片4.png

在 redis 服务器中输入命令行:keys *也可以查看到 coupon:10这条 id 为10优惠券的新记录出现,输入 ttl coupon:10查看该优惠券的失效时间,等待失效时间过去后关闭服务器,可以看到在控制台显示发送了一条数据,同时伴随这许多的 sql 语句,再次查看数据库后,点击刷新,会发现,状态由0变为1,说明当前借助 redis 消息通知成功的将优惠券的状态变为了失效状态。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
|
3天前
|
存储 缓存 NoSQL
Redis 大 Key 对持久化的影响及解决方案
Redis 大 Key 对持久化的影响及解决方案
11 1
|
1月前
|
存储 缓存 NoSQL
Redis中大Key与热Key的解决方案
在工作中,Redis作为一款高性能缓存数据库被广泛应用,但常遇到“大key”和“热key”问题。“大key”指单个键包含大量数据,导致内存消耗高、性能下降及持久化效率降低;“热key”则是频繁访问的键,会引起CPU占用率高、请求阻塞等问题。本文详细分析了这些问题的定义、影响、原因,并提供了相应的解决方案,如合理设置缓存时间和数据结构、拆分大key、采用热点数据分片等方法。
Redis中大Key与热Key的解决方案
|
20天前
|
缓存 NoSQL PHP
使用PHP-redis实现键空间通知监听key失效事件的技术与代码示例
通过上述方法,你可以有效地在PHP中使用Redis来监听键空间通知,特别是针对键失效事件。这可以帮助你更好地管理缓存策略,及时响应键的变化。
53 3
|
3天前
|
存储 缓存 NoSQL
Redis过期Key的清理机制
Redis过期Key的清理机制
13 0
|
1月前
|
NoSQL Linux Redis
Linux Redis 服务设置开机自启动
【9月更文挑战第2天】在 Linux 系统中,可使用两种方法设置 Redis 开机自启动:一是通过创建 `redis.service` 文件并利用 systemd 进行管理,包括定义服务参数和启动脚本;二是编辑 `/etc/rc.local` 文件,在其中添加启动命令。推荐使用 systemd 方法,因为它更符合现代 Linux 系统的设计理念。设置完成后,可通过 `sudo systemctl status redis.service` 检查服务状态。
|
2月前
|
存储 NoSQL Redis
【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)
【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)
【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)
|
2月前
|
存储 缓存 NoSQL
【Azure Redis 缓存 Azure Cache For Redis】如何设置让Azure Redis中的RDB文件暂留更久(如7天)
【Azure Redis 缓存 Azure Cache For Redis】如何设置让Azure Redis中的RDB文件暂留更久(如7天)
|
2月前
|
缓存 NoSQL 关系型数据库
Redis学习总结
Redis学习总结
33 1
|
2月前
|
NoSQL Redis
Redis——大批量删除redis的key
Redis——大批量删除redis的key
42 1
下一篇
无影云桌面