【Redis】redis缓存击穿,缓存雪崩,缓存穿透
一、什么是缓存?
缓存就是与数据交互中的缓冲区,它一般存储在内存中且读写效率高,提高响应时间提高并发性能,如果访问数据的话可以先访问缓存,避免数据查询直接操作数据库,造成后端压力过大。
但是可能会面临数据不一致问题,比如访问数据时拿到的是缓存中的数据,但是实际上数据库此时已经改变了,那么拿到的缓存中拿到数据与数据库中数据会有不一致的问题。解决数据一致性问题会要进行代码操作,增加代码维护成本,如果使用redis还会有运维成本。
二、怎么用redis实现缓存?

实际上就是把redis作用在客户端与数据库中间,充当缓冲区作为缓存。我们一般把一些经常访问,但是变化不大的数据放入缓存区,因为访问量大对磁盘IO次数多性能消耗大,如果作用与缓存区那么存储效率会快,第二是对于变化不大的数据,对于读写不一致问题问题出现概率较小。
大概流程就是我们要获取数据的时候先操作缓存,如果在缓存redis中查不到数据就访问数据库,如果查到了就将数据写入缓存中,并且返回给客户端。
在Java中可以使用RedisTemplate类进行操作redis数据库,里面封装了很多方法可供使用,但是它默认使用的jdk 的序列号工具,将数据序列话后是2进制,为了方便操作数据,我们可以手动将它的序列号工具用第三方例如jackson的将数据序列化为json格式。
三、缓存更新策略
缓存更新策略有三种,内存淘汰、超时剔除、主动更新。

内存淘汰它是指redis内存不足后它会自动清理一些内存,在清理掉这些内存后,如果再查询对应的数据它在redis中查不到就会去数据库中查返回给客户端,并且把数据写入Redis中,完成缓存更新策略。它是默认开启,一致性较差。
超时淘汰指的是给数据设置超时时间,如果对应超过了对应的时间则将缓存清理,这种一般作为主动剔除的保底策略。主动更新是主动将数据从redis中剔除,这种方式面对与要求数据一致性较强的操作。
主动更新策略
1.cache aside pattern
由缓存调用者在更新数据库时同时更新缓存
操作缓存和数据库中,我们应该删除操作,还是更新缓存?
答:应该选择删除缓存,如果使用更新缓存,每次更新数据库都更新缓存,如果几乎不查询数据库,那么根本没必要使用缓存更新策略,使用缓存就是优化查询的速度。所以使用删除缓存模式,等下次进行查询数据库的时候再把缓存写入redis中,避免无用的写操作。
如何保证缓存与数据库操作同时成功或失败?
答:单体系统放在一个事务里,分布式服务理由TCC等分布式事务解决。
先删除缓存,再操作数据库 还是先操作数据库再删除缓存?
答:正常线程1删除缓存,然后更新数据库信息。但是由于多线程情况下,线程1更新数据库的过程中比较慢,突然中间插入了一个线程操作,线程2进行查询值,由于此时线程1已经将数据删除,所以缓存未命中于是查询数据库,查到了然后将数据写入缓存中。但是此时更新 数据库操作完成了,就造成缓存中的数据是10,但是数据库的值为20,缓存与数据库。
先操作数据库再删除缓存
答:正常情况是更新数据库,然后更新缓存。但是线程2之前有一个线程1进来查数据,并且此时缓存失效了,就会线程1进行查数据库发现数据是10。然后线程2要进行更新数据删除缓存操作,此时将数据库数据为20。然后线程一会将之前查出的数据10写入缓存中。这个概率比先删除再更新概率要低很多,首先是在缓存失效后有一个线程要进行查数据,然后紧接着有个线程要进行修改数据,并且写入的速度是比更新的速度快的,写入有几微秒,但是更新要比写入要慢一些,也就是说在几微妙下,线程2更新删除操作必须立刻完成,所以这种概率比较小。
2.read/write through pattern
缓存与数据库作为一种整体,由服务器管理数据一致性,无需调用者关系一直性问题。最大的问题是维护它是比较复杂的。调用者不知道操作的数据库还是缓存。
3.write behind caching pattern
调用者也是无需关系数据一致性,但是它只读取缓存,由一个线程异步将缓存和数据库进行操作,一定时间将缓存数据写入数据库中。一致性和可靠性可能存在问题。
对于数据库和缓存直接的数据一致性问题,可以使用canal,让他伪装成一个数据库的从节点,在主节点配置信息后,再从节点使用canal配置主节点的端口,ip等,然后再Java中引入canal的包,之后配置canal配置名字,ip,通过注解CanalTable监听表,如果改变了就将数据同步到redis中。
四、缓存穿透
缓存穿透指的是在数据库中和缓存中都没有的情况下进行查询操作。
1.缓存空对象解决缓存穿透,查询缓存如果为空查询数据库也为空,如果不断查询数据库会对数据库造成巨大的查询压力,所以可以设置一个缓存,key对应查询的对象,值为null。但是如果有可能此时数据库添加了该值,但是缓存还是之前的null值,此时可以设置个过期时间,或者插入数据库的时候查有没有缓存有的话删除就可以了,可能会造成短期数据不一致问题。
2.使用布隆过滤器解决缓存穿透
将数据库的数据根据hash算法,然后转换存2进制位存入布隆过滤器,然后如果有数据进来后,通过相同的算法进行与 布隆过滤器里的值进行比对,如果对应位有该数据说明该值有一定可能存在,如果布隆过滤器不存在说明值真不存在。内存占用特别小,实现复杂,存在误判的可能。
五、缓存雪崩
缓存雪崩指的是同一时间大量数据同时失效或者redis宕机, 大量数据雪崩打入数据库中。
解决方案:
给缓存设置ttl设置随机值,防止缓存同时失效。
确保redis高可用性,主从机制,当主宕机了从服务器可以挑选从节点作为主。
限流降级sentinel,或者设置多级缓存
六、缓存击穿
大量数据打进来,然后缓存数据失效需要重建的过程,再次过程中时间比较长,后面的数据继续访问需要先查缓存,此时缓存为建立,然后会查询数据库,不断的访问对数据库有巨大的冲击。

结局方案 :1.互斥锁,2.逻辑过期
1.互斥锁是如果缓存查询不到就操作数据库,在操作数据库操作重建缓存的过程完成后释放锁,其他线程在查不到缓存后会操作数据库前也需要获取锁。所以并发性能差,实现简单。
2.逻辑过期指的是在查询缓存后发现逻辑过期也就是失效了,然后加互斥锁,此时开辟一个新的线程查询数据库更新缓存逻辑过期时间,然后返回旧缓存值。如果新的线程真的更新完毕了那么才会释放锁,在这期间如果其他线程进来查缓存失效了那么就会访问数据库发现互斥锁没释释放,说明此时新线程没有重建缓存完毕,那么会直接返回过期的旧缓存值。这样可以增加并发性,但是数据一致性较差,实现复杂,性能消耗大。
相关文章:
【Redis】redis缓存击穿,缓存雪崩,缓存穿透
一、什么是缓存? 缓存就是与数据交互中的缓冲区,它一般存储在内存中且读写效率高,提高响应时间提高并发性能,如果访问数据的话可以先访问缓存,避免数据查询直接操作数据库,造成后端压力过大。 但是可能会面…...
HBase Flink操作
Apache Flink 是一个开源的分布式流处理框架,能够高效地处理和分析实时数据流以及批数据。HBase 是一个分布式、面向列的开源数据库,是 Hadoop 项目的子项目,适合非结构化数据结构的存储,并提供实时读写能力。以下是关于 Flink 对…...
C# .Net Core通过StreamLoad向Doris写入CSV数据
以下代码可以只关注StreamLoad具体实现。 1.创建StreamLoad返回值Model public class StreamLoadResponse {public long TxnId { get; set; }public string Label { get; set; }public string Comment { get; set; }public string TwoPhaseCommit { get; set; }public string…...
React-自定义Hook与逻辑共享
#题引:我认为跟着官方文档学习不会走歪路 在 React 中,自定义 Hook 是一种复用逻辑的方式。自定义 Hook 是一个 JavaScript 函数,名称以 use 开头,可以调用其他的 Hook, 可以返回任意值。 创建自定义Hook 假设你正在开发一款重…...
蓝桥杯每日真题 - 第17天
题目:(最大数字) 题目描述(13届 C&C B组D题) 题目分析: 操作规则: 1号操作:将数字加1(如果该数字为9,变为0)。 2号操作:将数字…...
游戏开发实现简易实用的ui框架
游戏开发实现简易实用的ui框架 本文使用cocos引擎实现,框架代码本质上不依赖某一个引擎,稍作修改也能作为其他引擎的实现 1.1 UI管理框架的核心需求剖析 分层与类型管理 对不同类型UI需要进行分层管理。不同层级的UI需要有不同的父节点,保证渲…...
vue3的attr透传属性详解和使用法方式。以及在css样式的伪元素中实现
在 Vue 3 和 TypeScript 中,属性透传(attr pass-through)是指将组件的属性传递到其根元素或某个子元素中。这个概念在开发可复用的组件时非常有用,尤其是当你希望将父组件的属性动态地传递给子组件的某个 DOM 元素时。 在 Vue 3 …...
【仿真建模-MESA】框架简介
1. 简介 Mesa是一个基于Python3的开源项目,旨在提供一个现代、易用的多智能体仿真环境。它借鉴了NetLogo、Repast和MASON等多智能体仿真框架的优点,并结合Python语言的强大功能,为用户提供了丰富的建模和仿真工具。 《官方文档》 2. 核心组件…...
Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)
目录 Linux软件包管理器 - yum Linux下安装软件包的方式 认识yum 查找软件包 安装软件 如何实现本地机器和云服务器之间的文件互传 卸载软件 Linux编辑器 - vim vim的基本概念 vim下各模式的切换 批量化注释 vim的简单配置 Linux编译器 - gcc/g gcc/g的作用 gcc/g语…...
VSCode 间距太小
setting->font family 使用:Consolas, Courier New, monospace 字体...
【K8S系列】imagePullSecrets配置正确,但docker pull仍然失败,进一步排查详细步骤
如果 imagePullSecrets 配置正确,但在执行 docker pull 命令时仍然失败,可能存在以下几种原因。以下是详细的排查步骤和解决方案。 1. 检查 Docker 登录凭证 确保你使用的是与 imagePullSecrets 中相同的凭证进行 Docker 登录: 1.1 直接登录 在命令行中,执行以下命令: …...
【ARM Coresight OpenOCD 系列 5.1 -- OpenOCD 无法识别CPUID 问题: xxx is unrecognized】
请阅读【嵌入式开发学习必备专栏】 文章目录 OpenOCD 无法识别CPUID 问题ARM CPUIDCPUID 特性CPUID 寄存器字段OpenOCD 无法识别CPUID 问题 在使用OpenOCD 进行CPU debug的过程中有时会报出 无法识别CPUID的问题,本文将会介绍如何解决这个问题。首先我们来学习下什么是CPUID,…...
如何实现点击目录跳转到指定位置?【vue】
需求:实现目录点击跳转到指定位置,点击后直接定位到指定模块 效果: 实现方法: (1)a标签跳转 普通使用: <!DOCTYPE html> <html><head><title>a-Demo</title>&l…...
SQL 通配符
SQL 通配符 在SQL中,通配符是一种特殊字符,用于在LIKE子句中搜索数据。它们主要用于模式匹配,允许你搜索符合特定模式的值。SQL中的通配符通常用于SELECT、UPDATE和DELETE语句中,以增加查询的灵活性。本文将详细介绍SQL中常用的通…...
ubuntu显示管理器_显示导航栏
ubuntu文件管理器_显示导航栏 一、原始状态: 二、显示导航栏状态: 三、原始状态--->导航栏状态: 1、打开dconf编辑器,直接在搜索栏搜索 dconf-editor ------如果没有安装,直接按流程安装即可。 2、进入目录:org …...
黑芝麻嵌入式面试题及参考答案
请详细描述二叉树的深度优先搜索(dfs)流程。 深度优先搜索是一种用于遍历二叉树的重要算法,主要有先序遍历、中序遍历和后序遍历三种方式。 先序遍历的流程是,首先访问根节点,然后递归地遍历左子树,最后递归地遍历右子树。这就好比是在探索一个家族树,先拜访家族中的长辈…...
使用 PyTorch-BigGraph 构建和部署大规模图嵌入的完整教程
当涉及到图数据时,复杂性是不可避免的。无论是社交网络中的庞大互联关系、像 Freebase 这样的知识图谱,还是推荐引擎中海量的数据量,处理如此规模的图数据都充满挑战。 尤其是当目标是生成能够准确捕捉这些关系本质的嵌入表示时,…...
系统性能优化方法论详解:从理解系统到验证迭代
在当今的企业级和云计算环境中,系统性能优化已成为提升竞争力的关键因素。本文将对系统优化的步骤进行深入解析,帮助读者系统化地进行性能优化,从而显著提升系统的整体表现。 流程概述: 系统性能优化的流程可以分为以下几个关键步骤&#x…...
使用Tengine 对负载均衡进行状态检查(day028)
本篇文章对于在服务器已经安装了nginx,但却希望使用Tengine 的状态检查或其他功能时使用,不需要卸载服务器上的nginx,思路是使用干净服务器(未安装过nginx)通过编译安装Tengine,通过对./configure的配置,保证安装Tengi…...
网站推广实战案例:杭州翔胜科技有限公司如何为中小企业打开市场大门
以下是以杭州翔胜科技有限公司为例,解析其如何通过网站推广为中小企业打开市场大门的实战案例: 一、一站式网站推广方案 杭州翔胜科技有限公司提供一站式网站推广方案,该方案整合了多种推广手段,如搜索引擎优化(SEO&a…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...




