[Redis]典型应用——缓存

什么是缓存

缓存(Cache)是一种用于临时存储数据的机制,目的是提高数据访问速度和系统性能。

核心思路就是把一些常用的数据放到触手可及(访问速度更快)的地方,方便随时读取

缓存是一个相对的概念,比如说,对于硬件的访问速度来说,CPU寄存器>内存>硬盘>网络

那么,cpu寄存器就是内存的缓存,内存是硬盘的缓存,硬盘又是网络的缓存

对于计算机硬件来说,往往访问速度越快的设备,成本越高,存储空间越小, 缓存是更快,但是空间上往往是不足的.因此大部分的时候,缓存只放一些热点数据(访问频繁的数据), 就非常有用了

二八定律

关于"二八定律" 20%的热点数据,能够应对80%的访问场景, 因此只需要把这少量的热点数据缓存起来,就可以应对大多数场景,从而在整体上有明显的性能提升

 使用Redis作为缓存

关系型数据库虽然功能强大,但是有一个很大的缺陷,就是性能不高.(换而言之,进行一次查询操作消耗的系统资源较多)

如果访问数据库的并发量比较高,对于数据库的压力是很大的,很容易就会使数据库服务器宕机

如何让数据库能够承担更⼤的并发量呢?核⼼思路主要是两个:

开源:引入更多的机器,部署更多的数据库实例,构成数据库集群(主从复制,分库分表等...)

节流:引入缓存,使用其他的方式保存经常访问的热点数据,从而降低直接访问数据库的请求数量

Redis 就是一个用来作为数据库缓存的常见方案

1.Redis的数据在内存中,访问速度快很多

2.Redis只支持简单的key-value存储,不涉及复杂的关系和限制 

客户端访问业务服务器,发起查询请求

业务服务器先查询Redis,看想要的数据是否在Redis中存在

如果已经在Redis中存在了,就直接返回.此时不必访问MySQL了

如果在Redis中不存在,再查询MySQL

缓存是用来加快"读操作"的速度的.如果是"写操作",还是要老老实实写数据库,缓存并不能提高性能

缓存的更新策略

定期生成

每隔一定的周期(比如一天/一周/一个月),对于访问的数据频次进行统计,挑选出访问频次最高的前N% 的数据.

实时生成

先给缓存设定容量上限(可以通过Redis配置文件的 maxmemory 参数设定)

接下来把用户每次查询:

如果在Redis查到了,就直接返回.

如果Redis中不存在,就从数据库查,把查到的结果同时也写入Redis

如果缓存已经满了(达到上限),就触发缓存淘汰策略,把一些"相对不那么热门"的数据淘汰掉. 按照上述过程,持续一段时间之后Redis内部的数据自然就是"热门数据"了.

缓存的淘汰策略

LRU(Least Recently Used)

最近最少使用策略,移除最久未被使用的数据。

LFU(Least Frequently Used)

最少使用频率策略,移除使用频率最低的数据。

FIFO(First In, First Out)

先进先出策略,移除最早加入缓存的数据。

Random随机淘汰:

从所有的key中抽取幸运儿被随机淘汰掉

这里的淘汰策略,我们可以自己实现.当然Redis也提供了内置的淘汰策略,也可以供我们直接使用

  • noeviction

    • 描述:当内存达到限制时,不会再进行任何删除操作,而是直接返回错误。这是默认策略。
    • 适用场景:适用于希望数据持久存在的情况,不适合用作缓存。
  • allkeys-lru(Least Recently Used):

    • 描述:删除最久未使用的键(整个键空间)。
    • 适用场景:适用于通用的缓存场景,确保频繁访问的数据保留在内存中。
  • volatile-lru

    • 描述:删除最久未使用的键(仅限设置了过期时间的键)。
    • 适用场景:适用于希望缓存仅限于设置了过期时间的键。
  • allkeys-random

    • 描述:随机删除键(整个键空间)。
    • 适用场景:适用于数据访问模式不可预测或不重要的场景。
  • volatile-random

    • 描述:随机删除键(仅限设置了过期时间的键)。
    • 适用场景:适用于希望缓存仅限于设置了过期时间的键,且数据访问模式不可预测的场景。
  • volatile-ttl

    • 描述:删除最早将要过期的键。
    • 适用场景:适用于希望首先删除即将过期的键,以避免删除新近添加的键。
  • allkeys-lfu(Least Frequently Used):

    • 描述:删除最少使用的键(整个键空间)。
    • 适用场景:适用于需要保留访问频率较高的数据的缓存场景。
  • volatile-lfu

    • 描述:删除最少使用的键(仅限设置了过期时间的键)。
    • 适用场景:适用于希望缓存仅限于设置了过期时间的键,并且希望保留访问频率较高的数据的场景。

要设置 Redis 的淘汰策略,可以在 Redis 配置文件(redis.conf)中修改 maxmemory-policy 选项 

后面跟的可以是上面提到的任意一个策略 

 缓存预热(Cache preheating)

缓存预热是指在系统上线之前,提前将热点数据加载到缓存中,以避免系统刚启动时大量请求直接访问数据库,导致数据库压力过大。

  1. 手动预加载:通过编写脚本或手动执行查询,将数据加载到缓存中。
  2. 定时任务:使用定时任务在系统启动时或定期加载热点数据。
  3. 程序逻辑:在程序初始化时,自动加载常用数据到缓存。

优点

  • 提高系统启动时的性能。
  • 减少缓存未命中导致的数据库压力。

缓存穿透 (Cache penetration)

缓存穿透是指查询一个缓存和数据库中都不存在的数据,由于缓存不命中,每次请求都会穿透到数据库,给数据库带来很大压力。

解决方法

  1. 缓存空值:对于查询结果为空的数据,也进行缓存,并设置一个较短的过期时间。
  2. 布隆过滤器:使用布隆过滤器在应用层判断请求的数据是否存在,避免不存在的数据请求穿透到数据库。
  3. 参数校验:对请求参数进行校验,过滤掉非法的请求。

缓存雪崩(Cache avalanche)

缓存雪崩是指在某一时间段,缓存集中失效或不可用,大量请求直接访问数据库,导致数据库压力骤增甚至宕机。

解决方法

  1. 缓存过期时间随机化:在设置缓存过期时间时,增加随机因子,避免大量缓存同时过期。
  2. 互斥锁:在缓存失效时,使用互斥锁(如分布式锁)控制对数据库的访问,避免大量请求同时访问数据库。
  3. 双缓存:设置两个缓存,当一个失效时,使用另一个缓存作为备份。

缓存击穿(Cache breakdown)

缓存击穿是指某些热点数据在缓存过期后,有大量并发请求同时访问这些数据,导致请求直接穿透到数据库,造成数据库瞬时压力过大。

解决方法

  1. 热点数据永不过期:对于极热点的数据,设置为永不过期,定期手动更新。
  2. 互斥锁:在缓存失效时,使用互斥锁控制对数据库的访问,只允许一个线程访问数据库并重新设置缓存。
  3. 提前更新:在缓存即将过期前,提前主动刷新缓存。

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

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

相关文章

uniapp转小程序,小程序转uniapp方法

🤵 作者:coderYYY 🧑 个人简介:前端程序媛,目前主攻web前端,后端辅助,其他技术知识也会偶尔分享🍀欢迎和我一起交流!🚀(评论和私信一般会回&#…

数据结构day2

一、思维导图 内存分配 二、课后习题 分文件编译 //sys.h #ifndef TEST_H #define TEST_H #define MAX_SIZE 100//定义学生类型 typedef struct Stu {char name[20]; //姓名int age; //年龄double score; //分数 }stu;//定义班级类型 typedef struct Class {struct …

给Wordpress添加评分功能到评论表单

今天要 给你的 Wordpress 添加评分功能到评论表单 吗? 评分功能效果图 什么类型的网站需要评分? 资源站教程站其他,我也没想到。。。 但我这个网站,因为是电影类的网站,好像还是有点需要的,所以&#xf…

防洪墙的安全内容检测+http请求头

1、华为的IAE引擎:内部工作过程 IAE引擎主要是针对2-7层进行一个数据内容的检测 --1、深度检测技术 (DPI和DPF是所有内容检测都必须要用到的技术) ---1、DPI--深度包检测,针对完整的数据包,进行内容的识别和检测 1、基于特征子的检…

【字幕】字幕特效入门

前言 最近两周调研了一下字幕特效的底层程序逻辑,因为工作内容的原因,就分享几个自己找的链接具体细节就不分享了,CSDN也是我的个人笔记,只记录一些简单的内容用于后续自己方便查询,顺便帮助一下正在苦苦查阅资料入门…

详细的等保测评攻略

信息安全等级保护是中国特有的信息安全保障体系,旨在根据信息系统的重要性对其进行分级保护。随着技术的进步和威胁的变化,等保标准也在不断更新。等保2.0自2019年12月1日起施行,相较于之前的版本,它不仅涵盖了传统信息系统&#…

Spring Data Jpa 原生SQL联表查询返回自定义DTO

Spring Data Jpa 原生SQL联表查询返回自定义DTO 方案一:返回Map 这个就不说了 方案二:实体定义成接口的形式 该方式最直观!!推荐!!! 注意:XxxDto是interface接口,而…

LabVIEW 与 PLC 通讯方式

在工业自动化中,LabVIEW 与 PLC(可编程逻辑控制器)的通信至关重要,常见的通信方式包括 OPC、Modbus、EtherNet/IP、Profibus/Profinet 和 Serial(RS232/RS485)。这些通信协议各有特点和应用场景&#xff0c…

【开发指南】HTML和JS编写多用户VR应用程序的框架

1.概述 Networked-Aframe 的工作原理是将实体及其组件同步到连接的用户。要连接到房间,您需要将networked-scene组件添加到a-scene元素。对于要同步的实体,请向其添加networked组件。默认情况下,position和rotation组件是同步的,…

LabVIEW电路产品功能自动检测系统

开发基于LabVIEW的电路产品功能自动检测系统。该系统通过整合先进的硬件和软件技术,实现了电路产品的自动化测试,显著提高了测试效率和准确性,对于提升电子产品的可靠性和工作效率具有重要意义。 项目背景 在电子制造业中,电路产…

2.javaWeb_请求和响应的处理(Request,Response)

2.请求和响应的处理 文章目录 2.请求和响应的处理一、动态资源和静态资源javax.servlet(包) 二、Servlet体系1.简介2.HttpServlet3.Servlet生命周期 三、Request对象1.ServletRequest1)ServletRequest主要功能有:2)ServletRequest类的常用方法: 2.HttpServletReques…

请你谈谈:spring bean的生命周期 - 阶段2:Bean实例化阶段

在Spring框架中,Bean的实例化是Bean生命周期中的一个重要阶段。这个过程包括两个关键的子阶段:Bean实例化前阶段和Bean实例化阶段本身。 BeanFactoryPostProcessor:BeanFactoryPostProcessor是容器启动阶段Spring提供的一个扩展点&#xff0…

LG 选择 Flutter 来增强其智能电视操作系统 webOS

可以这个话题会让大多数人困惑,2024 年了为什么还会冒出 webOS 这种老古董?然后 LG 为什么选择 webOS ?现在为什么又选择 Flutter ? 其实早在 Google I/O 发布 Flutter 3.22 版本的时候,就提到了 LG 选择 Flutter 来增…

智慧园区整体解决方案3PPT(41页)

智慧园区整体解决方案概述智慧园区整体解决方案旨在通过先进的科技手段打造一个智能化、网络化的园区环境。该方案涵盖了私有云部署、智能会议系统、智慧物管、视频监控中心、消防监控中心、绿色健康大数据平台、智慧一卡通系统、智慧停车系统、智能餐厅、安全监控系统等多个方…

Flutter 状态管理新境界:多Provider并行驱动UI

前言 在上一篇文章中,我们讨论了如何使用 Provider 在 Flutter 中进行状态管理。 本篇文章我们来讨论如何使用多个 Provider。 在 Flutter 中,使用 Provider 管理多个不同的状态时,你可以为每个状态创建一个单独的 ChangeNotifierProvider…

Android中OkHttp3中超时时间概述

目录 前言connectTimeoutreadTimeoutwriteTimeoutcallTimeoutpingInterval拓展 前言 可以看到,使用还是很简单的。主要相关的有这五个参数,其中我们常用到是就是connectTimeout、readTimeout和writeTimeout。 再看上图,可以看到默认下connec…

电脑压缩视频文件 电脑压缩视频大小的方法

在数字化时代,视频已成为我们记录生活、分享快乐的重要工具。然而,大尺寸的视频文件常常让分享和存储变得棘手。如何在保持视频画质的前提下,轻松减小视频文件大小?今天,就让我们一起探索苹果电脑上的几种高效视频压缩…

探索Facebook的最新更新:社交体验的新高度

Facebook作为全球领先的社交媒体平台,一直致力于不断创新和改进,以提供更优质的用户体验。近期,Facebook推出了一系列新的更新,旨在提升用户的社交互动体验和平台功能。本文将详细探讨这些最新更新,分析其对用户和社交…

nginx全局块的user指令

文章目录 1、user指令1.1、进入nginx解压的目录1.2、./configure --help1.3、工作进程默认是nobody 2、user指令的使用步骤:2.1、设置一个用户信息"www"2.2、 创建一个用户2.3、./nginx -s reload2.4、创建/root/html/index.html页面,添加如下内容2.5、修…

数电基础 - 模数转换

目录 一. 简介 二. A/D转换器 三. 取样-保持电路 四. 并联比较型A/D转换器 五. 反馈比较型A/D转换器 六. 双积分型A/D转换器 七. V-F变换型A/D转换器 八. 总结 一. 简介 模数转换(Analog-to-Digital Conversion,简称 ADC)是将模拟信号…