热门标签 | 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

解决思路:

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

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




推荐阅读
  • PHP面试题精选及答案解析
    本文精选了新浪PHP笔试题及最新的PHP面试题,并提供了详细的答案解析,帮助求职者更好地准备PHP相关的面试。 ... [详细]
  • 电商高并发解决方案详解
    本文以京东为例,详细探讨了电商中常见的高并发解决方案,包括多级缓存和Nginx限流技术,旨在帮助读者更好地理解和应用这些技术。 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • 本文详细介绍如何在Spring Boot项目中集成和使用JPA,涵盖JPA的基本概念、Spring Data JPA的功能以及具体的操作步骤,帮助开发者快速掌握这一强大的持久化技术。 ... [详细]
  • 本文详细介绍了在 Windows 7 上安装和配置 PHP 5.4 的 Memcached 分布式缓存系统的方法,旨在减少数据库的频繁访问,提高应用程序的响应速度。 ... [详细]
  • Redis: 高效的键值存储系统
    Redis是一款遵循BSD许可的开源高性能键值存储系统,它不仅支持多种数据类型的存储,还提供了数据持久化和复制等功能,显著区别于其他键值缓存解决方案。 ... [详细]
  • 成为一名高效的Java架构师不仅需要掌握高级Java编程技巧,还需深入理解JVM的工作原理及其优化方法。此外,对池技术(包括对象池、连接池和线程池)的应用、多线程处理、集合对象的内部机制、以及常用的数据结构和算法的精通也是必不可少的。同时,熟悉Linux操作系统、TCP/IP协议栈、HTTP协议等基础知识,对于构建高效稳定的系统同样重要。 ... [详细]
  • 本文深入探讨了分布式文件系统的核心概念及其在现代数据存储解决方案中的应用,特别是针对大规模数据处理的需求。文章不仅介绍了多种流行的分布式文件系统和NoSQL数据库,还提供了选择合适系统的指导原则。 ... [详细]
  • 本文介绍了如何使用Workman框架构建一个功能全面的即时通讯系统,该系统不仅支持一对一聊天、群组聊天,还集成了视频会议和实时音视频通话功能,同时提供了红包发送等附加功能。 ... [详细]
  • 构建高性能Feed流系统的设计指南
    随着移动互联网的发展,Feed流系统成为了众多社交应用的核心组成部分。本文将深入探讨如何设计一个高效、稳定的Feed流系统,涵盖从基础架构到高级特性的各个方面。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • binlog2sql,你该知道的数据恢复工具
    binlog2sql,你该知道的数据恢复工具 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • 探讨在 Swoole 的 WorkerStart 回调中创建的对象如何在多个客户端之间实现隔离,确保每个客户端的数据独立性。 ... [详细]
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社区 版权所有