标签:缓存 删除 数据库 Redis 更新 线程 一致性 数据
当数据库中的数据更改之后,Redis中的缓存数据也需要更改?
怎么保证Redis中的数据和数据库中数据一致呢?
首先说下,现阶段只能保证数据库和redis的最终一致性,无法保证其强一致性,无论怎么做都会存在一段时间的数据不一致。
1、删除还是更新Redis
按常理说,我们在更新完数据库后,应该对Redis中的数据进行更新。但是现实中都是将对应的数据删除,这是为什么呢?
首先,删除一个数据比更新一个数据要轻松的多,删除只需要传入对应的key就可以了,而更新的话,不仅多传入key对应的值,还会涉及到复杂的内存操作。所以相较于更新来说,删除是一个轻量级操作。
因为如果一个数据在某段时间内更新了1000次,但是只被读取了1次,那么如果每次更新完数据之后都更新redis中的值的话,就会白白浪费资源。
所以不如直接删除对应的key,这样的话,等到读取的时候,让其再次读取数据库就好了。额外读取一次数据库的资源会小于多次的更新操作。
2、先删除缓存,后更新数据库
先删除缓存,然后更新数据库,可能会存在问题。
在删除缓存后,更新数据库成功之前,有其他线程读取数据,发现缓存为空,会读取数据库的旧值当作缓存的值。如果在此后的时间内,数据没有过期或者删除,数据会一直保持不一致。
这就引入了延迟双删了
1、删除缓存
2、更新数据库
3、sleep,睡眠时间根据业务具体时间而定,约大于其他线程读数据 + 写缓存的时间
4、删除缓存
为什么还要延迟呢?
因为线程之间存在调度,有可能其他线程读取完数据后,然后一直没有得到执行机会,也就是没有写缓存。
那么如果在更新完数据库后,立即删除缓存的话,刚删除完缓存,然后其他线程得到执行机会了,又将就缓存写入了。。还是数据不一致!
所以要等待约大于线程读取数据+写缓存的时间,这个时间是需要统计的。
3、先更新数据库,后删除缓存
先更新数据库,然后删除缓存会出现什么问题呢?
如果删除命令执行失败的话,那么数据也会出现不一致!
可以引入消息队列来存放对应的删除命令,消息队列提供了重试和消息可靠性,可以保证删除缓存。
标签:缓存,删除,数据库,Redis,更新,线程,一致性,数据 来源: https://blog.csdn.net/qq_40276626/article/details/120642776
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。