dao设计(一),缓存更新事件通知

场景: 在缓存应用中,我们常见做法是在增删改时使缓存失效,在查询时优先查询缓存,缓存不存在则从db中获取数据返回并更新缓存,如果我们采用一般常见写法,代码会比较冗余且有很多重复,解决这种重复代码有很多种方法,如采用模板模式,但今天我想要讲的是采用注解加事件通知方法实现。
设计:
1. 设计点在于查询,当我们调用一个查询方法时,我们希望优先查询缓存,缓存不存在则查询db,然后根据db返回结果更新缓存并返回,可以发现,几乎所有的查询方法我们都会有这样的要求。因此我们希望能够拦截想要走缓存的查询方法,此时,采用注解+aop拦截会是很不错的选择。
2. 每个查询的结果都与请求的参数有关,比如查询我的已发货订单集合,需要我的用户ID,已发货类型这2个参数。在我的已发货订单集合这个应用场景中,假设我们系统调用了发货接口,此时订单状态改变,我们需要失效我的发货订单集合这个缓存,但新增订单对此次查询不会产生影响。因此这个场景只需要关注更新这个方法,所以我们可以这么设计,新增和编辑时发出对应的add和update事件,查询我的已发货订单集合需订阅update事件。
3. 订单状态改变需要失效订单集合,简单的方法是将对应的集合数据删了,另一种方法是引入版本号,获取一个缓冲数据前先获取一下版本,然后将版本和数据key前缀组成数据查询key一起去获取数据,这样当我们需要失效数据时,只需要升级一下版本就行,版本用当前时间毫秒数即可。缓存key设计,我们自然希望每次失效的数据量最少,最好仅失效此次相关的数据,比如查询我的已发货订单集合,如果采用版本号设计,我们希望用户id和已发货类型关联的数据都失效,因此key设计成dao名称+方法+用户ID+订单状态,这样刚好失效我的已发货订单集合数据。
4. 从上面key的设计中我们可以看出,为了使key不要重复,我们采用dao名称+方法+参数去拼接,dao名称和方法基本不多,但参数却是千变万化的,对于这种变化的数据,最好能用一种通用方法获取,比如反射。
示例图:
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值