张晓 2017-01-26
背景介绍:
今年第二个重要的优化是会员优化,具体流程见下图:
为啥要做优化呢?因为在我们的场景中会员其实是少数,大多数用户其实都不是会员,但是每个用户比如说购买某些商品的时候,都要去查询一遍是否是会员,因为针对会员的话我们要展示一些会员价嘛。其实我们的会员接口是有缓存的,按理说正常不会很慢。但是细想比如你1000w用户,1w会员用户,那么1000w次查询,只有1w次能命中缓存,那么999w次都要走到db。 无奈我们的db略坑,每w次调用,总有那么一两次很慢,经过sql reivew发现也没啥问题,也都走了正常的索引了。这样就导致了经常会有dubbo超时的报警了,无奈只好优化代码了,提高缓存命中率,尽量少的走db,以空间换时间了。
技术优化:
1.本地存根 2. fake缓存
具体优化流程见下图:
说明:
1. 当库里面读不到会员信息的时候,写个fake对象到cache里面关键属性为空。
2. 处理fake的地方有两个一个是在api里面,防止哪个消费者使用了本地存根,直接读取account缓存,关键属性为空会导致那些应用空指针的问题。如果消费者不走本地缓存则直接走dubbo接口,所以dubbo实现里面对获取的缓存对象做是否fake的处理再返回给消费方。
3. 所有涉及会员更新或者插入的操作都要删除缓存,之前我就是由于插入会员的时候缓存没有删掉,导致了一个bug。一开始会员记录没有,插入会员的时候不用删除缓存没问题的原因是缓存里面压根就没有任何会员的信息,但是fake了会员对象就一下子不同了。