背景:
需求:
预先创建一批 coupons ,存到 coupons 表里面,然后将这些 coupons 发给用户,要求是一个 coupon 只能发给一个用户,不能重复发放。
分配性能越高越好。
现状:
- coupons 分配服务有多实例
- 其他服务请求 coupons 分配服务获取 coupon
当前方案:
两个步骤:
- 随机读一个 coupon
- 分配 coupon 使用数据库事务+乐观锁,保证不重复分配
所以优化重点是:尽量少访问数据库;随机读到的 coupon 尽量不要冲突。
优化方案:
预读取 100 个 coupons 到内存,分配的时候优先从缓存中读取,缓存没有从数据库再读一批。
为了解决多实例读取冲突问题,在 redis 记录一个 coupon id 作为 cursor ,每读一批,将 redis 中的 cursor 更新为最新的,下一批读取的是,id > cursor 的 coupons 。
redis 可以做到 cas 更新 cursor ,可以保证读取的每一批都不会重复。
cursor 也是 30min 失效,下一次继续从 0 开始,就算读取了一批,但是没有分配,然后挂了,被跳过的 coupons 还是会有机会读到的。
求教
因为公司大佬觉得引入 redis ,方案比较复杂,不好维护;想跟大家请教下,看有没有什么更简洁的方案,不用引入数据库以外依赖