请问 分布式环境下,怎么实现(DB+缓存)的原子操作?

罗键键 2016-05-23 11:45:42
请问 分布式环境下,怎么实现(DB+缓存)的原子操作?

比如要更新序号为1的DB行数据,同时去设置key为1的缓存数据;因为DB操作和缓存操作无法原子,导致AB两机器去做DB和缓存操作时,A更新了DB,而缓存更新滞后,这时B更新了DB,B更新了缓存,此时A滞后的缓存更新也完成了。
结果变成缓存是A设置的,DB是B设置的,数据就会不统一。

请各位提供提供思路。
...全文
508 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
瑞卡哥哥 2016-06-07
  • 打赏
  • 举报
回复
引用 8 楼 luoyuehao 的回复:
[quote=引用 7 楼 zhouqinghe24 的回复:] [quote=引用 1 楼 cyz51781 的回复:] 可以这样,只要数据库发值发生变化,则删除对应的缓存数据,下次查询的时候如果缓存没有数据则从数据库获取加载到缓存,这样就不会出现误读现象,按理缓存数据应该是不会经常变化的,也不会影响效率。
这样缓存命中率 大大降低了 http://blog.csdn.net/ugg/article/details/41894947 http://blog.csdn.net/java2000_wl/article/details/8740911[/quote] 赞,这个确实可行呢。不知对redis造成多大影响,得压测看看。 不知有没有其他实现方案。[/quote] 可以去尝试一下. 不要做伸手党
罗键键 2016-06-01
  • 打赏
  • 举报
回复
引用 7 楼 zhouqinghe24 的回复:
[quote=引用 1 楼 cyz51781 的回复:] 可以这样,只要数据库发值发生变化,则删除对应的缓存数据,下次查询的时候如果缓存没有数据则从数据库获取加载到缓存,这样就不会出现误读现象,按理缓存数据应该是不会经常变化的,也不会影响效率。
这样缓存命中率 大大降低了 http://blog.csdn.net/ugg/article/details/41894947 http://blog.csdn.net/java2000_wl/article/details/8740911[/quote] 赞,这个确实可行呢。不知对redis造成多大影响,得压测看看。 不知有没有其他实现方案。
瑞卡哥哥 2016-05-31
  • 打赏
  • 举报
回复
引用 1 楼 cyz51781 的回复:
可以这样,只要数据库发值发生变化,则删除对应的缓存数据,下次查询的时候如果缓存没有数据则从数据库获取加载到缓存,这样就不会出现误读现象,按理缓存数据应该是不会经常变化的,也不会影响效率。
这样缓存命中率 大大降低了 http://blog.csdn.net/ugg/article/details/41894947 http://blog.csdn.net/java2000_wl/article/details/8740911
yahle 2016-05-30
  • 打赏
  • 举报
回复
先确定你的缓存是什么模式,本机缓存的话,如果数据发生改变,则写一个方法通知所有的服务器做缓存更新(消息队列) 如果是分布式缓存(memcache)则,删除缓存即可
罗键键 2016-05-30
  • 打赏
  • 举报
回复
引用 3 楼 link0007 的回复:
做一个中间件,实现跨堆栈行锁的功能。
没找到跨堆栈行锁的资料,能不能请你稍微解释下这个概念。。
罗键键 2016-05-30
  • 打赏
  • 举报
回复
引用 4 楼 yahle 的回复:
先确定你的缓存是什么模式,本机缓存的话,如果数据发生改变,则写一个方法通知所有的服务器做缓存更新(消息队列) 如果是分布式缓存(memcache)则,删除缓存即可
redis. 通知也有过程的,在这个过程里面在缓存里取到旧数据就出问题了。 删还不能删,等着用缓存的数据。。
LinkSe7en 2016-05-29
  • 打赏
  • 举报
回复
做一个中间件,实现跨堆栈行锁的功能。
罗键键 2016-05-27
  • 打赏
  • 举报
回复
引用 1 楼 cyz51781 的回复:
可以这样,只要数据库发值发生变化,则删除对应的缓存数据,下次查询的时候如果缓存没有数据则从数据库获取加载到缓存,这样就不会出现误读现象,按理缓存数据应该是不会经常变化的,也不会影响效率。
赞,终于有回答了。 其实我目的是分布式,DB和缓存的两个插入或者更新...原子。 DB操作和cache操作中间不能有其他的针对同一条数据的操作。
猪公公 2016-05-27
  • 打赏
  • 举报
回复
可以这样,只要数据库发值发生变化,则删除对应的缓存数据,下次查询的时候如果缓存没有数据则从数据库获取加载到缓存,这样就不会出现误读现象,按理缓存数据应该是不会经常变化的,也不会影响效率。

20,808

社区成员

发帖
与我相关
我的任务
社区描述
Hadoop生态大数据交流社区,致力于有Hadoop,hive,Spark,Hbase,Flink,ClickHouse,Kafka,数据仓库,大数据集群运维技术分享和交流等。致力于收集优质的博客
社区管理员
  • 分布式计算/Hadoop社区
  • 涤生大数据
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧