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

深入学习 Redis - 如何使用 Redis 作缓存?缓存更新策略?使用需要注意哪些问题(工作/重点)

目录

一、Redis 作为缓存

1.1、缓存的基本概念

1.1.1、理解

1.1.2、缓存存什么样的数据?二八定律

1.2、如何使用 redis 作为缓存

1.3、缓存更新策略(redis 内存淘汰机制 / 重点)

1.3.1、定期生成

1.3.2、实时生成

内存淘汰策略(经典面试)

1. FIFO (First In First Out) :先进先出

2. LRU (Least Recently Used) :淘汰最久未使⽤的

3. LFU (Least Frequently Used) :淘汰访问次数最少的

4. Random 随机淘汰

深入理解淘汰策略:

redis 中采用的淘汰策略

1.4、缓存使用的注意事项(重点)

1.4.1、缓存预热(Cache preheating)

1.4.2、缓存穿透(Cache penetration)

1.4.3、缓存雪崩(Cache avalanche)

1.4.4、缓存击穿(Cache breakdown)


一、Redis 作为缓存


1.1、缓存的基本概念

1.1.1、理解

缓存可以理解为,将常用的数据从放到一个访问速度更快的的地方,方便更快的随时读取.

也就是说,速度快的设备,可以作为速度慢的设备的缓存,加快读取速度。在计算机硬件中的访问速度如下:

  • CPU 寄存器 > 内存 > 硬盘 > 网络

最常见的就是,使用 内存 作为 硬盘 的缓存,比如 redis.....  

当然 硬盘 也可以作为 网络 的缓存,比如浏览器通过 http/https 从服务器上获取数据(html、css、js、图片、视频......)并进行展示,像这样体积大,但又不经常改变的数据,就可以保存到浏览器本地硬盘上,后续在打开这个页面,就不必重新从网络获取上述数据了.

1.1.2、缓存存什么样的数据?二八定律

缓存速度虽然快,但是空间小,因此大部分情况,缓存只存放一些热点数据,就非常有用了.

这里就不得不提一下二八定律了,就是说缓存 只需要存储 20% 的热点数据,就可以应对 80% 的请求.

1.2、如何使用 redis 作为缓存

我们通常使用 redis 作为 数据库(mysql)的缓存.

这是由于,数据库是非常重要的组件,但是速度又很慢,一旦短时间内有大量请求来临,就有可能使数据库压力过大,导致宕机.

为什么会压力过大,导致宕机?

服务器每次处理一个请求,都要消耗一些硬件资源(cpu、内存、硬盘、网络......),任何一种资源的消耗超出了机器提供的上限,就很容易出现故障了.

如何提高 mysql 能承担的并发量?

1. 开源:引入更多的机器,构成数据库集群,例如 主从复制(即使主节点宕机,也可以通过提升从节点为主节点来解决)、分库分表.....

2. 节流:引入缓存,就是典型的方案. 把一些频繁的读取的热点数据保存到缓存上,后续再查询数据的时候,如果缓存已经存在了,就直接把从缓存上读到的数据返回,也就不在访问 mysql 了.

1.3、缓存更新策略(redis 内存淘汰机制 / 重点)

实际的工作中,如何知道 redis 中应该存储哪些数据?如何知道哪些数据使热点数据?

这就得看你使用缓存的哪种更新策略了~

1.3.1、定期生成

每隔⼀定的周期 (比如⼀天/⼀周/⼀个⽉) , 对于访问的数据频次进⾏统计,并以日志的形式记录下来,最后挑选出访问频次最⾼的前 N% 的数据,放到缓存中.

例如搜索引擎.

搜索引擎的 “查询词” 就是要关注的 “访问的数据”,通过日志,把每天(也可以按一周、一月)都使用到了哪些词,给记录下来,就可以针对这些日志进行统计(这里的统计数据量非常大,需要写个程序来统计,数量大到可能需要使用分布式系统来存储日志 HDFS),统计这一天中,每个词出现的频率,再根据频率降序排序,提取出 前 20% 的词,就可以认为这些词是 “热点词” .

接下来就可以把这些热点词,以及涉及到的搜索结构都提前拎出来,放到类似 “ redis” 这样的缓存中了。

如何定期统计呢?

可以写一套离线流程(往往使用 shell,python 写脚本代码),然后通过 定时任务 来触发(一天更新一次、一个月更新一次......),具体的:

a)完成统计热词的过程.

b)根据热词,找到搜索结果的数据.

c)把得到缓存数据同步到缓存服务器上.

d)控制这些缓存服务器自动重启.

定期生成的优缺点

优点:实现起来比较简单,过程可控(缓存中有什么东西,是比较固定的),方便排查问题.

缺点:实时性不够,如果出现一些突发性的事件,出现了一些新的热点词,新的热词就可能对数据库带来较大的压力(缓存中查询没有,直接打到数据库),例如,过年的前几天,“春节晚会” 这个词就会变的特别高频、或者是某个突发的新闻......

1.3.2、实时生成

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

接着,之后用户每次查询:

  • 如果在 Redis 中查到了,就直接返回.
  • 如果 Redis 中没有,就从数据库查询,在把查到的结果写入 Redis.

经过一段时间的 “动态平衡” ,redis 中的 key 就逐渐变成了 热点数据.

但是这样不停的写,redis 中的数据就会越来越多,达到 redis 配置的容量上限之后怎么办?

内存淘汰策略(经典面试)

为了解决上述问题,就可以使用以下四种 “内存淘汰策略” (以下淘汰策略不局限于 redis):

1. FIFO (First In First Out) :先进先出

把缓存中存在时间最久的 (也就是先来的数据) 淘汰掉.

2. LRU (Least Recently Used) :淘汰最久未使⽤的

记录每个 key 的最近访问时间. 把最近访问时间最⽼的 key 淘汰掉.

3. LFU (Least Frequently Used) :淘汰访问次数最少的

记录每个 key 最近⼀段时间的访问次数. 把访问次数最少的淘汰掉

4. Random 随机淘汰

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

深入理解淘汰策略:

假如在 甄嬛传 中,你是那个皇上,后宫佳丽三千,但实际上,你能宠幸的妃子也就那么几个(精力有限),相当于热点数据.

今天选秀一批新的小主,而你看上了其中的一个,那么就意味着后宫必有人失宠,那么到底要冷落谁呢?

FIFO:皇后最老,先冷落了.

LRU:找个太监统计最近的宠幸时间,比如,皇后(10天前)、华妃(一个月前)、熹妃(一天前),那么华妃失宠.

LFU:找个太监统计最近的宠幸次数,比如,皇后(6次)、华妃(1次)、熹妃(10次),那么华妃失宠.

Random:随机冷落一个妃子.

redis 中采用的淘汰策略
  • volatile-ttl(相当于 FIFO, 只不过是局限于过期的 key) 在设置了过期时间的key中,根据过期时间进行淘汰,越早过期的优先被淘汰. 
  • volatile-lru(就是 LRU,只不过局限于过期的 key) 当内存不足以容纳新写⼊数据时,从设置了过期时间的key中使⽤LRU(最近最少使用)算法进行淘汰.
  • allkeys-lru(就是 LRU,针对所有 key) 当内存不⾜以容纳新写⼊数据时,从所有key中使⽤LRU(最近最少使用)算法进行淘汰
  • volatile-lfu(就是 LFU,只不过局限于过期的 key) 4.0版本新增,当内存不⾜以容纳新写⼊数据时,在过期的key中,使⽤LFU算法 进行删除key.
  • allkeys-lfu(就是 LFU,针对所有 key) 4.0版本新增,当内存不⾜以容纳新写⼊数据时,从所有key中使⽤LFU算法进行淘汰.
  • volatile-random 当内存不⾜以容纳新写⼊数据时,从设置了过期时间的key中,随机淘汰数据.
  • allkeys-random 当内存不⾜以容纳新写⼊数据时,从所有key中随机淘汰数据.
  • noeviction 默认策略,当内存不⾜以容纳新写⼊数据时,新写⼊操作会报错.

1.4、缓存使用的注意事项(重点)

1.4.1、缓存预热(Cache preheating)

这里主要针对缓存更新策略是 实时生成的(定期生成 不涉及 “预热” ).

为什么要预热?

redis 服务器首次接入之后,服务器是没有数据的,此时所有请求都会直接打给 mysql,在 redis 上没查到,而在 mysql 上查到的数据会继续写入 redis,随着时间推移,redis 上的数据越积累越多 mysql 承担的压力才逐渐变小 .

那么没预热前,mysql 的压力是相当大的.

如何解决上述问题?

通过缓存预热,就可以解决. 主要就是,把缓存 定期生成 和 实时生成 结合一下.

具体的,先通过离线的方式,通过一些统计途径,统计一些热点数据,导入到 redis 中,此时导入的这批热点数据,就能帮 mysql 承担很大压力了.

随着时间的推移,逐渐就使用新的热点数据淘汰旧数据了.

1.4.2、缓存穿透(Cache penetration)

查询某个 key ,在 redis 中没有,mysql 中也没有,这个 key 也就不会更新到 redis 中。

这就导致,这次查询没有,下次查,还是没有....... 如果这样的数据很多,并且反复查询,一样会给 mysql 带来很大压力.

如何处理?

首先是一种亡羊补牢的方式:通过改进业务/加强监控警报,但这都是出现事故,才采取的行为.

更靠谱的方案(降低问题的严重性):

1. 如果这个 key 在 redis 和 mysql 上都不存在,仍然把这个 key 写入 redis,value 设置成一个非法值,比如 "".

2. 引入布隆过滤器. 每次查询 redis / mysql 之前都先判定一下 key 是否在 布隆过滤器 上存在(布隆过滤器本质上是结合 hash + bitmap 实现的,以比较小的空间开销和比较快的速度,针对 key 是否存在进行判定),不存在就没必要查了.

1.4.3、缓存雪崩(Cache avalanche)

在短时间内,redis 中大规模的 key 失效,导致缓存命中率陡然下降,并且 mysql 的压力迅速上升,甚至直接宕机.

redis 上为什么会出现 大规模的 key 失效?

1. redis 直接挂了,比如 redis 宕机,或者 redis 集群模式下大量节点宕机.

2. redis 好着呢,但是可能之前短时间内设置了很多相同过期时间的 key.

如何处理?

1) 加强监控警报,例如采取集群的监控,或者哨兵监控的方式,加强 redis 集群可用性.

2)不给 key 设置过期时间,或者设置过期时间的时候,添加一些随机因子,来避免同时过期.

1.4.4、缓存击穿(Cache breakdown)

这里翻译成 “击穿” 实际上不太合适,以至于一些面试官也分不清击穿和穿透(这种情况,最好两种都说明一下).

这里更适合的翻译成 “瘫痪”.

缓存击穿 相当于 雪崩 的特殊情况. 针对热点 key,如果过期了,导致大量请求直接访问到数据库上,甚至引起数据库宕机.

如何处理?

1. 基于统计的方式发现热点 key,设置为永不过期. 这种方式往往需要服务器结构做出比较大的调整.

2. 进行必要的服务降级(例如服务器的功能本来有 10 个,特定情况下,会关闭一些不重要的功能,只保留核心功能.  类似于手机的省电模式),例如访问数据库的时候使用分布式锁,限制数据库的访问频率.

相关文章:

深入学习 Redis - 如何使用 Redis 作缓存?缓存更新策略?使用需要注意哪些问题(工作/重点)

目录 一、Redis 作为缓存 1.1、缓存的基本概念 1.1.1、理解 1.1.2、缓存存什么样的数据?二八定律 1.2、如何使用 redis 作为缓存 1.3、缓存更新策略(redis 内存淘汰机制 / 重点) 1.3.1、定期生成 1.3.2、实时生成 内存淘汰策略&#…...

好用的软件测试框架有哪些?测试框架的作用是什么?

软件测试框架是现代软件开发过程中至关重要的工具,它可以帮助开发团队更加高效地进行测试和验证工作,从而大大提高软件质量和用户体验。 一、好用的软件测试框架 1. Selenium:作为一种开源的自动化测试框架,Selenium具有功能强大…...

PAT 1035 插入与归并

PAT 1035 插入与归并 题目描述思路讲解代码展示 题目描述 思路讲解 分析:先将i指向中间序列中满足从左到右是从小到大顺序的最后一个下标,再将j指向从i1开始,第一个不满足a[j] b[j]的下标,如果j顺利到达了下标n,说明…...

K-means 聚类算法学习笔记

K-means 聚类算法 是一种无监督学习算法,用来将 n n n 个样本点分成 k k k 类,使得整个数据集的误差平方和 S S E SSE SSE 最小。在本例中,样本点是指平面直角坐标系上的点,聚类中心也是平面直角坐标系上的点,而每个…...

API文档搜索引擎

导航小助手 一、认识搜索引擎 二、项目目标 三、模块划分 四、创建项目 五、关于分词 六、实现索引模块 6.1 实现 Parser类 6.2 实现 Index类 6.2.1 创建 Index类 6.2.2 创建DocInfo类 6.2.3 创建 Weight类 6.2.4 实现 getDocInfo 和 getInverted方法 6.2.5 实现 …...

文案内容千篇一律,软文推广如何加深用户印象

随着互联网技术的发展,企业营销的方式逐渐转向软文推广,但是现在软文推广的内容同质化越来越严重,企业应该如何让自己的软文推广保持差异性,在用户心中留下独特的印象呢?下面就让媒介盒子告诉你。 一、 找出产品独特卖…...

十二、流程控制-循环

流程控制-循环 1.while循环语句★2.do...while语句★3.for循环语句 —————————————————————————————————————————————————— 1.while循环语句★ while语句也称条件判断语句,它的循环方式是利用一个条件来控制是否…...

五、回溯(trackback)

文章目录 一、算法定义二、经典例题(一)排列1.[46.全排列](https://leetcode.cn/problems/permutations/description/)(1)思路(2)代码(3)复杂度分析 2.[LCR 083. 全排列](https://le…...

什么是分布式锁?他解决了什么样的问题?

相信对于朋友们来说,锁这个东西已经非常熟悉了,在说分布式锁之前,我们来聊聊单体应用时候的本地锁,这个锁很多小伙伴都会用 ✔本地锁 我们在开发单体应用的时候,为了保证多个线程并发访问公共资源的时候,…...

Ubuntu 12.04增加右键命令:在终端中打开增加打开文件

Ubuntu 12.04增加右键命令:在终端中打开 软件中心:搜索nautilus-open-terminal安装 用快捷键CtrlT打开命令行输入: sudo apt-get install nautilus-open-terminal 重新加载文件管理器 nautilus -q 或注销再登录即要使用...

Centos 7 访问局域网windows共享文件夹

Refer: centos7 访问windows系统的共享文件夹_centos访问windows共享_三希的博客-CSDN博客 一、在CentOS中配置CIFS网络存储服务 CIFS(Common Internet File System)是一种在网络上共享文件的协议,也称为SMB(Server Message Blo…...

GDB的TUI模式(文本界面)

2023年9月22日,周五晚上 今晚在看GDB的官方文档时,发现GDB居然有文本界面模式 TUI (Debugging with GDB) (sourceware.org) GDB开启TUI的条件 GDB的文本界面的开启条件是:操作系统有适当版本的curses库 The TUI mode is supported only on…...

深入了解Python和OpenCV:图像的卡通风格化

前言 当今数字时代,图像处理和美化已经变得非常普遍。从社交媒体到个人博客,人们都渴望分享独特且引人注目的图片。本文将介绍如何使用Python编程语言和OpenCV库创建令人印象深刻的卡通风格图像。卡通风格的图像具有艺术性和创意,它们可以用…...

【算法挨揍日记】day06——1004. 最大连续1的个数 III、1658. 将 x 减到 0 的最小操作数

1004. 最大连续1的个数 III 1004. 最大连续1的个数 III 题目描述: 给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。 解题思路: 首先题目要我们求出的最多翻转k个0后&#x…...

华为云HECS安装docker

1、运行安装指令 yum install docker都选择y,直到安装成功 2、查看是否安装成功 运行版本查看指令,显示docker版本,证明安装成功 docker --version 或者 docker -v 3、启用并运行docker 3.1启用docker 指令 systemctl enable docker …...

力扣669 补9.16

最近大三上四天有早八,真的是受不了了啊,欧嗨呦,早上困如狗,然后,下午困如狗,然后晚上困如狗,尤其我最近在晚上7点到10点这个时间段看力扣,看得我昏昏欲睡,不自觉就睡了1…...

2023-9-22 没有上司的舞会

题目链接&#xff1a;没有上司的舞会 #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N 6010;int n; int happy[N]; int h[N], e[N], ne[N], idx; bool has_father[N];// 两个状态&#xff0c;选该节点或不选该…...

【HDFS】cachingStrategy的设置

org.apache.hadoop.hdfs.client.impl.BlockReaderFactory#getRemoteBlockReader: private BlockReader getRemoteBlockReader(Peer peer) throws IOException {int networkDistance = clientContext.getNetworkDistance(datanode);return BlockReaderRemote...

性能测试 —— 性能测试常见的测试指标 !

一、什么是性能测试 先看下百度百科对它的定义&#xff0c;性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。 我们可以认为性能测试是&#xff1a;通过在测试环境下对系统或构件的性能进行探测&#xff0c;用以验证在生产环…...

【学习草稿】背包问题

一、01背包问题 图解详细解析 &#xff08;转载&#xff09; https://blog.csdn.net/qq_37767455/article/details/99086678 &#xff1a;Vi表示第 i 个物品的价值&#xff0c;Wi表示第 i 个物品的体积&#xff0c;定义V(i,j)&#xff1a;当前背包容量 j&#xff0c;前 i 个物…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

从实验室到产业:IndexTTS 在六大核心场景的落地实践

一、内容创作&#xff1a;重构数字内容生产范式 在短视频创作领域&#xff0c;IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色&#xff0c;生成的 “各位吴彦祖们大家好” 语音相似度达 97%&#xff0c;单条视频播放量突破百万…...

Linux入门(十五)安装java安装tomcat安装dotnet安装mysql

安装java yum install java-17-openjdk-devel查找安装地址 update-alternatives --config java设置环境变量 vi /etc/profile #在文档后面追加 JAVA_HOME"通过查找安装地址命令显示的路径" #注意一定要加$PATH不然路径就只剩下新加的路径了&#xff0c;系统很多命…...