如何解决redis等缓存和mysql的数据同步问题? 在什么时机存储到mysql呢?
一般方式:
先更新数据库,再更新缓存
缺点:会触发分布式事务问题,两步操作必须同时完成
懒加载方式:
先删除缓存,再更新数据库,查询时再添加到缓存中
缺点:高并发情况下有小概率出现将旧数据添加到缓存中
先更新数据库,再删除缓存,
缺点:基本没什么大问题
异步方式:
可以在一段时间后定时存储到mysql.
缺点:这个方案是以前老的方案, 这种情况如果服务器挂了, 有可能会导致数据丢失。
可以异步存储数据(再开个进程)。
缺点:这个自己做有点复杂了, 可以交给memcach缓存做。
更好的解答:
1.更新到缓存服务,由缓存服务异步更新到mysql。
2.直接更新到mysql,并删除掉缓存服务的数据。
比较好的方案::Read/Write Through Pattern
要点:更新数据由缓存服务来做。
Write Back套路,一句说就是,在更新数据的时候,只更新缓存,不更新数据库,而我们的缓存会异步地批量更新数据库。这个设计的好处就是让数据的I/O操作飞快无比(因为直接操作内存嘛 ),因为异步,write backg还可以合并对同一个数据的多次操作,所以性能的提高是相当可观的。