高并发情况下,数据库与缓存数据不一致问题

1. 背景

项目里面遇到一个高并发场景,商品定价是通过定价策略实现的,为提升效率,批量采用多线程处理。先读取这家店铺最新的定价策略,有缓存读缓存,无缓存读数据库,再通过计算生产商品的售价,同时会将这家店铺的定价策略存入缓存A中。在管理端可以编辑定价策略,每次编辑之后会删除缓存A,随后批量会从数据库读取最新的缓存,进而对商品的售价进行更新。

2. 问题

在管理端编辑完定价策略后,定价策略缓存A被删除,批量成功执行之后,商品售价没有按照最新的定价策略来生成。

3. 问题原因

原来定价策略缓存A被一家店铺的所有商品所共用,并发情况下,商品进行售价计算逻辑较复杂,因此耗时较高,在一个线程进入读取旧缓存定价策略后,管理端才编辑操作,删除了旧缓存,但是程序中的定价策略还是旧的,所以在计算完商品售价,再将旧的定价策略更新为定价策略存入缓存A中,由并发不断刷新,所以这个缓存一直不失效。

4. 解决方案

此问题的根本原因是不应该用缓存中的旧数据来再次更新缓存,可以通过判断如果是数据库读取的数据则更新缓存,这样缓存在缓存时间结束后将消失。同时会有新的批量读取缓存中的最新定价策略来更新缓存。
这种方案即使有3. 问题原因中的情况出现,也只会延时这个缓存时间后生效,随后将从数据库读取最新的定价策略来进行商品售价的更新。

你可能感兴趣的:(后端,数据库)