在 Redis 中怎么实现代码出现异常时数据回滚

2016-12-01 10:47:23 +08:00
 suyuanhxx

场景:一段代码中有两处数据库操作(保存和更新,先保存后更新,两张表),保存数据库同时将数据保存到缓存,更新数据库时同时更新缓存。当更新数据库代码出现异常时,数据库可以使用事务的方式实现回滚,如果这时已经保存到缓存的数据怎么回滚?

当然可以在异常捕获中删除缓存,这样子有点粗暴...

如果是先更新后保存,缓存是不是回不去了?示意图我就不贴了,相信 V 站大神都能看懂

7408 次点击
所在节点    Redis
22 条回复
suyuanhxx
2016-12-01 11:07:22 +08:00
是不是节点选错了...
server
2016-12-01 11:11:52 +08:00
为啥已经要把缓存放到事务里
virusdefender
2016-12-01 11:14:23 +08:00
lrh3321
2016-12-01 11:21:31 +08:00
不是应该 更新 /保存 成功以后,再去更新缓存的吗?
est
2016-12-01 11:36:30 +08:00
coolshell 缓存更新的套路

http://coolshell.cn/articles/17416.html
suyuanhxx
2016-12-01 12:49:24 +08:00
@server
@lrh3321 公司代码习惯, service 层保存数据库时立马保存到缓存,防止忘记数据缓存
suyuanhxx
2016-12-01 12:50:04 +08:00
@est
@virusdefender 3Q ,我去看看
moro
2016-12-01 13:05:57 +08:00
redis 事务这章你看看能不能满足你的要求。
https://redis.io/topics/transactions
jyf
2016-12-01 13:18:18 +08:00
mvvm
suyuanhxx
2016-12-01 13:39:16 +08:00
@moro redis 事务我们有用,但不是这个场景,并发更新缓存时使用。这个场景是读写数据库和缓存的问题
Mirana
2016-12-01 13:58:07 +08:00
先更新数据库 在更新缓存,要不会有并发一致性的问题
suyuanhxx
2016-12-01 13:59:52 +08:00
@Mirana 你说的是应该是异步执行, pub sub 的模式?
Mirana
2016-12-01 14:24:02 +08:00
@suyuanhxx 不是啊 业务里实现就可以,写不去更新缓存,写成功让缓存失效,读 miss 之后去数据库拉然后回种
moro
2016-12-01 14:36:35 +08:00
先淘汰缓存,不能避免同时被读旧数据而载入缓存,还是会有脏数据。
MrJing1992
2016-12-01 15:01:18 +08:00
先淘汰缓存也有问题的。
suyuanhxx
2016-12-01 19:52:54 +08:00
@Mirana 按照你的思路,写成功-》淘汰缓存-》如果更新失败-》数据库回滚,(如果更新成功也是一样)缓存一定 miss ,拉取数据库数据到缓存。那我们就要重新设计缓存思路,也就是只在读时将数据存到缓存,而且数据第一次被都读时缓存一定 miss 。或者将这一次存储时只存数据库。这样写代码不够优雅....(此处鬼脸)。如果先先更新,后保存就不适用了.....
suyuanhxx
2016-12-01 19:58:40 +08:00
@moro 高并发时会有脏数据产生,在淘汰掉缓存后和更新时第二张表时此时发生读操作,就会产生脏数据。可以使用 redis 中的事务 watch key 防止此时的都操作产生的脏数据。
Mirana
2016-12-01 23:41:09 +08:00
@suyuanhxx 写成功,为什么会更新失败呢。 我说的写成功是指数据库事务都提交了才算。。
suyuanhxx
2016-12-02 09:39:51 +08:00
@Mirana 场景里面提到了,保存是一张表,更新是一张表,两张表都可能出错
suyuanhxx
2016-12-02 09:44:04 +08:00
@Mirana 如果保存和更新同时使用事务包裹,在这个事务执行时高并发情况下读的还是脏数据。而且我这个还是对整个 list 进行遍历读写....

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/324506

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX