失效问题处理:业务分析以及资料介绍| 学习笔记

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 快速学习失效问题处理:业务分析以及资料介绍。

开发者学堂课程【使用 Redis 消息队列完成秒杀过期订单处理 :失效问题处理:业务分析以及资料介绍】学习笔记,与课程紧密联系,让用户快速学习知识。

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


失效问题处理:业务分析以及资料介绍

 

内容介绍

一、业务流程

二、Java 程序实现

 

完成java 代码中获取 redis 的消息通知后,就可以使用 redis 的过期消息通知以及spring data redis 中的消息监听结合起来完成本次过期优惠券的处理。

 

一、业务流程

为了使得案例更加简单直观,业务流程分为两个部分。

1. 用户获取优惠劵

对于用户获取优惠券而言,只能根据程序进行模拟,所以采取手动创建一个优惠券保存到数据库中。

同时优惠券涉及到过期优惠券的处理,所以还需将优惠券同时保存到 redis 服务器中,给其设置一个失效时间,当其失效后借助 redis 中的机制自动发送通知。

保存到 redis 中后,因为其是一个 key 和 value 的缓存服务器,因而保存时 key 和 value 该如何取值需要明白,同时因为redis 中 key 的失效机制只会发送 key 的失效消息,所以还需要针对 key 的命名进行规范为 key(coupon:优惠券ID),同时案例中 value 并无实际用途,简写为优惠券ID即可。

  • 手动创建一个优惠券保存到数据库中
  • 同时保存到 redis 服务器中,同时设置失效时间
  • 由于 redis 中 key 的失效机制(只会发送 key 的失效消息):
  • Key(coupon:优惠券 ID)-value(优惠券 ID)

2. 过期优惠券的处理

过期优惠券的处理是通过 spring data redis 来做的,在之前也有过讲解,在此主要需要明确订阅的主题为keyevent@dbindex 即 key 的失效通知事件,可以变为@0表示将其放入0号数据库中。

配置消息的主题后还需要配置消息的监听器,在消息的监听器中需要获取到失效消息,从失效消息中分离出优惠券 id,而失效消息只会发送 key 的失效消息,所以失效消息的主体为 key:coupon :优惠券 id,获取之后就是查询数据库,同时修改优惠券状态。

  • 订阅的主题:__keyevent@0__:expired
  • 配置消息监听器

获取到失效消息(coupon:优惠券 id),从失效消息中分离出优惠券。

查询数据库,修改优惠券状态。

以上就是所有的处理逻辑。


二、java 程序实现

知晓业务逻辑后,可以看到如图有两个程序,其中 coupon-achieve 对应着用户获取优惠券;coupon-expired 是用来模拟过期优惠券的处理,在其中就用于处理过期优惠券。

图片5.png

同时因为其涉及了一些数据库表的操作,所以需要对数据库表有一定了解。此图中数据库表是为了模拟而做的一张数据库表。

其中含有 id,优惠券名称,金额,优惠券说明,获取时间和失效时间以及状态等等。

图片6.png

  • 建表语句如下:

Create Table

CREATE TABLE 't_coupon`(

`id` bigint(2RNOT NULL AUTO_INCREMENT COMMENT'主键',

'name ` varcha60) DEFAULT NOLL COMMENT'优惠券名称',

'money decima1 (10,0)DEEAULT NULL COMMENT '金额',

‘coupon_desc` varchar(128) DEEAULT NULL COMMENT'优惠券说明',

' create_time datetime DEFAULT NOLL COMMENT'获取时间',

'expire_time’ datetime DEFAULT NULL COMMENT'失效时间',

'state' int(1) DEEAULT NULL COM4ENT '状态。0-有效,1-己失效,2-己使用',PRIMARY KEY (id`)

)ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8

用户需要获取优惠券时就相当于向表中保存一条记录,接着再向 redis 服务器中存储一条记录,有了存储记录后,获取优惠券的操作就此结束。等待优惠券失效后,再借助 redis 的失效 key 机制,在第二个程序 coupon-expired 中获取到失效 key 再去处理优惠券。

图片7.png

了解完流程和数据库表后,为了演示方便,老师已经将底层代码准备好,代码主要是由 mybits 基础操作数据库的代码,其中都为简单的根据 id 查询,在此不做详细说明。

  • 简单 id 查询:

<select id="selectCouponById" resultMap="BaseResultNap" parameterType="Long">

selectinclude refid="Base_Column_List"/〉 from〈include refid="table" /> where id =#{id, jdbcType=BIGINT}</select>

  • 简单的保存:

〈insert id="saveCoupon”parameterType="cn.itcast.entity.Coupon"useGeneratedKeys="true" keyProperty="id">

insert into<include refid="table/> (name ,money , coupon_desc ,create_time,expire_time,state)

values ( #{name},#{ money} , #{ couponDesc} , #{createTime}, #{expireTime}, #{state})

</insert>

  • 简单的更新语句:

<update id="updateCoupon" parameterType="cn.itcast.entity.Coupon">

update <include refid="table/>

set name = #{name},

money = #{money},

coupon_desc = #{couponDesc},

create_time = #{ createTime},

expire_time = #{expireTime},

state = #{state,jdbcType=INTEGER}

where id = #{id,jdbcType=BIGINT}

</update>

最后以上操作无论是使用 mybits 框架还是 hibernate 框架以及原生 jdbc 操作都可以。

相关实践学习
基于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
相关文章
|
8月前
|
缓存 监控 NoSQL
解析Redis缓存雪崩及应对策略
解析Redis缓存雪崩及应对策略
如何进行有效的业务影响分析(BIA)?
如何进行有效的业务影响分析(BIA)?
|
8月前
|
Oracle 数据库 UED
后台查询接口影响响应时间最大的因素:用空间换时间的优缺点及解决方案
1.当数据库的一个表记录很多显然查询数据很慢。 2.当数据库的一个表记录不大,但是数据很大也可能很慢。 我们的一个用户表中一个building很大,当查询100条数据就会把服务器的内存搞爆掉。 当然查询时要查询筛选有用字段,不可以直接把记录的所有字段都查拆来。这样能减少内存消耗和提高查询速度。 3.在经常查询字段上建立索引。据说oracle上用索查询和不用索引查询在超多记录的情况下相差1000倍。 4.若出现嵌套查询显然会大大增加相应查询时间。要先预处理用管道操作把能合并的查询合并到一个查询中,然后生成map,然后再处理。这是标准的用空间换时间的方案。
109 8
|
5月前
|
Docker 容器
典型热点应用问题之追求60秒构建时间目标的问题如何解决
典型热点应用问题之追求60秒构建时间目标的问题如何解决
|
6月前
|
中间件 存储 SQL
分库分表优化:换中间件 二次查询
【7月更文挑战第7天】
66 15
|
5月前
|
Java
典型热点应用问题之启用增量编译的问题如何解决
典型热点应用问题之启用增量编译的问题如何解决
|
8月前
|
SQL 存储 关系型数据库
真正线上索引失效的问题是如何排查的
MySQL索引失效是一种常见问题,在处理慢查询时经常需要考虑索引失效的可能性。 针对索引失效的排查,关键步骤包括确定需要分析的SQL语句,并通过`EXPLAIN`查看其执行计划。主要关注`type`、`key`和`extra`这几个字段。
真正线上索引失效的问题是如何排查的
|
消息中间件 存储 资源调度
订单超时处理的几种方案及分析
描述业务常见的订单超时处理的几种方案及分析
32005 19
订单超时处理的几种方案及分析
|
机器人 vr&ar
案例19-生产事故临时解决和最终解决方案
生产事故临时解决和最终解决方案
204 0
案例19-生产事故临时解决和最终解决方案
|
关系型数据库 MySQL 大数据
MySQL索引失效的原因及应对策略
引言 在大数据时代,数据库管理成为了每个开发者必备的技能之一。MySQL作为全球最受欢迎的开源关系数据库管理系统,深受开发者们的喜爱。为了提高查询效率,我们常常会在MySQL中使用索引,但有时候你会发现,索引并没有发挥出预期的作用,原来,它已经“失效”了。本文将带你探索MySQL中索引失效的原因以及如何避免,让我们一同跨入数据库的奇妙世界。
1151 0