当前位置: 首页 > news >正文

Redis - 缓存

文章目录

目录

文章目录

1. 什么是缓存?

2. 使用Redis作为缓存

2.1 关系型数据库的缺点

3. 缓存的更新策略

3.1 定期生成

3.2 实时生成

缓存淘汰策略

4. 缓存预热, 缓存穿透, 缓存雪崩 和 缓存击穿

缓存预热

缓存穿透

缓存雪崩

缓存击穿

总结


1. 什么是缓存?

缓存 (cache) 是计算机中的一个经典的概念. 在很多场景中都会涉及到. 核心思路就是把一些常用的数据放到触手可及(访问速度更快)的地方, 方便随时读取。

对于计算机硬件来说,往往访问速度越快的设备,成本越高,存储空间越小。

缓存是很快,但是空间上往往不足以存储所有数据, 因此大部分时候, 缓存只存放一些热点数据。

二八定律

20%的热点数据,能够应对80%的访问场景。

因此只需要把这少量的热点数据缓存起来,就可以应对大多数场景,从而在整体上有明显的性能提升。

2. 使用Redis作为缓存

2.1 关系型数据库的缺点

在一个网站中,我们常常会使用Mysql这类关系型数据库来存储数据。关系型数据库虽然功能强大,但是有一个非常严重的缺点: 性能不高

  • 数据库把数据存储在硬盘上, 硬盘的 IO 速度并不快. 尤其是随机访问.
  • 如果查询不能命中索引, 就需要进行表的遍历, 这就会大大增加硬盘 IO 次数.
  • 关系型数据库对于 SQL 的执行会做一系列的解析, 校验, 优化工作.
  • 如果是⼀些复杂查询, 比如联合查询, 需要进行笛卡尔积操作, 效率更是降低很多

遵从二八定律,我们可以使用Redis作为缓存层,这样打到Mysql数据库的请求就会少很多,降低了数据库的压力,同时提高了总体响应速度。

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

3. 缓存的更新策略

3.1 定期生成

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

这种做法实时性较低. 对于一些突然情况应对的并不好。

比如春节期间, "春晚" 这样的词就会成为非常高频的词. 而平时则很少会有人搜索 "春晚"。

3.2 实时生成

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

接下来把用户每次查询:

  • 如果在 Redis 查到了, 就直接返回。
  • 如果 Redis 中不存在, 就从数据库查, 把查到的结果同时也写入 Redis。

如果缓存已经满了(达到上限), 就触发缓存淘汰策略, 把一些 "相对不那么热门" 的数据淘汰掉。

按照上述过程, 持续一段时间之后 Redis 内部的数据自然就是 "热门数据" 了。

缓存淘汰策略

FIFO (First In First Out) 先进先出: 把缓存中存在时间最久的 (也就是先来的数据) 淘汰掉.

LRU (Least Recently Used) 淘汰最久未使用的: 记录每个 key 的最近访问时间. 把最近访问时间最老的 key 淘汰掉.

LFU (Least Frequently Used) 淘汰访问次数最少的:记录每个 key 最近⼀段时间的访问次数. 把访问次数最少的淘汰掉.

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

4. 缓存预热, 缓存穿透, 缓存雪崩 和 缓存击穿

缓存预热

缓存预热是指在系统上线或流量高峰之前,主动将一些常用的数据预先加载到缓存中,以减少首次请求时的延迟和数据库的压力。


缓存穿透

缓存穿透是指请求的数据在缓存和数据库中都不存在,导致每次请求都直接访问数据库,造成数据库压力增大。通常是由于恶意请求或错误的请求参数引起的。

原因:

业务设计不合理。比如缺少必要的参数校验环节, 导致非法的 key 也被进行查询了。

黑客恶意攻击。

解决:

1. 针对要查询的参数进行严格的合法性校验。 比如要查询的 key 是用户的手机号, 那么就需要校验当前 key 是否满足⼀个合法的手机号的格式。

2. 针对数据库上也不存在的 key , 也存储到 Redis 中, 比如 value 就随便设成⼀个 "". 避免后续频繁访问数据库.

3. 使用布隆过滤器先判定 key 是否存在, 再真正查询.


缓存雪崩

缓存雪崩是指在某个时间点,大量缓存数据同时过期,导致大量请求直接访问数据库,造成数据库瞬间负载过高,可能导致服务崩溃。

原因:

Redis挂了。

Redis中大量key同时过期。

解决:

1. 部署高可用的 Redis 集群, 并且完善监控报警体系。

2. 不给 key 设置过期时间 或者 设置过期时间的时候添加随机时间因子。 


缓存击穿

缓存击穿是指某个热点数据在缓存中失效,导致大量请求同时访问数据库,造成数据库瞬间负载过高。与缓存雪崩不同的是,缓存击穿通常是针对单个热点数据的情况。

解决:

1. 基于统计的方式发现热点 key, 并设置永不过期.

2. 进行必要的服务降级. 例如访问数据库的时候使用分布式锁, 限制同时请求数据库的并发数。


总结

以上就是这篇博客的主要内容了,大家多多理解,下一篇博客见!

相关文章:

Redis - 缓存

文章目录 目录 文章目录 1. 什么是缓存? 2. 使用Redis作为缓存 2.1 关系型数据库的缺点 3. 缓存的更新策略 3.1 定期生成 3.2 实时生成 缓存淘汰策略 4. 缓存预热, 缓存穿透, 缓存雪崩 和 缓存击穿 缓存预热 缓存穿透 缓存雪崩 缓存击穿 总结 1. 什么…...

基于SpringBoot+Vue的养老院管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…...

多线程爬虫接入代理IP:高效数据抓取的秘诀

在现代网络环境中,爬虫已经成为获取信息的利器。然而,随着网站反爬措施的不断升级,单线程爬虫往往无法满足需求。多线程爬虫与代理IP的结合,不仅能提高效率,还能有效规避IP封禁问题。本文将详细探讨多线程爬虫接入代理…...

[网络][CISCO]Cisco-PIX配置详解

Cisco PIX防火墙配置指南 任何企业安全策略的一个主要部分都是实现和维护防火墙,因此防火墙在网络安全的实现当中扮演着重要的角色。防火墙通常位于企业网络的边缘,使内部网络与Internet之间或与其他外部网络互相隔离,并限制网络互访&#x…...

拒绝千篇一律,AI帮你定制独一无二的个人写真

每个女人都渴望展现最美的自己,你是否厌倦了拍出千篇一律的照片?今天,我要告诉你一个秘密,用简单三步,即可打造属于你的独一无二个人写真!文生图、蒙版换脸、图生图,三步化身超级模特&#xff0…...

在云服务器上安装 RabbitMQ:从零到一的最佳实践

🛠 1. RabbitMQ 简介 RabbitMQ 是一个开源的消息代理中间件,广泛应用于高并发、异步任务队列的场景中。在分布式系统架构中,RabbitMQ 可以充当消息的中转站,帮助不同服务之间进行高效的消息通信。 在这篇文章中,我们…...

【nginx】搭配okhttp 配置反向代理

nginx的默认是一个反向代理。 nginx会默认把输入的请求,转向其他的服务器执行。 这些转向的服务器与客户端发起的服务器不是同一个。 客户端只认识nginx,不知道ngiix转向何方。 正向代理修改okhttp的proxy,实际上很多代理都是正向的。 反向代理修改请求路径到nginx。 感觉还…...

Android V 广播注册和配置注意事项问题

现象 在Android V平台上,应用注册非Protected广播时,如果没有加导出flag会抛出异常导致进程crash。 E/AndroidRuntime: FATAL EXCEPTION: main java.lang.SecurityException: com.demo.myapplication: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORT…...

深入解读Docker核心原理:Namespace资源隔离机制详解

在容器技术中,资源隔离 是容器化能够实现轻量级虚拟化的关键技术之一。通过资源隔离,容器可以拥有自己的独立环境,确保容器之间互不干扰,从而实现应用的安全和稳定。Docker作为主流的容器平台,其核心的资源隔离机制依赖…...

学习通、智慧职教刷课脚本

🐐个人主页 可惜已不在 🐋可以分享给身边有需要的人🐶 🐉有用的话就留下一个三连吧😼 目录 一.安装 脚本运行器 篡改猴 - Microsoft Edge Addons 二.安装脚本 三.扩展 一.安装 脚本运行器 安装浏览器 Microsoft E…...

SEO写作:从实战到精进的全方位指南

在数字化浪潮中,SEO不再是简单的关键词堆砌,而是成为企业品牌建设与市场拓展的核心策略。作为一名深耕SEO领域的实践者,我深知其中的门道与奥秘。今天,我将结合过往实战经验,以独特视角,带你一窥SEO写作的精…...

解决 git 不是内部或外部命令,也不是可运行的程序

目录 报错提示: 一、解决办法 1、从git官网下载windows版本的git 2、安装 3、注意事项 二、报错 1、解决 fatal: Not a git repository (or any of the parent directories): .git 问题 报错提示: 一、解决办法 Windows下配置Git: 1…...

【卷起来】VUE3.0教程-07-异步请求处理(springboot后端)

&#x1f332; 服务端接口准备 pom文件&#xff0c;引入mybatis/mybatis-plus相关依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>&…...

初一信息科技2024指南辅助教学软件(抓包软件)

专门针对信息科技20204指南写的程序&#xff0c;互联网和直播等知识中包含tcp/ip和udp&#xff0c;三次握手等原理&#xff0c;需要简单明了的实验来说明&#xff0c;在机房中需要用抓包软件&#xff0c;可能需要安装windump npcap等软件非常繁琐&#xff0c;还需要接触保护卡&…...

上汽大众:存储成本节约85%,查询性能提升5倍|OceanBase案例

近日&#xff0c;上汽大众汽车有限公司&#xff08;简称“上汽大众”&#xff09;的积分卡券等关键业务系统&#xff0c;已成功升级至 OB Cloud 云数据库。借助 OceanBase 原生分布式数据库的卓越性能与先进技术&#xff0c;实现了存储成本的大幅降低&#xff0c;高达85%&#…...

如何快准稳 实现MySQL大表历史数据迁移?

历史迁移解决方案以微服务架构为基础&#xff0c;使用多种设计模式&#xff0c;如&#xff1a;单例、桥接、工厂、模板、策略等。其中涉及的核心技术有多线程、过滤器等&#xff0c;致力于解决MySQL大表迁移的问题&#xff0c;提供多种迁移模式&#xff0c;如&#xff1a;库到库…...

C和指针:函数

函数定义 函数体就是一个代码块&#xff0c;它在函数被调用时执行。 类型 函数名(形式参数) 代码块 与函数定义相反&#xff0c;函数声明出现在函数被调用的地方。 函数声明 编译器是如何知道该函数期望接受的是什么类型和多少数量的参数。 原型 int *find_int( int key…...

Linux——分离部署,分化压力

PQS/TPS 每秒请求数/ 每秒事务数 // 流量衡量参数 可以根据预估QPS 和 服务器的支持的最高QPS 对照计算 就可以得出 需要上架的服务器的最小数量 PV 页面浏览数 UV 独立用户访问量 // 对于网站的总体访问量 response time 响应时间 // 每个请求的响应时间…...

javaaaa

1 飞机票 代码实现&#xff1a; import java.util.Scanner; public class F1 {public static void main(String[] args) {Scanner input new Scanner(System.in);System.out.print("请输入票价&#xff1a; ");double jia input.nextDouble();System.out.print(&…...

游戏开发引擎___unity位置信息和unlit shader(无光照着色器)的使用,以桌子的渲染为例

unity是左手坐标系 1.位置信息 1.1 代码 using System.Collections; using System.Collections.Generic; using UnityEngine;public class positionTest : MonoBehaviour {public Camera Camera;private void OnGUI(){//世界坐标系&#xff0c;GUI里的标签GUI.Label(new Rec…...

反向沙箱的功能特点

在这个信息化飞速发展的时代&#xff0c;企业的数据安全面临着前所未有的挑战。员工的无意操作、恶意软件的潜伏、甚至是敌对势力的网络攻击&#xff0c;都可能成为企业数据安全的致命威胁。深信达SPN反向沙箱为您筑起了一道坚不可摧的数据安全防线&#xff01; 来百度APP畅享高…...

可测试,可维护,可移植:上位机软件分层设计的重要性

互联网中&#xff0c;软件工程师岗位会分前端工程师&#xff0c;后端工程师。这是由于互联网软件规模庞大&#xff0c;从业人员众多。前后端分别根据各自需求发展不一样的技术栈。那么上位机软件呢&#xff1f;它规模小&#xff0c;通常一个人就能开发一个项目。它还有必要分前…...

构造函数与析构函数的执行顺序

对象作为成员变量的构造函数与析构函数 当一个类包含另一个类的对象作为成员时&#xff0c;这些成员对象的构造函数会在包含它们的对象的构造函数之前被调用&#xff0c;而它们的析构函数则会在包含它们的对象的析构函数之后被调用。成员对象的构造函数和析构函数的调用顺序与…...

Vue框架;Vue中的选择和循环结构;Vue数据类型;Vue中的事件和动态属性;Vue子组件通过导入在主组件显示在网页;Vue中主组件向子组件传递数据

一&#xff0c;Vue简介 前端现在比较火的三大框架就是&#xff1a;vue &#xff0c;React&#xff0c;Angular。在国内使用最多的还是&#xff1a; vue >React >Angular Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准…...

懒人笔记-opencv4.8.0篇

懒人笔记-opencv4.8.0篇 前言1、卸载 opencv3.4.31.1 cmake1.2 编译过程1.3 卸载1.4 检查代码是否卸载干净 2、安装 opencv4.8.02.1 安装依赖2.2 创建编译目录2.3 设置编译选项2.4 执行编译命令2.5 环境配置2.5.1、环境配置添加库路径2.5.2 更新系统2.5.3 配置bash2.5.4 保存退…...

解决uniapp视频video组件进入全屏再退出全屏后,cover-view失效的问题

给cover-view一个变量如isCloseBtnShow&#xff0c;通过v-if&#xff08;不要用v-show&#xff09;来控制显示隐藏。监听video全屏事件&#xff0c;全屏时&#xff0c;设置变量为false,退出全屏时再设为true&#xff0c;这样每次退出全屏,cover-view会重新加载。被覆盖的问题就…...

ip属地河北切换北京

我们知道&#xff0c;每当电脑或手机连接网络时&#xff0c;都会分配到一个网络IP地址&#xff0c;这个IP地址通常与设备所在的地区网络相关联。然而&#xff0c;出于业务或个人需求&#xff0c;有时我们需要将本机的IP地址切换到其他城市。例如要将IP属地河北切换北京&#xf…...

fpga入门名词(1)

这是第一代FPGA ,在 FPGA&#xff08;现场可编程门阵列&#xff09;设计中&#xff0c;LCA&#xff08;逻辑单元阵列&#xff09;通常由几个关键组件构成&#xff0c;包括 IOB、CLB 和 Interconnect。以下是这些组件的简要说明&#xff1a; 1. IOB&#xff08;Input/Output B…...

设计模式-行为型模式-访问者模式

访问者模式难以实现&#xff0c;且应用该模式可能会导致代码可读性变差&#xff0c;可维护性变差&#xff0c;除非必要&#xff0c;不建议使用&#xff1b; 1.访问者模式定义 允许在运行时将一个或多个操作应用于一组对象&#xff0c;将操作与对象结构分离&#xff1b; 访问者…...

探索Oracle数据库的多租户特性:架构、优势与实践

在云计算和大数据时代&#xff0c;多租户架构成为数据库设计中的一个重要趋势。Oracle数据库的多租户选项&#xff08;Multitenant&#xff09;允许单个数据库实例支持多个独立数据库&#xff08;称为容器数据库和可插拔数据库&#xff09;&#xff0c;每个数据库都有自己的数据…...