热门标签 | 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缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • 本文详细介绍了 MySQL 的查询处理流程,包括从客户端连接到服务器、查询缓存检查、语句解析、查询优化及执行等步骤。同时,深入探讨了 MySQL 中的乐观锁机制及其在并发控制中的应用。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 本文深入探讨了 Redis 的两种持久化方式——RDB 快照和 AOF 日志。详细介绍了它们的工作原理、配置方法以及各自的优缺点,帮助读者根据具体需求选择合适的持久化方案。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • MySQL 高性能实战教程
    本课程深入探讨 MySQL 的架构、性能调优、索引优化、查询优化及高可用性等关键领域。通过实际案例和详细讲解,帮助学员掌握提升 MySQL 数据库性能的方法与技巧。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 阿里云ecs怎么配置php环境,阿里云ecs配置选择 ... [详细]
  • Netflix利用Druid实现高效实时数据分析
    本文探讨了全球领先的在线娱乐公司Netflix如何通过采用Apache Druid,实现了高效的数据采集、处理和实时分析,从而显著提升了用户体验和业务决策的准确性。文章详细介绍了Netflix在系统架构、数据摄取、管理和查询方面的实践,并展示了Druid在大规模数据处理中的卓越性能。 ... [详细]
  • 本文详细介绍了如何在 MySQL 中授予和撤销用户权限。包括创建用户、赋予不同级别的权限(如表级、数据库级、服务器级)、使权限生效、查看用户权限以及撤销权限的方法。此外,还提供了常见错误及其解决方法。 ... [详细]
  • 本文介绍了数据库体系的基础知识,涵盖关系型数据库(如MySQL)和非关系型数据库(如MongoDB)的基本操作及高级功能。通过三个阶段的学习路径——基础、优化和部署,帮助读者全面掌握数据库的使用和管理。 ... [详细]
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社区 版权所有