Redis—缓存机制

Redis 缓存机制

  • 1. 缓存三兄弟
    • 1.1 缓存击穿
    • 1.2 缓存穿透
    • 1.3 缓存雪崩
  • 2. 布隆过滤器
  • 3. 缓存和数据库数据一致性
    • 3.1 缓存更新策略
    • 3.2 缓存不一致处理
  • 4. 热点 key
    • 4.1 热点 key 处理
    • 4.2 热点 key 重建
  • 5. 缓存预热

Redis,一个轻量级的开源内存数据结构存储系统,以其卓越的性能和灵活性,成为实现高效缓存策略的不二选择。

1. 缓存三兄弟

1.1 缓存击穿

一个并发访问量比较大的 key 在某个时间过期,导致所有的请求直接打到 DB 上。

解决方案

  • 加锁更新:加互斥锁更新,强一致,性能差。比如请求查询 A,发现没有命中缓存,则对 A 这个key加锁,同时去数据库查询数据,写入缓存,再返回给用户,释放锁。
  • 逻辑过期:不设置过期时间,过期时间存放在缓存中。通过异步的方式不断地刷新过期时间,防止缓存击穿现象出现。

1.2 缓存穿透

查询缓存和数据库中都不存在的数据,这样每次请求直接打到数据库,就好像缓存不存在一样。

缓存穿透将导致不存在的数据每次请求都要到存储层去查询,失去了缓存保护后端存储的意义。

缓存穿透可能会使后端存储负载加大,如果发现大量存储层空命中,可能就是出现了缓存穿透问题。

可能发生的原因:

  1. 自身业务代码问题
  2. 恶意攻击、爬虫导致空命中

解决方案

  • 缓存空值/默认值:在数据库不命中之后,把一个空对象或者默认值保存到缓存,之后再访问这个数据,就会从缓存中获取,这样就保护了数据库。
  • 布隆过滤器:存储与缓存之间加一层布隆过滤器,判断数据是否存在,如数据不存在,则不访问存储

缓存空值存在问题:

  1. 缓存中存在更多的无效键值对,需要更多的内存空间。可以针对此类数据设置一个较短的过期时间,让其自动失效剔除
  2. 缓存层和存储层的数据会有一段时间窗口的不一致(空值过期前,存储层更新了该值),可能会对业务造成影响。可以利用消息队列或其他异步方式清理缓存中的空对象。

1.3 缓存雪崩

某一时刻,发生大规模的缓存失效情况,例如缓存服务宕机、大量 key 在同一时间过期,导致大量请求打在 DB 上,可能导致整个系统的崩溃,称为缓存雪崩。

解决方案:

  • 提高缓存可用性
    • 集群部署:通过集群中提升缓存的可用性,可以利用 Redis Cluster 或者第三方的集群方案等
    • 多级缓存:设置多级缓存,第一级缓存失效的基础上,访问二级缓存,每一级缓存失效的时间都不相同
  • 过期时间:
    • 均匀过期,随机过期时间,避免过期时间太过集中
    • 热点数据永不过期
  • 熔断降级:
    • 服务熔断:当缓存服务器宕机或超时响应时,为了防止整个系统出现雪崩,暂时停止业务服务访问缓存系统
    • 服务降级:当出现大量缓存失效,而且处在高并发高负荷的情况下,在业务系统内部暂时舍弃对一些非核心的接口和数据的请求而直接返回一个提前准备好的fallback错误处理信息

2. 布隆过滤器

布隆过滤器,一个连续的数据结构,每个存储位置都是一个 bit,来标识数据是否存在

存储数据的时候,使用 K 个不同的哈希函数将这个变量映射为 bit 列表的 K 个点,把他们置为 1

判断缓存 key 是否存在,同样使用 K 个不同的哈希函数,映射到 bit 列表上,判断是不是 1

  • 如果不全是 1,那么 key 不存在
  • 如果全是 1,也只是表示 key 可能存在

缺点:

  1. 它在判断元素是否在集合中时,存在一定的错误几率,因为哈希算法有一定的碰撞概率
  2. 不支持删除元素

3. 缓存和数据库数据一致性

根据CAP理论,在保证可用性和分区容错性的前提下,无法保证一致性,所以缓存和数据库的绝对致是不可能实现的,只能尽可能保存缓存和数据库的最终一致性。

3.1 缓存更新策略

  • 删除缓存而不是更新缓存

    • 当一个线程对缓存的key进行写操作的时候,如果其它线程进来读数据库的时候,读到的就是脏数据,产生了数据不一致问题。相比较而言,删除缓存的速度比更新缓存的速度快很多,所用时间相对也少很多,读脏数据的概率也小很多
  • 先更数据,后删缓存

    • 更新数据,耗时可能在删除缓存的百倍以上。在缓存中不存在对应的 key,数据库又没有完成更新的时候,如果有线程进来读取数据,并写入到缓存,那么在更新成功之后,这个 key就是一个脏数据
    • 毫无疑问,先删缓存,再更数据库,缓存中key不存在的时间的时间更长,有更大的概率会产生脏数据

3.2 缓存不一致处理

原因:

  1. 缓存 key 删除失败
  2. 并发导致写入了脏数据

解决方案:

1、消息队列保证 key 被有效删除

思路:可以引入消息队列,把要删除的 key 或者删除失败的 key 加入消息队列中,利用消息队列的重试机制,重新删除对应的 key

缺点:对业务代码有一定的侵入性

2、数据库订阅 + 消息队列保证

思路:可以用一个服务 (比如阿里的 canal) 去监听数据库的 binlog,获取需要操作的数据。然后用一个公共的服务获取订阅程序传来的信息,进行缓存删除操作。

3、延时双删防止脏数据

这种情况主要来自“先删缓存,再更数据”,并发情况下产生脏数据

在这里插入图片描述

解决方案是 延时双删,在第一次删除缓存之后,过一段时间,再次删除缓存

4、设置缓存过期时间兜底

设置缓存过期时间,即使发生不一致问题,总有过期的时候

4. 热点 key

4.1 热点 key 处理

在 Redis 集群部署中,热 key 可能会造成整体流量不均衡,个别节点出现 OPS 过大甚至超载的情况

在客户端、代理端和服务端监控,识别 热点 key

客户端:设置全局字典(key 和调用次数),每次调用 Redis 命令时,更新字典

Redis 服务端:使用 monitor 命令可以监控到 Redis 执行的所有命令,统计热点 key

处理方法:

  1. 热 key 打散到不同的服务器,降低压力
  2. 加入二级缓存,提前加载热 key 数据到内存中,如果 Redis 宕机,走内存查询
    热 key 处理

4.2 热点 key 重建

开发的时候一般使用 “缓存 + 过期时间” 的策略,既可以加速数据读写,又保证数据的定期更新,这种模式基本能够满足绝大部分需求

但是有两个问题如果同时出现,可能就会出现比较大的问题:

  • 当前key是一个热点key (例如一个热门的娱乐新闻),并发量非常大。
  • 重建缓存不能在短时间完成,可能是一个复杂计算,例如复杂的 SQL、多次 IO、多个依赖等。 在缓存失效的瞬间,有大量线程来重建缓存,造成后端负载加大,甚至可能会让应用崩溃。

问题要点:

  • 减少重建缓存次数
  • 数据尽可能的一致
  • 较少的潜在风险

解决方案:

  • 互斥锁:这种方法只允许一个线程重建缓存,其他线程等待重建缓存的线程执行完,重新从缓存获取数据即可。
  • 永不过期:缓存不设置过期时间,也即物理不过期;为每个 value 设置一个 逻辑过期时间,当发现超过逻辑过期时间后,会使用单独的线程去构建缓存

5. 缓存预热

缓存预热,就是提前把数据库里的数据刷到缓存里,通常有这些方法

  1. 直接写个缓存刷新页面或者接口,上线时手动操作
  2. 数据量不大,可以在项目启动的时候自动进行加载
  3. 定时任务刷新缓存

参考二哥的面渣逆袭 & 《Redis设计与实现》,加油!

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

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

相关文章

Redis计数器:数字的秘密

文章目录 Redis计数器incr 指令用户计数统计用户统计信息查询缓存一致性 小结 技术派项目源码地址 : Gitee :技术派 - https://gitee.com/itwanger/paicodingGithub :技术派 - https://github.com/itwanger/paicoding 用户的相关统计信息 文章数,文章总阅读数&am…

go设计模式——单例模式

概念 单例是一种创建型设计模式,它确保一个类在整个程序运行期间只有一个实例,并提供一个全局访问点来使用该实例。虽然单例模式在某些情况下非常有用,例如管理全局配置、日志记录或资源共享,但它也带来了与全局变量相似的问题。…

redis面试(二十三)写锁释放

先加了写锁,后面再次加写锁或者读锁 anyLock: { “mode”: “write”, “UUID_01:threadId_01:write”: 2, “UUID_01:threadId_01”: 1 } 写锁的释放lua脚本在这里 RedissonWriteLock.unlockInnerAsync() 比如说现在的参数是这 KEYS[1] anyLock KEYS[2] redi…

SQL手工注入漏洞测试(MongoDB数据库)靶场通关攻略

构造数据回显 });return ({title:1,content:2 成功回显1,2,接下来我们开始尝试查询数据库 });return({title:tojson(db),content:2 得到之后我们就可以继续查询他的表名了 });return({title:tojson(db.getCollectionNames()),content:2 最后我们就可以爆出他表里的数…

宝塔面板配置FTP服务并安装内网穿透实现无公网IP远程连接

文章目录 前言1. Linux安装Cpolar2. 创建FTP公网地址3. 宝塔FTP服务设置4. FTP服务远程连接小结 5. 固定FTP公网地址6. 固定FTP地址连接 前言 本文主要介绍宝塔FTP文件传输服务如何搭配内网穿透工具,实现随时随地远程连接局域网环境搭建的宝塔FTP文件服务并进行文件…

ssrf实现.SSH未创建写shell

一、介绍SSRF漏洞 SSRF (Server-Side Request Forgery,服务器端请求伪造)是一种由攻击者构造请求,由服务端发起请求的安全漏洞。一般情况下,SSRF攻击的目标是外网无法访问的内部系统(正因为请求是由服务端发起的,所以服务端能请求到与自身相…

C语言基础——函数详解

目录 函数的概述 1 函数的概念 2 函数的意义 函数的定义和使用 1 函数的定义 2 函数的调用 2.1 在同一文件中函数定义后函数调用 2.2 在同一文件中函数定义前函数调用 2.3 调用其它文件中定义的函数 2.3.1 在函数调用文件中进行声明 2.3.2 在头文件中进行函数的声明 函…

图片工具箱:一键批量加水印,守护创意,提升效率!

前言 你是否曾在处理海量图片时,被繁琐的步骤和漫长的等待时间折磨得苦不堪言?是否梦想过拥有一款神器,能让你的图片处理工作变得轻松愉快,从此告别加班的烦恼,迎接升职加薪的曙光?那么,让我向…

有限差分学习笔记

有限差分介绍 ​ 在数学中,有限差分法(finite-difference methods,简称FDM),是一种微分方程数值方法,是通过有限差分来近似导数,从而寻求微分方程的近似解。 由泰勒展开式的推导 显式方…

Web应用加密数据传输方案

目录 概述 最初的方案 改进后的方案 秘钥的过期时间 概述 介于公司最近发布了一个面向C端用户的Web系统,为防止前端调用后端的API接口时,数据传输的内容轻易的被黑客获取,而设计的一个前后端数据加密传输方案 最初的方案 在最开始&#xf…

2 种方式申请免费 SSL 证书,阿里云 Certbot

如何使用免费的 SSL 证书,有时在项目中需要使用免费的 SSL 证书,Aliyun 提供免费证书,三个月有效期,可以直接在aliyun 申请,搜索 SSL 证书,选择测试证书。 Aliyun 证书需要每三月来来换一次,页…

<数据集>车内视角行人识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:6470张 标注数量(xml文件个数):6470 标注数量(txt文件个数):6470 标注类别数:1 标注类别名称:[pedestrian] 序号类别名称图片数框数1pedestrian647029587 使用标注…

奔驰S迈巴赫S480升级动态按摩座椅效果怎么样

在迈巴赫 S480 的尊崇之旅中,舒适从未有尽头。现在,为您呈现前排动态按摩座椅的升级,将舒适体验提升至全新境界。 迈巴赫 S480 已然是舒适的代名词,但前排动态按摩座椅的升级,将为您带来前所未有的放松与享受。 当您…

网络UDP报文详细解析

目录 一、简介二、详细介绍三、其他相关链接1、TCP报文段的详细图总结2、TCP三次握手和四次挥手详解3、socket通信原理及相关函数详细总结4、网络包IP首部详细解析 一、简介 本文主要介绍UDP报文格式。 二、详细介绍 UDP是一种无连接、不可靠的用户数据报协议,其…

【注解】反序列化时匹配多个 JSON 属性名 @JsonAlias 详解

JsonAlias 注解是 Jackson 提供的一个功能强大的注解,允许一个字段在反序列化时匹配多个 JSON 属性名。它适用于在处理多种输入数据格式时,或当 JSON 数据的键名可能变化时。 一、JsonAlias 的作用 多种别名:JsonAlias 允许你为一个字段定义…

MySQL在Windows和Ubuntu上的安装与远程连接配置

MySQL是一个广泛使用的开源关系数据库管理系统,适用于各种操作系统。本文将详细介绍如何在Windows和Ubuntu系统上安装MySQL,并配置远程连接。 1. 在Windows上安装MySQL 1.1 下载MySQL安装包 首先,访问MySQL官方网站(https://de…

UEFI 01记: 开发环境 在 ubuntu22 中搭建 edk2 开发环境并运行简单示例

https://uefi.org 1,预备环境 $ sudo apt install uuid-dev $ sudo apt install nasm $ sudo apt install bison flex $ sudo apt install build-essential $ sudo apt-get install x11proto-xext-dev $ sudo apt-get install libx11-dev $ sudo apt-get install l…

[数据集][目标检测]管道漏水泄漏破损检测数据集VOC+YOLO格式2614张4类

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2614 标注数量(xml文件个数):2614 标注数量(txt文件个数):2614 标注…

[windows][apache]Apache代理安装

下载apache服务软件和VC_redist安装包 https://www.apachelounge.com/download/ https://www.microsoft.com/zh-CN/download/details.aspx?id48145 解压文件,修改httpd.conf文件 37行出修改文件的解压目录 60行修改监听端口 安装服务 进入apache的目录&#xf…

美团mtgsig 1.2算法分析

声明 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 如有侵权,请联系我进行删除。 这里只是我分析的分析过程,以及一些重要点的记录…