缓存和数据库更新的先后处理方案

解决方案
1: 写请求过来,将写请求缓存到缓存队列中,并且开始执行写请求的具体操作(删除缓存中的数据,更新数据库,更新缓存)。

2: 如果在更新数据库过程中,又来了个读请求,将读请求再次存入到缓存队列(可以搞n个队列,采用key的hash值进行队列个数取模hash%n,落到对应的队列中,队列需要保证顺序性)中,顺序性保证等待队列前的写请求执行完成,才会执行读请求之前的写请求删除缓存失败,直接返回,此时数据库中的数据是旧值,并且与缓存中的数据是一致的,不会出现缓存一致性的问题。

3: 写请求删除缓存成功,则更新数据库,如果更新数据库失败,则直接返回,写请求结束,此时数据库中的值依旧是旧值,读请求过来后,发现缓存中没有数据, 则会直接向数据库中请求,同时将数据写入到缓存中,此时也不会出现数据一致性的问题。

4: 更新数据成功之后,再更新缓存,如果此时更新缓存失败,则缓存中没有数据,数据库中是新值 ,写请求结束,此时读请求还是一样,发现缓存中没有数据,同样会从数据库中读取数据,并且存入到缓存中,其实这里不管更新缓存成功还是失败, 都不会出现数据一致性的问题。上面这方案解决了数据不一致的问题,主要是使用了串行化,每次操作进来必须按照顺序进行。如果某个队列元素积压太多,可以针对读请求进行过滤,提示用户刷新页面,重新请求。

潜在的问题:
1: 请求时间过长,大量的写请求堆压在队列中,一个读请求来得等都写完了才可以获取到数据。
2: 读请求并发高
3: 热点数据路由问题,导致请求倾斜。

最近更新

  1. TCP协议是安全的吗?

    2024-03-15 08:42:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-15 08:42:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-15 08:42:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-15 08:42:02       18 阅读

热门阅读

  1. 小程序开发——获取设备信息 API(四)

    2024-03-15 08:42:02       18 阅读
  2. Quartz项目实际使用

    2024-03-15 08:42:02       17 阅读
  3. SQL笔记 -- 黑马程序员

    2024-03-15 08:42:02       18 阅读
  4. 第十次CCF-CSP(Markdown、地铁修建)

    2024-03-15 08:42:02       20 阅读
  5. 项目示例 - 4.配置中心 - 1.Nacos

    2024-03-15 08:42:02       16 阅读
  6. WPF 两个程序之间传递参数(shell32.dll)

    2024-03-15 08:42:02       19 阅读
  7. 【C语言】宏定义的详解与实践

    2024-03-15 08:42:02       21 阅读
  8. Docker学习笔记

    2024-03-15 08:42:02       20 阅读