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

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

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

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

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

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

相关推荐
郝学胜-神的一滴1 分钟前
Qt删除布局与布局切换技术详解
开发语言·数据库·c++·qt·程序人生·系统架构
小丁爱养花1 小时前
Redis - set & zset (常用命令/内部编码/应用场景)
数据库·redis·缓存
GottdesKrieges2 小时前
OceanBase集群诊断工具:obdiag
数据库·sql·oceanbase
大G的笔记本2 小时前
用 Redis 的 List 存储库存队列,并通过 LPOP 原子性出队来保证并发安全案例
java·数据库·redis·缓存
流子3 小时前
etcd安装与配置完全指南
数据库·etcd
涔溪3 小时前
在 Electron 框架中实现数据库的连接、读取和写入
javascript·数据库·electron
少年攻城狮3 小时前
OceanBase系列---【如何把一个表改造成分区表?】
数据库·sql·oceanbase
l1t3 小时前
对luasql-duckdb PR的测试
c语言·数据库·单元测试·lua·duckdb
l1t3 小时前
利用DeepSeek辅助改写luadbi-duckdb支持日期和时间戳数据类型
c语言·数据库·人工智能·junit·lua·duckdb·deepseek