如何保证缓存与数据库的双写一致性?

最经典的缓存+数据库读写的模式。

  • 读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。
  • 更新的时候,先删除缓存,再更新数据库。

为什么是删除缓存而不是更新缓存?

举个例子,比如说我一条数据,1分钟内修改了10次,那么缓存更新 10 次;但是这个缓存在 1 分钟内可能只被读取了 1 次,那每次更新的意义就不大,还会增加开销。如果你只是删除缓存的话,那么在 1 分钟内,这个缓存不过就重新计算一次而已,开销大幅度降低。用到缓存才去算缓存。

为什么先删除缓存再更新数据库,而不是先更新数据库再删除缓存?

先更新数据库,成功了再删除缓存。如果删除缓存失败了,那么会导致数据库中是新数据,缓存中是旧数据,数据就出现了不一致。

先删除缓存,成功了再更新数据库。如果数据库更新失败了,那么数据库中是旧数据,缓存中是空的,那么数据不会不一致。因为读的时候缓存没有,所以去读了数据库中的旧数据,然后更新到缓存中还是旧数据,数据还是一致的,所以没问题

比较复杂的数据不一致问题分析

比如:数据发生了变更,先删除了缓存,然后要去修改数据库,此时还没修改。一个请求过来,去读缓存,发现缓存空了,去查询数据库,查到了修改前的旧数据,放到了缓存中。随后数据变更的程序完成了数据库的修改。完了,数据库和缓存中的数据不一样了

解决方案:加锁,比如redisson分布式锁,缺点:串行变成并行,效率更低了

优化方案:

  一: 对于读多写少的场景

了解下分布式读写锁,读锁和读锁之间可以并行,不互斥,所以不影响读的效率; 对同一个产品加写锁时,读锁就要等待, 以下,读锁,多个线程进来时,相当于没有加锁,不影响。只有写锁生效时,读锁才会 等待

以下是写锁

二: 对于读多写多的场景

对于这种情况,大多数互联网公司没那么多要求保证实时的。比如商品详情页面上的库存,有时候并不是真正的库存。要到下单的时候才会去数据库取库存。所以。这种情况。我们只需要库存设置为缓存的时候,设置个超时时间为1分钟就行。

redis缓存跟数据库数据不一致问题解决相关推荐

  1. 更新数据时redis缓存与数据库数据不一致的问题

    最初级的缓存不一致问题及解决方案 问题:先修改数据库,再删除缓存.如果删除缓存失败了,那么会导致数据库中是新数据,缓存中是旧数据,数据就出现了不一致. 解决思路:先删除缓存,再修改数据库.如果数据库修 ...

  2. redis 查询缓存_Redis缓存总结:淘汰机制、缓存雪崩、数据不一致....

    在实际的工作项目中, 缓存成为高并发.高性能架构的关键组件 ,那么Redis为什么可以作为缓存使用呢?首先可以作为缓存的两个主要特征: 在分层系统中处于内存/CPU具有访问性能良好, 缓存数据饱和,有 ...

  3. mysql缓存淘汰机制_Redis缓存总结:淘汰机制、缓存雪崩、数据不一致....

    在实际的工作项目中, 缓存成为高并发.高性能架构的关键组件 ,那么Redis为什么可以作为缓存使用呢?首先可以作为缓存的两个主要特征: 在分层系统中处于内存/CPU具有访问性能良好, 缓存数据饱和,有 ...

  4. Redis:缓存问题之数据不一致(更新数据库时 主动更新)

    Redis:缓存问题之数据不一致(更新数据库时 主动更新) 关键词 数据源不一样(缓存和db操作非原子性) 1.延时双删 -> 2.TTL -> 3.缓存删除失败记录到日志中,利用脚本提取 ...

  5. 链接mysql_使用python链接mysql及redis(缓存型数据库)

    python链接数据库mysql操作,首先我们需要借助第三方库pymysql. cmd终端下载:pip install pymysql import pymysql#链接数据库db = pymysql ...

  6. 关于接口连续调用,查询数据库数据不一致的情况

    关于接口连续调用,查询数据库数据不一致的情况 在后端开发中为前端提供了一个上传图片的接口,并且允许上传多张,虽然我封装了数组,但是前端依然是一张一张进行上传的,例如上传三照片,那么就调用三次接口,就是 ...

  7. onbeforeedit和onbeginedit数据不一致_Redis缓存与数据库产生不一致的问题该如何解决?...

    不一致产生的原因 我们在使用redis过程中,通常会这样做:先读取缓存,如果缓存不存在,则读取数据库.伪代码如下: Object stuObj = new Object();public Stu ge ...

  8. Redis 缓存和 MySQL 数据如何实现一致性?

    需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景,主要 ...

  9. Redis缓存与数据库双写一致性

    前言: 首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用.在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作.         但是在更新缓存方面,对于更新完数据库,是更新缓存 ...

最新文章

  1. 不会一致性hash算法,劝你简历别写搞过负载均衡
  2. oracle proc 定义宿主,oracle proc 编程基础及最小化案例
  3. CSS魔法堂:重拾Border之——更广阔的遐想
  4. 数组合并假设有 n 个长度为 k 的已排好序(升序)的数组,请设计数据结构和算法,将这 n 个数组合并到一个数组,且各元素按升序排列。即实现函数-C-icoding-排序-数据结构
  5. mysql解锁_mysql 解锁
  6. 嵌入式nosql php,NoSQL 嵌入式数据库NeDB示例
  7. mojoportal升级中用户相关设置
  8. 感情在钱面前一文不值,开公司谨记这6大规则
  9. Eclipse如何从导入SVN上导入项目
  10. 平分物品价值java_网易互联网8.8笔试_第2题平分物品_自己的题解记录
  11. CentOS6.x 升级 CentOS7.1
  12. 电大计算机考试试题及答案,电大统考计算机考试试题及答案.doc
  13. c语言200以内能被3和5整除的数,程式设计程式 求500以内能被3和5同时整除的所有数的和,c语言程式码写全一点,谢谢啦...
  14. 昌乐博闻学校2021年高考成绩查询,2021高考难度升级吗?两点忠告送给高考生
  15. sublime Text3去除文本重复行
  16. 虽说是递推式,但我还是觉得是逆推法
  17. 游戏地图和星际争霸地图技术
  18. 汉仪尚巍手书有版权吗_汉仪尚巍手书字体下载 汉仪尚巍手书体W字体免费版下载...
  19. edge下载Vue.js devtools
  20. mysql项目练习_mysql练习项目 - osc_wy5qpqnh的个人空间 - OSCHINA - 中文开源技术交流社区...

热门文章

  1. java 获取文件大小_阿里Java后端开发面经,面试官都替我感到绝望
  2. linux c程序调用脚本,C程序与Lua脚本相互调用
  3. 单纯形表的matlab输出,自编MATLAB版单纯性算法 可以列出单纯形表以及其他相关数据...
  4. python udp编程_Python UDP编程小示例
  5. 简约几何艺术海报PSD分层模板,即使简单也足以控制观众的注意力。
  6. UI设计素材|汉堡按钮/菜单
  7. UI实用案例|黄金分割在界面设计中的应用
  8. 淘宝电商页面和产品海报设计PSD分层素材模板
  9. 电商促销海报PSD模板|临摹优秀,设计好的banner广告从试炼开始!
  10. 为什么以太网中需要 最小帧