更好的使用redis来提高效率--营销中心 领取优惠券

今天考虑了一下,在现有的营销中心的架构下,如果能够更好的使用redis,甚至是把它作为缓存数据库。我们就可以在理论上实现数据库操作的异步执行。

比如领取优惠券。

1.查询优惠券信息,得到关联的活动

2.得到活动信息,是否活动中

3.查询券码表,检查用户领取该优惠券的频率是否超过活动设置

4.修改coupon表的receivedNum

5.占用券码表的记录,修改领取人信息,时间等

6.将第五步占用的券码执行查询获取,返回给调用者

 

现在我需要执行六个数据库操作,都不复杂,但是总执行时长平均在100ms,即使是现在使用redis缓存了部分数据(优惠券活动和优惠券通过查询缓存,每8秒更新一次),可以减少两次db查询。但是总时长平均也在70ms左右。

 

现在的方案:把第一第二步的数据缓存到了redis数据库,但是这个数据只存在8秒,失效后会重新查询数据库。

 

可以改进的方式:

1.为第一第二步的数据建立机制,动态更新,而不是每次执行查询时才去更新,保证数据的实时性。

2.第三步的数据不好管理,但是如果能够在redis中管理好,那么将大大减少券码表执行sql查询的次数

3.第四步中,对于coupon表来说receivedNum字段并不是必须的

它的意义主要在于:

1) 查看券码时,直接给出已领取数目,不需要再去遍历统计券码表。

2)领取优惠券时,可以直接判断是否还有剩余,不用根据更改券码表是否成功才知道是否还有剩余。

从上可以看出,receivedNum这个字段,并不必须存在于coupon表,只要缓存中能够处理好这个概念就行。那么第四步就可以舍弃。

 

最好的实现方式是:我们直接操作的其实是redis缓存中的数据,但是redis中的修改之后会异步地更新到db.估计这样可以降低到35ms吧。

 

 

你可能感兴趣的:(java,redis,db,cache)