[Redis]典型应用——缓存

news2024/11/13 12:53:44

什么是缓存

缓存(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.coloradmin.cn/o/1939238.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[CSS] 浮动布局的深入理解与应用

文章目录 浮动的简介元素浮动后的特点解决浮动产生的影响浮动后的影响解决浮动产生的影响 浮动相关属性实际应用示例示例1:图片与文字环绕示例2:多列布局示例3:响应式布局 总结 浮动布局是CSS中一种非常强大的布局方式,最初设计用…

as是python关键字吗

关键字as的作用把紧跟其后的对象代替其前方的一个对象,其作用效果如下所示: import scrapy as tools 这个表达式中就是在当前这个模块中,使用tools可以代替scrapy,相当于C中的宏定义。在该as作用域中,可以使用tools来代…

STM32CubeIDE工程编译提示“has a LOAD segment with RWX permissions”解决办法

0 问题描述 使用STM32CubeIDE进行STM32MP135的开发时,编译过程打印了如下警告: 描述:has a LOAD segment with RWX permissions1 解决办法 右键工程,依次点击Properties->C/C Build->Settings->MCU GCC Linker->M…

如何将PDF转换成可以直接编辑的CAD图纸?

PDF图纸是为了让用户更好的阅览CAD文件,但是,当我们想要对其进行编辑的时候,PDF图纸就是一个麻烦了。那么PDF转换成CAD后可以编辑吗?如何将PDF转换成可以直接编辑的CAD图纸呢?本篇给你答案。 1、启动迅捷CAD编辑器&…

vcs+verdi搭建基础仿真的版本V1

2024-7-20 数字软件安装,仿真环境测试 dut重新修改 makefile重新修改 verdi整合完成 dut.v module dut ( );reg clk;initial beginclk 0;forever begin#10 clk ~clk;endendinitial begin$fsdbDumpfile("verilog.fsdb");$fsdbDumpvars();$vcdpluson;$…

WAAP安全防护能力

利用传统安全漏洞发动攻击的难度不断提升,攻击者的重心从传统的应用漏洞转向无明显攻击特征,模拟合法业务操作的自动化攻击。Web应用程序和API面临众多攻击场景,根据国内的情况进行汇总分析,主要分为恶意爬虫防护、安全攻击防护、…

电脑显示mfc140u.dll丢失的修复方法,总结7种有效的方法

mfc140u.dll是什么?为什么电脑会出现mfc140u.dll丢失?那么mfc140u.dll丢失会给电脑带来什么影响?mfc140u.dll丢失怎么办?今天详细给大家一一探讨一下mfc140u.dll文件与mfc140u.dll丢失的多种不同解决方法分享! 一、mfc…

【Espressif-ESP32S3】【VScode】安装【ESP-IDF】插件及相关工具链

一、ESP-IDF简介 二、VScode安装ESP-IDF插件 三、安装ESP-IDF、ESP-IDF-Tools以及相关工具链 四、测试例程&编译烧录 五、IDF常用指令 资料下载: 链接:https://pan.baidu.com/s/15Q2rl2jpIaKfj5rATkYE6g?pwdGLNG 提取码:GLNG 一、ESP-…

Linux 文件安装的mysql 启动

1、找到my.cnf 2、确定文件类容: 并确保这些重要的配置:basedir 、datadir、socket 文件或目录都存在 3、找到mysqld 位置 4、启动mysqld mysqld --defaults-file/etc/my.cnf --usermysql

Codeforces Round 960 (Div. 2)

文章目录 题目链接A. Submission BaitB. Array CraftC. Mad MAD Sum 题目链接 点击跳转codeforces A. Submission Bait 这是一道博弈题,比较简单,但是赛时直接就WA了两发,刚开始把题想简单了,第二发没有考虑清楚。  题意&#…

【云原生】Prometheus 服务自动发现使用详解

目录 一、前言 二、Prometheus常规服务监控使用现状​​​​​​​ 2.1 Prometheus监控架构图 2.2 Prometheus服务自动发现的解决方案 三、Prometheus服务自动发现介绍 3.1 什么是Prometheus服务自动发现 3.2 Prometheus自动服务发现策略 3.3 Prometheus自动服务发现应用…

又缩水Unity7月闪促限时4折活动模块化角色模板编辑器场景美术插件拖尾怪物3D模型UI载具AI对话TPS飞机RPG和FPS202407

Flash Deals are Coming Back! 限时抢购又回来了! July 17, 2024 8:00:00 PT to July 24, 2024 7:59:00 PT 太平洋时间 2024 年 7 月 17 日 8:00:00 至 2024 年 7 月 24 日 7:59:00(太平洋时间)…

ThreadX打印tick(时钟滴答)方法

0 工具准备 ThreadX V6.2.0 1 ThreadX打印tick(时钟滴答)方法 int ostick(void) {printf("tick : %lu\r\n", _tx_time_get());return 0; }打印效果展示:

240717.LeetCode——2974.最小数字游戏

题目描述 你有一个下标从 0 开始、长度为 偶数 的整数数组 nums ,同时还有一个空数组 arr 。Alice 和 Bob 决定玩一个游戏,游戏中每一轮 Alice 和 Bob 都会各自执行一次操作。游戏规则如下: 每一轮,Alice 先从 nums 中移除一个 …

[译] Rust项目的基础设施

本篇是对 RustConf 2023中的Infrastructure for Rust这一视频的翻译与整理, 过程中为符合中文惯用表达有适当删改, 版权归原作者所有. 我今天要和大家讨论支持Rust及Rust项目的基础设施。Rust是一门令人惊叹的语言,我非常喜欢它,看到它的普及度和社区的成长令人非常满意。但从项…

电力需求预测挑战赛笔记 Task3 #Datawhale AI 夏令营

上文: 电力需求预测挑战赛笔记 Task2 #Datawhale AI 夏令营-CSDN博客文章浏览阅读80次。【代码】电力需求预测挑战赛笔记 Task2。https://blog.csdn.net/qq_23311271/article/details/140360632 前面我们介绍了如何使用经验模型以及常见的lightgbm决策树模型来解决…

GIT命令学习 一

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 ☁️运维工程师的职责:监控,备份,应急故障处理 ​​

Django教程(003):orm操作数据库

文章目录 1 orm连接Mysql1.1 安装第三方模块1.2 ORM1.2.1、创建数据库1.2.2、Django连接数据库1.2.3、django操作表1.2.4、创建和修改表结构1.2.5、增删改查1.2.5.1 增加数据1.2.5.2 删除数据1.2.5.3 获取数据1.2.5.4 修改数据 1 orm连接Mysql Django为了使操作数据库更加简单…

企业im是什么?

企业IM(Enterprise Instant Messaging)是为企业提供的一种专业化即时通讯系统,也被称为企业级即时通讯。WorkPlus作为一种企业级即时通讯系统,为企业提供了全面的通讯和协作解决方案。本文将详细介绍企业IM的概念、作用以及WorkPl…

lse:一款专为渗透测试和CTF设计的Linux枚举工具

关于linux-smart-enumeration linux-smart-enumeration是一款专为渗透测试和CTF设计的Linux枚举工具,该工具可以帮助广大研究人员收集与本地Linux系统安全相关的信息。 工具特性 该工具从2.0版本开始符合POSIX标准,并且经过了shellcheck和posh测试。它…