缓存+数据库读写模式
设计过程
- 请求读数据,先读缓存,缓存没有则读数据库。
- 更新数据库数据,在删除缓存。
- 再次读取数据时候,在计算缓存数据(用缓存在算缓存(lazy))。
上述过程,如果在删除缓存的时候失败,会导致当前缓存的是旧数据(与数据库不一致)。
过程修改1
- 读数据,先读缓存,缓存没有则读数据库。
- 先删除缓存,然后在更新数据库数据。
- 再次读取数据时候,在计算缓存数据。
上述过程,在产生读写并发时,会出现:请求A正在跟新数据,处于缓存删除了且数据库没有更新阶段,此时有另外一个读请求B,请求数据,从缓存中发现数据为空,从数据库获取数据并新建缓存,此时的缓存是旧数据(A请求的修改数据之前)。
过程修改2
- 新建队列,用于该缓存在没有缓存的时候,将更新读请和后面的读请求串行化执行。
- 将更新请求放入队列中。等待执行。
- 读请求,先读缓存,缓存没有,则将读请求(附带写缓存操作)放入队列中(如果队列最后一个是读请求,就可以让次请求等待200ms(不添加到队列中且不做写缓存操作),避免后面读请求串行化执行,导致请求处理过慢),等待执行。
- 队列先进先出,先处理修改请求,删除缓存,修改数据库。
- 在处理读缓存,读取数据库后新建缓存。
注意:以上是在单服务的情况下,在分布式服务中要使用分布式队列