【Django】使用redis处理缓存,如果数据库数据发生改变,如何取到最新数据?

本文探讨了在不同场景下缓存与数据库数据一致性的维护策略,包括数据读取与更新流程,以及在高并发和频繁更新场景下的解决方案,如使用队列和优化查询等方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景一:对数据实时性要求不高,更新不频繁

读取数据:先判断当前是否有缓存(通常是根据key来判断),如果存在则从redis缓存读取,如果没有缓存,则从mysql中读取并重新写入缓存。

更新数据:同样首先判断是否有缓存,如果有则更新redis中的缓存,然后再更新mysql数据库,如果没有缓存,则直接更新mysql数据库。

场景二:高并发,更新频繁(如果用户1更新数据时,会先删除缓存,然后更新mysql,在mysql更新还没完成的时候,用户2来查询数据,查询完mysql后会写入缓存,此时写入的缓存是mysql更新前的数据,接着用户1完成了更新mysql的操作,造成了mysql和缓存redis数据不一致的问题)

解决方案:使用队列,根据商品的ID去做hash值,然后对队列个数取模,当有数据更新请求时,先把它丢到队列里去,当更新完后再从队列里去除,如果在更新的过程中,遇到以上场景,先去缓存里看下有没有数据如果没有,可以先去队列里看是否有相同商品ID正在进行更新如果有某个商品正在更新同时又有查询这个商品的请求,就把查询的请求放到队列里,然后同步等待缓存更新完成
这里有一个优化点,如果发现队列里有一个查询请求了,那么就不要放新的查询操作进去了,用一个while(true)循环去查询缓存,循环个200MS左右。


对于更复杂的场景和解决办法☞ https://blog.kido.site/2018/12/01/db-and-cache-01/                                                                 https://blog.youkuaiyun.com/simba_1986/article/details/77823309

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值