热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

修改redis缓存的值_redis使用中的四大问题

一、数据不一致定义:主要就是指缓存中的数据和数据库中的数据不一致情况。产生的原因:当有数据修改时,无论是先修改数据库的值,还

一、数据不一致

定义:主要就是指缓存中的数据和数据库中的数据不一致情况。

产生的原因:

当有数据修改时,无论是先修改数据库的值,还是先修改缓存中的值,都会发生数据不一致的情况,更好的解决方式,就是先更新数据库的值,在进行删除操作,但是这样的操作也会造成数据的不一致问题。主要是在两个方面,一个就是不能保证操作的原则性时,可能出现缓存不一致的情况,另一种就是在并发场景下,出现缓存不一致。

原子性问题:

  • 先删除缓存,再更新数据库:当我们的删除缓存成功后,这时写入数据库失败,当我们再来请求这个数据时,首先从缓存中没有拿到值,去数据库读取,那么读取到的是旧值,存在问题。

  • 先更新数据库,再删除缓存:当更新数据库成功后,删除缓存失败时,应用再去读取数据时,缓存命中,直接读取缓存的值为旧值,数据不一致。

解决思路:

  • 重试机制:可以将修改的数据放入到消息中间件中(如Kafka),当我们操作redis失败,或者修改数据库失败时,可以再次从消息中间件中拿出数据,进行再次操作。

并发下的问题:

  • 比如A线程首先去修改了数据,将2->1;先将缓存中的数据删除,然后去修改数据库(但是因为网络延迟比较慢),此时B线程来读取数据,发现缓存中没有数据,去读数据库(读到的是旧值),这是将数据2写入缓存,这个时候A线程恢复了工作,将数据的值改为了1,那后续的操作走缓存就只能拿到旧值2,出现了缓存不一致。

解决思路:

  • 延迟双删:也就是在A线程更新完数据库之后,sleep一段时间,再次将缓存中的数据进行删除,这样后续的读取操作就是从数据库中读取到新值,回写给缓存;那么这个sleep的值应该设置为多少呢?就需要根据时间情况来定,一般就是稍大于B线程的操作时间。

终极解决思路:通过mysql的binlog日志,进行异步同步,比如阿里开源的Canal,就是通过binlog去异步更新缓存数据,其流程如下:

6c37417b9906921249b3d1f3116892dd.png

二、缓存雪崩

定义:缓存雪崩是指大量的数据在redis缓存中没有数据,导致请求打到数据库层,导致数据库请求压力大增。

产生原因:

  • 缓存中的数据,在某一个时候,数据大量过期

  • .缓存系统导致出现宕机。

8c4fe5ec2f0cf9949f744ad520cf8e23.png

解决思路:

  • 针对数据的key,设置随机的过期时间,保证在某一时刻,不会存在大量的缓存失效。

  • 服务降级方案:针对非核心数据,暂停从缓存中读取数据,直接返回空值,或者错误信息

三、缓存击穿

定义:缓存击穿是指,某些热点数据,在缓存中无法命中,导致大量请求打到数据库服务器,导致数据库压力大增,影响性能。

产生原因:热点数据过期导致。

d4b25523b0146148ea91e6eaa7fac711.png

解决思路:

  • 对于热点数据不设置过期时间,保证能够缓冲命中

四、缓存穿透

定义:应用请求的数据,既不在redis缓存中,也不在数据库中,后续在查询这些数据时,依然无法命中缓存,导致需要运行整个流程,服务器处理无效请求,浪费资源。

产生原因:

  • 业务误操作,请求的是无用的数据;或者误删除一些数据,导致数据库和缓存中都没有了数据。

  • 恶意攻击,专门访问没有的数据,去拖垮服务。

8ff38588c6d880029763cd806bce8007.png

解决思路:

  • 缓存空值或者缺省值:也就是当缓存穿透时,查询数据没有值时,在缓存中缓存这个空值,或者给一个默认给定的值,当有这个无效数据再来访问时,可以命中缓存。

  • 使用布隆过滤器进行拦截,判断数据是否存在数据库中。




推荐阅读
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 本文深入探讨了 Redis 的两种持久化方式——RDB 快照和 AOF 日志。详细介绍了它们的工作原理、配置方法以及各自的优缺点,帮助读者根据具体需求选择合适的持久化方案。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 字节跳动夏季招聘面试经验分享
    本文详细记录了字节跳动夏季招聘的面试经历,涵盖了一、二、三轮面试的技术问题及项目讨论,旨在为准备类似面试的求职者提供参考。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了 MySQL 的查询处理流程,包括从客户端连接到服务器、查询缓存检查、语句解析、查询优化及执行等步骤。同时,深入探讨了 MySQL 中的乐观锁机制及其在并发控制中的应用。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • 科研单位信息系统中的DevOps实践与优化
    本文探讨了某科研单位通过引入云原生平台实现DevOps开发和运维一体化,显著提升了项目交付效率和产品质量。详细介绍了如何在实际项目中应用DevOps理念,解决了传统开发模式下的诸多痛点。 ... [详细]
  • 本文介绍了数据库体系的基础知识,涵盖关系型数据库(如MySQL)和非关系型数据库(如MongoDB)的基本操作及高级功能。通过三个阶段的学习路径——基础、优化和部署,帮助读者全面掌握数据库的使用和管理。 ... [详细]
  • 本文介绍了一个基于 Java SpringMVC 和 SSM 框架的综合系统,涵盖了操作日志记录、文件管理、头像编辑、权限控制、以及多种技术集成如 Shiro、Redis 等,旨在提供一个高效且功能丰富的开发平台。 ... [详细]
author-avatar
手机用户2602920905
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有