熟用标点💯 悟笑空
关注数: 29 粉丝数: 50 发帖数: 887 关注贴吧数: 20
新人想了一个晚上,是先操作数据库,还是先操作缓存 假设一个业务背景 目前,某东商家有30W+,为了尽可能的更新上架新商品,这些商家会进行频繁页面操作。经统计,在所有的页面操作中,定时发布(立即发布)是深受商家喜爱的经典操作,特别是大促一结束,商家会进行高并发的发布操作,如在2020.11.12的0点,大量的商家就迫不及待的开始下架活动页面,并更新为常规页,这一波骚操作QPS竟高达2W。那么在如此高的并发下,如何让发布操作更加优雅,CPU利用率并不会因商家数量的增长而线性增长,满足商家骚操作『又快又稳』,这是值得思考的一个话题。 一个方法:先删除缓存然后操作数据库。立即发布,所谓立即发布,即是秒级甚至毫秒级的范围内看到效果。为了满足高并发的写操作,显然不能直接操作mysql等数据库,最直观的感受就是找一个替代品(即写的tps高一点的中件间),redis当仁不让。方案其实也挺简单,相关的操作优先于redis操作,然后通知消息队列更新到mysql。 但是我们先删除缓存,再更新数据库,又会出现以下问题:就是在并发情况下删除缓存后,立刻读库,此时库数据还没更新,读到了老数据,又写入了缓存,导致以后所有人读到都是缓存中错误数据。 这就是为什么一般先更新数据库,再删除缓存:存在主要问题是,更新数据库后,还没删除缓存,导致部分人读到了缓存中老数据,当缓存删除后,就可以从数据库读取正确数据,缓存也就正确,以后大部分人读到正确数据。 所以正常的操作应该是怎样,新人学java半年,不知道如何解决。
1 下一页