Redis 五大经典业务问题

一 缓存穿透

缓存穿透是指当请求的数据既不在缓存中也不存在于数据库中时,请求会直接穿透缓存层,到达数据库层。这通常是由于恶意攻击或者程序错误造成的,比如攻击者故意请求不存在的大量数据,导致缓存不命中,所有的请求都会落到数据库上,从而可能对数据库造成巨大的压力,影响其性能甚至导致崩溃通常是 thread_running 飙高。

解决方案:
  1. 布隆过滤器(Bloom Filter):
    布隆过滤器是一种数据结构,可以用来检测一个元素是否在一个集合中。在请求到达缓存之前,先通过布隆过滤器进行检查,如果布隆过滤器判断数据不存在,则直接返回错误响应,避免对数据库的访问。

  2. 缓存空结果:
    当查询数据库后发现数据不存在时,可以将这个"空结果"也缓存起来,并设置一个较短的过期时间。这样当再次请求相同的数据时,可以直接从缓存中获取到"空结果",避免对数据库的访问。需要注意的是,这种方法可能会导致缓存被大量无用的空结果填满,所以需要合理设置过期时间。

  3. 限制请求:
    对于异常频繁的访问行为,可以采取限流、封禁IP等手段进行限制。例如,可以对每个用户的访问频率、请求的速度等进行限制,超过限制则暂时封禁其请求。

  4. 接口鉴权:
    在接口层做好身份验证和参数校验,不允许非法请求或者格式不正确的请求访问数据库。

  5. 数据库建立合理索引:
    对于一些必须要访问数据库的场景,确保数据库有好的查询性能,可以通过建立合理的索引来提高查询效率。

  6. 二级缓存:
    使用本地缓存作为一级缓存,Redis作为二级缓存。当本地缓存不命中时再查询Redis,如果Redis也不命中,最后才去查询数据库。这样可以减少直接对Redis的查询请求,降低Redis的压力。

  7. 前端控制:
    在前端应用中加强校验,比如表单校验、输入内容的合法性检查等,避免发送无效请求到后端。

二 缓存雪崩

缓存雪崩是指在缓存系统中,由于大量缓存数据在同一时间过期,或者缓存服务宕机,导致所有的请求都直接落到数据库上,造成数据库瞬间承受巨大的访问压力,从而变得不稳定甚至崩溃的现象。这类似于雪崩一样,一旦发生就会导致连锁反应,导致整个系统的性能急剧下降。

解决方案:
  1. 缓存数据的过期时间随机化:
    设置缓存数据的过期时间时,不要让大量的缓存数据在同一时间点过期。可以对过期时间加上一个随机值,使得缓存数据的过期时间分散开来,防止在同一时刻大面积缓存失效。

  2. 使用持久化:
    如果缓存服务支持持久化,比如Redis的RDB和AOF,要确保开启并合理配置这些功能。这样,即使缓存服务重启,也能从持久化的数据中恢复,减少缓存雪崩的风险。

  3. 设置热点数据永不过期:
    对于一些热点数据,可以设置为永不过期,或者采用手动更新缓存的策略,避免这些热点数据集体过期。

  4. 使用多级缓存策略:
    可以使用本地缓存(如Ehcache)和分布式缓存(如Redis)结合的多级缓存策略,即使分布式缓存不可用,本地缓存仍然可以提供服务,减少对数据库的直接压力。

  5. 提升缓存服务的高可用性:
    使用主从复制、哨兵机制、集群等高可用方案来确保缓存服务的稳定性。即便单个节点出现故障,也能快速切换到正常的节点,保障缓存服务不中断。

  6. 限流和熔断机制:
    在系统中实施限流和熔断机制,当流量或错误超过一定阈值时,暂时阻止部分请求,保护数据库和系统不被过载。

  7. 异步队列:
    当缓存失效后,可以将数据库的读取操作放入异步队列中,用异步处理的方式来缓解瞬时流量对数据库的冲击。

三 缓存击穿

缓存击穿指的是缓存中没有但数据库中有的数据(一般是热点数据)在缓存失效的瞬间,同时有大量并发请求这个数据点,这些请求会直接穿透缓存,全部落到数据库上,造成数据库短时间内的高压力。这与缓存穿透不同,缓存穿透是查询不存在的数据,而缓存击穿则是查询存在但是缓存刚好失效的数据。

解决方案:
  1. 使用互斥锁:
    对于同一个数据点,在缓存失效时,通过加锁或同步机制,保证不管有多少并发请求,只允许一个请求去数据库查询数据,并更新缓存,其他请求等待缓存被更新后直接从缓存中获取数据。常见的做法是使用分布式锁。

  2. 设置热点数据永不过期:
    对于一些访问频率非常高的热点数据,可以设置缓存永不过期,或者缓存失效后由后台维护线程负责更新,而不是由用户请求触发更新。

  3. 使用双缓存机制(Cache Aside pattern):
    当缓存失效时,并不立即删除缓存,而是使用另一个缓存进行更新操作。在新缓存更新完成之前,所有的读请求仍然访问的是旧的缓存。更新完成后再进行切换。

  4. 提前更新缓存:
    对于即将到期的数据,可以通过定时任务来检测并更新它。当检测到缓存数据即将到期时,可以提前异步地更新缓存。

  5. 给缓存设置合理的过期时间:
    对于一些热点数据,根据业务场景设置合理的过期时间,避免大量并发请求在同一时刻击穿缓存。

  6. 分布式缓存+本地缓存:
    可以在本地实现一层缓存,以减少对分布式缓存服务的访问频率,即使分布式缓存服务的数据过期,本地缓存仍然可以提供服务。

  7. 读写分离和负载均衡:
    数据库使用读写分离架构和负载均衡策略,将读操作分散到多个从库,减少对主库的直接压力。

四 数据不一致

缓存和数据库数据不一致的问题通常是由于缓存层与数据库层之间的数据同步策略不当导致的。这可能发生在以下几种情况:

1. 写操作没有同时更新缓存与数据库。
2. 缓存过期或被删除,而数据库中的数据在此期间被修改。
3. 分布式系统中由于网络延迟或其他问题导致的数据同步延迟。
4. 数据库事务回滚,但缓存更新已经发生。

这些问题可能导致用户获取到过时的数据,影响用户体验,并可能引发更严重的数据一致性问题。

解决方法
  1. 缓存更新策略:

    缓存延迟双删:更新数据库数据后,先删除缓存,然后延迟一小段时间再次删除缓存,以确保请求在这段时间内若读取了旧数据,也会再次删除缓存,从而读到最新数据。

    Write/Read Through Cache:利用缓存提供的写通(Writethrough)或读取通(Read through)策略,让缓存管理器负责数据的读写,确保数据的一致性。

    Write Behind Caching:更新操作首先在缓存中执行,然后异步批量更新到数据库,这种策略要考虑数据丢失的风险和数据一致性的问题。

  2. 数据库触发器:
    使用数据库触发器在数据发生变化时自动更新缓存,确保数据一致性。

  3. 事务消息:
    通过使用支持事务的消息队列,将缓存操作和数据库操作放到同一个事务中,确保两者要么都成功,要么都失败。

  4. 最终一致性:
    接受在某个时间窗口内缓存与数据库中的数据不一致,但是通过后台异步进程定期校对并同步数据,保证最终一致性。

  5. 使用分布式缓存解决方案:
    选择支持一致性哈希、数据同步等特性的分布式缓存解决方案,如Redis Cluster,保证数据在多个节点之间的一致性。

  6. 版本号/时间戳校验:
    给数据库记录添加版本号或时间戳,缓存数据时一同缓存这个版本信息,每次读取缓存数据时都检查版本或时间戳是否相符,若不符则重新从数据库加载。

  7. 强制缓存过期:
    设置较短的缓存过期时间,确保数据定期从数据库中刷新。

###五 数据并发竞争
数据并发竞争访问问题,通常指的是多个客户端或线程同时对同一数据进行读写操作时,由于没有妥善的并发控制措施导致数据出现不一致或者丢失的情况。这个问题在分布式系统和多用户系统中尤为常见,尤其是在使用像Redis这样的缓存系统时也会遇到。

出现问题的场景:
计数器更新:比如用Redis计数器统计网站点击量,如果多个请求同时更新计数器,可能会因为读写操作不是原子性导致计数器丢失更新。
库存扣减:在电商场景中,多个用户同时下单扣减库存,可能会导致超卖。
分布式锁:多个进程需要对同一资源进行操作时,需要使用锁来保证同时只有一个操作可以执行。
Session共享:在分布式部署的Web应用中,多个服务器上的并发请求需要共享Session信息,可能导致Session数据不一致。

解决方案:

  1. 使用事务:Redis事务可以通过MULTI和EXEC命令来确保一系列命令的原子性执行。

  2. 使用Lua脚本:Redis可以执行Lua脚本,Lua脚本在执行过程中会被当作一个整体执行,这保证了操作的原子性。

  3. 使用分布式锁:可以实现一个基于Redis的分布式锁来控制资源的并发访问。比如使用SETNX命令实现锁的获取和释放。

  4. 乐观锁/Optimistic Locking:使用WATCH命令监视一个或多个键,如果在执行事务前这些键没有被其他命令改变,事务才会被执行。

  5. 悲观锁/Pessimistic Locking:对于关键业务,可以选择先对数据加锁,在业务处理完成后再解锁,避免其他客户端的访问。

  6. 限流措施:通过限流算法如令牌桶、漏桶等,控制对某一资源的并发访问数,减少并发冲突。

  7. 消息队列:使用消息队列将并发请求串行化处理,确保对共享资源的访问是有序的。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/214598.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Servlet学习笔记

简介 浏览器请求处理流程:浏览器发请求 > 服务器tomcat( > 应用程序 ( > servlet) ) Servlet应用的三大作用域:request,session,application tomcat存放项目的层级结构 注释:servlet原引用包名 javax.serv…

机场信息集成系统系列介绍(2):机场航班报文处理系统

本文介绍机场航班报文处理系统。#机场##sita##AFTN##航空# 一、定义 机场航班报文处理系统是一种基于计算机技术的自动化处理系统,用于接收、解析、处理和传递与航班相关的报文信息。这些报文可能包括航班计划、航班状态更新、旅客信息等,通常来源于航…

(C++)只出现一次的数字I--异或

个人主页:Lei宝啊 愿所有美好如期而遇 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://le…

〖大前端 - 基础入门三大核心之JS篇㊿〗- 面向对象之对象的方法、遍历、深浅克隆

说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费,如需要项目实战或者是体系化资源,文末名片加V!作者:哈哥撩编程,十余年工作经验, 从事过全栈研发、产品经理等工作,目前在公司…

【Linux】进程间通信之共享内存/消息队列/信号量

文章目录 一、共享内存的概念及原理二、共享内存相关接口说明1.shmget函数2.ftok函数3.shmat函数4.shmdt函数5.shmctl函数 三、用共享内存实现server&client通信1.shm_server.cc2.shm_client.cc3.comm.hpp4.查看ipc资源及其特征5.共享内存的优缺点6.共享内存的数据结构 四、…

【GIS】JDK版本升级到17后,GeoServer的图层无法通过openLayer预览

JDK版本升级到17后,图层无法通过openLayer预览 1. 错误图示 终端输出的错误 网页端无法显示图层,并且输出错误提示 2.原因猜测 估计可能是由于java17的模块化,Java被分成了多个独立部署和运行的模块,这使得Java应用能够更快…

Wireshark添加自定义协议解析

最终效果如下: 参考文档:https://mika-s.github.io/topics/ 此参考文档中7个例子教我们如何编写lua脚本去识别我们自定义的协议 安装Wireshark https://www.wireshark.org/上下载安装包安装即可。我的安装路径是D:\Install\Wireshark,在W…

kafka学习笔记--基础知识概述

本文内容来自尚硅谷B站公开教学视频,仅做个人总结、学习、复习使用,任何对此文章的引用,应当说明源出处为尚硅谷,不得用于商业用途。 如有侵权、联系速删 视频教程链接:【尚硅谷】Kafka3.x教程(从入门到调优…

IT新闻资讯系统,使用mysql作为后台数据库,此系统具有显示数据库中的所有信息和删除两大功能。

表的准备: -- MySQL Administrator dump 1.4 -- -- ------------------------------------------------------ -- Server version 5.1.40-community /*!40101 SET OLD_CHARACTER_SET_CLIENTCHARACTER_SET_CLIENT */; /*!40101 SET OLD_CHARACTER_SET_RESULTSCHAR…

nodejs+vue+微信小程序+python+PHP个性化服装搭配系统APP-计算机毕业设计推荐 android

考虑到实际生活中在个性化服装搭配方面的需要以及对该系统认真的分析,将app权限按管理员和用户这两类涉及用户划分。 (a) 管理员;管理员使用本系统涉到的功能主要有个人中心、用户管理、个性穿搭管理、我的衣橱管理、服饰分类管理、我的收藏管理、系统管理等功能。 …

Unity使用打成图集的Sprite作为模型贴图使用的问题

大家好,我是阿赵。   有时候用Unity引擎做项目的时候,会遇到这样的需求,美术做了一些模型或者特效,然后策划想在游戏运行的时候,读取一些游戏图标放在特效或者模型上面当做贴图使用。   这个需求实现起来很简单&am…

【Hive】启动beeline连接hive报错解决

1、解决报错2、在datagrip上连接hive 1、解决报错 刚开始一直报错&#xff1a;启动不起来 hive-site.xml需要配置hiveserver2相关的 在hive-site.xml文件中添加如下配置信息 <!-- 指定hiveserver2连接的host --> <property><name>hive.server2.thrift.bin…

DIP——边缘提取与分割

1.使用canny算法进行边缘提取 本实验比较简单&#xff0c;基本思路是对原图像进行一个高斯模糊处理&#xff0c;用于去噪&#xff0c;之后转换为灰度图&#xff0c;直接调用cv库中的canny记性边缘提取。若想直接得到彩色边缘&#xff0c;则通过按位与操作&#xff0c;将原始彩色…

【小沐学Python】Python实现TTS文本转语音(speech、pyttsx3、百度AI)

文章目录 1、简介2、Windows语音2.1 简介2.2 安装2.3 代码 3、pyttsx33.1 简介3.2 安装3.3 代码 4、ggts4.1 简介4.2 安装4.3 代码 5、SAPI6、SpeechLib7、百度AI8、百度飞桨结语 1、简介 TTS(Text To Speech) 译为从文本到语音&#xff0c;TTS是人工智能AI的一个模组&#xf…

Redis 持久化 —— 超详细操作演示!

四、Redis 持久化 四、Redis 持久化4.1 持久化基本原理4.2 RDB持久化4.3 AOF持久化4.4 RDB与AOF对比4.5 持久化技术转型 五、Redis 主从集群六、Redis 分布式系统七、Redis 缓存八、Lua脚本详解九、分布式锁 数据库系列文章&#xff1a; 关系型数据库: MySQL —— 基础语法大全…

ISNAS-DIP: Image-Specific Neural Architecture Search for Deep Image Prior

ISNAS-DIP&#xff1a;用于深度图像先验的图像特定神经架构搜索 论文链接&#xff1a;https://arxiv.org/abs/2111.15362v2 项目链接&#xff1a;https://github.com/ozgurkara99/ISNAS-DIP Abstract 最近的研究表明&#xff0c;卷积神经网络(CNN)架构在频谱上偏向较低频率&…

【IDEA】IntelliJ IDEA中进行Git版本控制

本篇文章主要记录一下自己在IntelliJ IDEA上使用git的操作&#xff0c;一个新项目如何使用git进行版本控制。文章使用的IDEA版本 IntelliJ IDEA Community Edition 2023.3&#xff0c;远程仓库为https://gitee.com/ 1.配置Git&#xff08;File>Settings&#xff09; 2.去Git…

idea 本身快捷键ctrl+d复制 无法像eclipse快捷键ctrl+alt+上下键,自动换行格式问题解决

问题 例如我使用ctrld 想复制如下内容 复制效果如下&#xff0c;没有自动换行&#xff0c;还需要自己在进行调整 解决 让如下快捷键第一个删除 修改成如下&#xff0c;将第二个添加ctrld 提示&#xff1a;对应想要修改的item&#xff0c;直接右键&#xff0c;remove是删…

JVM进程缓存

引言 缓存在日常开发中启动至关重要的作用&#xff0c;由于是存储在内存中&#xff0c;数据的读取速度是非常快的&#xff0c;能大量减少对数据库的访问&#xff0c;减少数据库的压力。我们把缓存分为两类&#xff1a; 分布式缓存&#xff0c;例如Redis&#xff1a; 优点&…

Docker部署开源分布式任务调度平台DolphinScheduler并实现远程访问办公

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问&#xff0c;结合内…