开发者学堂课程【使用 Redis 消息队列完成秒杀过期订单处理 :失效问题的分析】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/729/detail/13010
失效问题的分析
解决方案
目前企业中最常见的解决方案大致分为两种:
1. 使用定时任务处理,
定时描数据库中过期的数据,然后进行修改。但是为了更加精确的时间控制,
定时任务的执行时间会设置的很短,所以会造成很大的数据库压力。
2. 使用消息通知,
当数据失效时发送消息,程序接收到失效消息后对响应的数据进行状态修改。此种方式不 会对数据库造成太大的压力。
一起来看一下代金券过期的这个问题,目前企业当中一般是怎么去处理或者怎么去解决这些问题?
一种方式,使用叫做定时任务使用定时任务,左边是 Java 代码,每隔几分钟或者每隔多少秒也就是隔一定的时间段去扫描数据库,右边就是数据库,假如说每五秒钟扫描数据库.从数据库当中完了查询到查询到失效或者查询到过期过期的来数据,设置失效状态,这是一种方式,每间隔五秒钟就要从 Java 代码去发送一次查询到的数据库里面发现了有一些失效的一些红包或者代金券,那接着去设置它的一个失效状态,对于这种处理方式,对数据库是否会造成一些影响?
比如说数据库里面的数据量比较多。
比如说100万或者上千万条上一条的数据里面查到某几条数据啊,每五秒要查一次,不管是否有失效失效的红包或者失效优惠券都要进行查询,那这个是极大的浪费数据库的效率。
因为他总是在查询,习惯把它称之为主动的方式来做,也就是通过 Java 代码主动的查询数据库,查询到失效的订单,然后再处理这种方式的问题,显而易见,不停的在扫描数据库会造成据库来开销的一个浪费。
2、消息通知
消息通知是,假设有一台,我们定制为叫做通知服务器,这个通知服务器,它有一个前提条件,他已经知道过期订单才知道过期订单完了,等某一个订单过期的时候,或者某一个红包过期失效的时候,他能给发送一个通知,发送到Java 代码中。
会告诉这红包或者这个优惠券的一个 ID,如说1234已经失效了,就拿这个1234去查询一把,图中最右边为数据库。就可以查询数据库,接着去重置一下这条数据的状态,也就是说通过这种方式,首先,有一台服务器知道一些过期信息,就会给 java 代码端发送通知,Java 代码端就能得到失效的红包,或者优惠券的 ID,那接着查询失效数据之后,设置失效状态就可以了。
第一种方式是不断是得进行查询,第二种方式是只查询一次,然后只设置一种状态。减少了数据库得开销,当前企业中处理过期红包卡卷的方式有很多,本次列举了两种,通过分析,知道更方便实惠的方式是通过第二种消息通知来做。