借助 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
相关文章
|
4月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
|
1月前
|
消息中间件 缓存 NoSQL
Redis 高并发竞争 key ,如何解决这个难点?
本文主要探讨 Redis 在高并发场景下的并发竞争 Key 问题,以及较为常用的两种解决方案(分布式锁+时间戳、利用消息队列)。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Redis 高并发竞争 key ,如何解决这个难点?
|
1月前
|
存储 监控 NoSQL
Redis大Key问题如何排查?如何解决?
Redis大Key问题如何排查?如何解决?
73 0
Redis大Key问题如何排查?如何解决?
|
1月前
|
存储 NoSQL 算法
面试官:Redis 大 key 多 key,你要怎么拆分?
本文介绍了在Redis中处理大key和多key的几种策略,包括将大value拆分成多个key-value对、对包含大量元素的数据结构进行分桶处理、通过Hash结构减少key数量,以及如何合理拆分大Bitmap或布隆过滤器以提高效率和减少内存占用。这些方法有助于优化Redis性能,特别是在数据量庞大的场景下。
面试官:Redis 大 key 多 key,你要怎么拆分?
|
2月前
|
NoSQL 数据可视化 Linux
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
本文介绍了Redis的两个可视化管理工具:付费的Redis Desktop Manager和免费的Another Redis DeskTop Manager,包括它们的下载、安装和使用方法,以及在使用Another Redis DeskTop Manager连接Redis时可能遇到的问题和解决方案。
156 1
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
|
2月前
|
NoSQL Unix Redis
Redis 键(key)
10月更文挑战第15天
42 1
|
2月前
|
NoSQL Linux Redis
Docker学习二(Centos):Docker安装并运行redis(成功运行)
这篇文章介绍了在CentOS系统上使用Docker安装并运行Redis数据库的详细步骤,包括拉取Redis镜像、创建挂载目录、下载配置文件、修改配置以及使用Docker命令运行Redis容器,并检查运行状态和使用Navicat连接Redis。
345 3
|
2月前
|
缓存 监控 负载均衡
如何解决Redis热点Key问题?技术干货分享
【10月更文挑战第2天】在Redis的使用过程中,热点Key问题是一个常见的性能瓶颈。热点Key指的是那些被频繁访问的Key,它们可能导致Redis服务器的负载不均衡,进而影响整体性能。本文将深入探讨热点Key问题的成因、影响以及多种解决方案,帮助读者在实际工作中有效应对这一挑战。
124 3
|
2月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
42 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
2月前
|
存储 Prometheus NoSQL
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
34 3