Redis缓存数据一致性分析

发布于:2024-10-24 编辑:匿名 来源:网络

文章介绍Redis作为一种非关系型数据库,已经应用于各种高性能业务场景。 Redis是一个基于内存的数据库,因此在读写方面都有非常好的性能。

实际使用中,多用于一些业务数据缓存的场景。一般团队自己搭建Redis,也会使用云服务,比如腾讯云Redis服务。

支持主从热备份,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回滚等全套数据库服务。在设计缓存的时候,我们要考虑一种情况,就是缓存数据的一致性。

如何理解缓存一致性?举个简单的例子,在一个电商系统应用中,我们将商品的库存数量存储在缓存中。这时我们在后台更新该产品的库存数量。

如何保证缓存中的库存信息同步更新且不发生库存情况?数量问题?文章后面的代码演示也使用了这个案例作为演示。缓存设计在了解缓存设计之前,我们先看一下下面的图。

这张图也是很多缓存系统的设计模式。客户端向服务器发送请求。

直接去缓存查询数据。如果缓存中存在数据,则直接将缓存中的数据返回给客户端。

如果缓存中不存在该数据,则查询数据库。根据MySQL中查询到的数据,写入缓存并返回给客户端。

主文前面提到的数据一致性是指MySQL和缓存中的数据如何保持同步。下面的文章也分析了如何实现数据同步。

先缓存更新策略,然后数据库策略解释后端发生更新请求,更新对应的Redis缓存。这个过程中可以直接删除并写入新的;您还可以使用更新方法。

使用delete相对来说更方便。如果缓存更新失败,则直接返回客户端错误信息。

如果缓存更新成功,则执行更新MySQL操作。如果 MySQL 更新失败,则回滚整个更新(包括缓存中的更新)。

问题分析:如果步骤1中删除了缓存,步骤2中更新缓存失败,则需要手动追加缓存。否则会出现缓存崩溃的情况。

这种情况是非常严重的。步骤4中,如果更新MySQL失败,则回滚缓存中的数据。

MySQL更新操作过程中,如果客户端出现新的请求,客户端会读取到新的数据。然而,实际的MySQL更新失败,用户无法读取到新的数据,因此数据也会出现不一致的情况。

代码演示代码语言:txt copy // Redis连接对象 $redis = null; // MySQL 连接对象 $mysql = null; // 客户端请求参数 $requestParams = []; // 删除缓存 $updateRedis = $redis-> del('key');if ($updateRedis) { //更新MySQL $updateMysql = $mysql->update('update xxx set a=xx where id=xxx') ; if ($updateMysql) { return '数据更新失败'; } // 回滚缓存(因为缓存删除失败,此时不需要手动回滚,如果是更新Redis,还需要手动回滚Redis) $redis->set('key' , $requestParams );}return '缓存更新失败';先数据库,后缓存策略说明:当客户端发起更新请求时,先更新MySQL。 MySQL更新成功后,会更新缓存。

可以直接使用删除操作或指定更新来更新缓存。如果Redis更新失败,则返回客户端信息。

问题分析 这个策略可以明显看出MySQL更新阶段没有问题。如果MySQL失败,直接返回客户端更新失败,不需要操作缓存。

但是在更新缓存时,如果缓存更新失败,MySQL中的数据会更新成功。那么我们面临这个问题,是应该回滚还是什么都不做呢?如果步骤2中缓存操作失败,则缓存将始终是旧数据,不进行任何处理,除非缓存有效期已过。

代码演示代码语言:txt copy // Redis连接对象 $redis = null; // MySQL 连接对象 $mysql = null; // 客户端请求参数 $requestParams = []; // 更新 MySQL $updateMysql = $mysql-> update('update xxx set a=xx where id=xxx'); if ($updateMysql) { // 更新缓存 $updateRedis = $redis->set($requestParams); if ($updateRedis) { return '数据更新成功'; } return '缓存更新失败';} return '数据更新失败';多线程同步策略解释的是客户端发起请求,此时创建了两个线程。一个线程执行 MySQL 更新,一个线程执行缓存更新。

如果两个线程之一不成功,则回滚整个更新操作。问题分析:该策略通过多线程更新数据,减少阻塞问题,加快程序处理速度。

如果MySQL线程更新失败并且处理缓慢,则Redis更新快速处理成功。此时做回滚时,在细粒度的过程中,新的请求会从缓存中获取新的数据,而回滚后,缓存的数据将是旧数据。

代码演示代码语言:txt copy // Redis连接对象 $redis = null; // MySQL 连接对象 $mysql = null; // 客户端请求参数 $requestParams = []; // 线程1更新MySQL $updateMysql = $mysql ->update('update xxx set a=xx where id=xxx');// 线程2更新缓存 $updateRedis = $redis->set('key', $requestParams );if ($updateMysql && $updateRedis) { return '数据更新成功';}//执行数据回滚....return '数据更新失败';锁处理策略描述 客户端发起请求,创建锁。此时MySQL和缓存数据会依次更新。

无论成功还是失败,执行完毕后锁都会被释放。问题分析:客户端发起请求,创建锁。

创建锁时,可以使用set-nx方法,避免服务失败,缓存也不会自动过期。更新 MySQL 和缓存数据。

如果缓存成功则释放锁,如果缓存失败则释放锁。该方法适用于数据一致性较高的情况。

例如,当后端发起请求时,客户端必须在写操作成功或失败后释放锁才能执行读操作。使用这种方法,客户端需要读取代码来判断锁的情况。

如果有锁,则处于等待状态。不适合高并发业务场景。

但保证数据完全一致。代码演示代码语言:txt copy // Redis连接对象 $redis = null; // MySQL 连接对象 $mysql = null; // 客户端请求参数 $requestParams = [];/ 客户端发起加锁请求 // 更新MySQL $updateMysql = $mysql->update('update xxx set a=xx where id=xxx');$updateRedis = $redis ->set('key', $requestParams);if ($updateMysql && $updateRedis) { //释放锁 //返回信息 return '数据更新成功'; } // 释放锁 // 返回信息 return '更新失败';文章摘要这篇文章是针对不同情况的分析。

在许多情况下,这只是一种理论状态。比较推荐的方法是先更新MySQL,再更新缓存。

Redis缓存数据一致性分析

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 走精品游戏路线,黑岛科技获数百万天使轮融资

    走精品游戏路线,黑岛科技获数百万天使轮融资

    据投资界2月12日消息,黑岛科技近期完成数百万天使轮融资,投资方为儒信创投首都。   黑岛科技于年底成立,专注于手机游戏的研发和生产。 在手游市场,黑岛科技走的是休闲精品游戏路线。 黑岛科技创始人王海旭表示:“我们希望做出让大家愿意听、愿意看的故事和内容的游戏

    06-17

  • 晨泰制药完成6500万美元A轮融资,启明创投领投

    晨泰制药完成6500万美元A轮融资,启明创投领投

    据投资界6月19日消息,晨泰医药科技有限公司(简称“晨泰制药”)宣布完成首笔A轮融资6万美元,总计3000美元。 本轮融资由启明创投领投,泰福资本、丽泽健康产业投资基金等机构跟投。   信息显示,晨泰制药是一家处于临床研究阶段的公司,专注于开发创新疗法以满足紧急医疗

    06-18

  • 不仅有金色标识的OPPO R9巴塞罗那定制版,还附赠了梅西签名的保护壳

    不仅有金色标识的OPPO R9巴塞罗那定制版,还附赠了梅西签名的保护壳

    一款精美如艺术品的手机。 没有一个好的保护壳它能做什么呢?继透露OPPO R9巴塞罗那定制版即将发布后,OPPO官方微博今日又曝出新消息:“【球星签名手机壳】我们为#OPPO巴塞罗那定制版R9#定制了全套包装。 梅西、内马尔球星、苏亚雷斯、拉基蒂奇、伊涅斯塔的五个签名也通过激

    06-18

  • 20亿元呼和浩特经济技术发展基金注册

    20亿元呼和浩特经济技术发展基金注册

    投资界(ID:pedaily)消息,2020年2月2日,北京中和元良私募基金管理有限公司(简称“中和元良”)主动管理呼和浩特经济技术开发区经济发展基金管理中心(有限合伙)(简称“经发基金”)顺利通过中国证券基金业协会注册,注册代码:SADX55。 该基金由中和元良与呼和浩特经济

    06-18

  • 揭秘苹果18家组装供应商的秘密

    揭秘苹果18家组装供应商的秘密

    在OEM界,“苹果组装工厂”无疑是象征着实力和品质的荣誉。 由于苹果在选择组装工厂时制定了很高的标准,从质量、劳工权益、环境、健康安全等多方面进行评分,所以能够满足苹果要求的供应商很少。 苹果目前在全球拥有18家组装工厂,其中16家为台资工厂,其中富士康7家、广达3

    06-18

  • 【创业24小时】2023年6月25日

    【创业24小时】2023年6月25日

    2023年6月25日,行业大公司亿欧创始人发文批评知乎周原。 如何解决社区匿名诽谤的反证问题?点击查看华为进军AI+机器人?吉木机械公司8.7亿元成立,二级市场资金沸腾。 点击查看全年GMV目标。 只达到了1.5%。 抖音外卖可以“吃饱”吗?点击查看小红书投资圈。 点击查看大视觉

    06-18

  • 安博ASP升级ESG服务并发布《物流行业:园区ESG及绿色运营白皮书》

    安博ASP升级ESG服务并发布《物流行业:园区ESG及绿色运营白皮书》

    6月5日恰逢世界环境日。 安博资产运营服务(以下简称“安博ASP”)携手中怡保险经纪有限公司、中国人民财产保险股份有限公司深圳分公司、中国太平洋财产保险股份有限公司,有限公司上海分公司发布《物流行业:园区ESG及绿色运营白皮书》(以下简称“白皮书”)。 活动现场,

    06-17

  • 神话背后,增长黑客之父肖恩·埃利斯揭秘成长的三个阶段

    神话背后,增长黑客之父肖恩·埃利斯揭秘成长的三个阶段

    雷锋网出版社:本文是最早提出“增长黑客”概念的增长黑客之父作者肖恩埃利斯在世界上。 畅销书《Growth Hacker》作者、著名增长黑客社区GrowthHackers.com的创始人、硅谷知名公司Qualaroo的创始人。 他曾负责Dropbox、Lookout、Uproar(IPO)、LogMeIn(IPO)等多家公司的用

    06-17

  • 苏州雷科传感完成数千万元A轮融资

    苏州雷科传感完成数千万元A轮融资

    苏州雷科传感完成数千万元A轮融资,持续投入产品研发及应用今年3月,苏州工业大学雷科传感苏州创普传感科技有限公司(以下简称苏州创普传感)完成数千万元A轮融资。 本轮融资由中关村智友科学家基金领投,永华投资、普华资本跟投。 本轮融资将用于加大公司对民用领域94GHz毫米

    06-17

  • 01-ai 刚刚从第一系列 Yi 模型中删除了所有自定义许可证,并使用 Apache-2.0 许可证代替

    01-ai 刚刚从第一系列 Yi 模型中删除了所有自定义许可证,并使用 Apache-2.0 许可证代替

    01-ai 通过将所有自定义许可证从第一系列 Yi 模型转换为广泛认可的 Apache- 2.0 许可证,与已经采用 Apache-2.0 许可证的 1.5 系列保持一致。 这一变化在其 Hugging Face 页面上有详细介绍,可能会对开发人员和人工智能社区产生重大影响。 这简化了使用这些模型的法律框架,有

    06-18

  • 投资世界24小时 -马斯克说,中国电动汽车世界领先;盈科资本正式宣布设立10亿元新基金;老乡吉回应1.6万名员工未缴纳社保

    投资世界24小时 -马斯克说,中国电动汽车世界领先;盈科资本正式宣布设立10亿元新基金;老乡吉回应1.6万名员工未缴纳社保

    时间:2020年5月31日星期二重要消息马斯克再次点赞中国:在可再生能源发电和电动汽车领域领先世界的特斯拉CEO埃隆马斯克再次点赞中国。 5月30日,马斯克在微博发文称,“似乎很少有人意识到,中国在可再生能源发电和电动汽车领域领先世界。 无论你怎么看中国,这都是事实。 ”

    06-18

  • 特斯拉Cybertruck上市,起售价6万美元; 快手推出独立“短剧App”西番;魅族正式宣布要“造车” -极客们已经知道

    特斯拉Cybertruck上市,起售价6万美元; 快手推出独立“短剧App”西番;魅族正式宣布要“造车” -极客们已经知道

    Altman回归担任OpenAI CEO,微软总裁否认他因为“超级人工智能”而被开除。 11月30日,据外媒报道,OpenAI于当地时间周三宣布,公司联合创始人山姆Altman(Sam Altman)正式回归担任OpenAI首席执行官,但阿尔特曼并未获得董事会席位。 微软首席执行官布拉德史密斯今天表示,萨

    06-17