[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://xiahunao.cn/news/3247885.html

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

相关文章

域泛化(Domain Generalization)

仓库:https://github.com/jindongwang/transferlearning 综述:https://arxiv.org/pdf/2103.03097、https://arxiv.org/pdf/2103.02503 1.问题及解决方案 出发点:需要解决domain shift、out-of-distribution (OOD)问题 解决方案:绕…

面试题整理 - 进程与线程问题

1.进程线程区别: 1.从本质上区分: 进程是操作系统资源分配的基本单位 线程是任务调度和执行的基本单位 2.在开销方面: 每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销 线程可以看做轻量级的进程&…

爬虫案例(读书网)(下)

上篇链接: CSDN-读书网https://mp.csdn.net/mp_blog/creation/editor/139306808 可以看见基本的全部信息:如(author、bookname、link.....) 写下代码如下: import requests from bs4 import BeautifulSoup from lxml import etreeheaders{…

设计模式:真正的建造者模式

又臭又长的set方法 经常进行Java项目开发使用各类starter的你一定见过这种代码: public class SwaggerConfig {Beanpublic Docket api() {return new Docket(DocumentationType.SWAGGER_2).select().apis(RequestHandlerSelectors.any()).paths(PathSelectors.any…

解决VMware虚拟机在桥接模式下无法上网的问题

解决VMware虚拟机在桥接模式下无法上网的问题 windows11系统自动启动了热点功能,开启热点可能会干扰虚拟机的桥接设置。 方法一:windows11可以提供网络热点服务 方法二:手动指定桥接的物理网卡 方法一:关闭热点功能 优点&#xff…

少儿编程启蒙宝典:Scratch动画游戏108变

一、编程教育的时代价值与意义 随着数字时代的深入发展,社会对人才的需求正发生深刻变革,计算思维与编程能力已成为衡量个人竞争力的重要指标。在此背景下,培养孩子们运用计算思维解决实际问题的能力,成为教育领域的重要任务。编…

运动用什么骨传导耳机好?推荐这五款运动骨传导耳机!

在运动生涯,我见证了自我挑战与超越的每一个瞬间,而这一切都离不开那如影随形的运动骨传导耳机。一款出色的运动耳机,其重要性不言而喻——它不仅是提升运动效率的得力助手,更是开启多元化运动体验的金钥匙。近年来,运…

网络结构-组件-AI(九)

深度学习网络组件 RNN公式讲解计算示意图讲解 CNN计算示意 Normalization(归一化层)Normalization常见两种方式 Dropout层 RNN 循环神经网络(recurrent neural network) 主要思想: 即将整个序列划分成多个时间步,将每一个时间步的…

创建通用JS公共模块并发布至npm

title: 创建通用JS公共模块并发布至npm tags: UMD rollup verdaccio npm categories: 模块化 概要内容 创建:JS公共模块 打包:使用rollup 打包公共模块 发布:js公共模块至verdaccio平台 发布:js公共模块至npm平台 如何创建JS公共模…

媒体邀约宣传做了13年,我们总结了哪些经验?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 「51媒体」作为一家在媒体邀约宣传领域深耕13年的专业机构,积累了一些经验。现在与大家分享下: 合理的制定媒体邀约传播方案 在进行媒体邀约前,首先需…

木舟0基础学习Java的第二十天(线程,实现,匿名有名,休眠,守护,加入,设计,计时器,通信)

多线程 并发执行的技术 并发和并行 并发:同一时间 有多个指令 在单个CPU上 交替执行 并行:同一时间 有多个指令 在多个CPU上 执行 进程和线程 进程:独立运行 任何进程 都可以同其他进程一起 并发执行 线程:是进程中的单个顺…

【人工智能】深度剖析AI伦理:强化隐私防线,推动算法公平性的核心议题

文章目录 🍊1 人工智能兴起背后的伦理及道德风险1.1 算法偏见与歧视1.2 数据隐私侵权1.3 透明度受限1.4 决策失衡1.5 AI生成内容的危险性 🍊2 建构AIGC伦理观:实现人机共创的永续提升2.1 技术手段与伦理预防2.2 即时警告与紧急关停措施2.3 法…

图片如何去水印,PS 图片去水印的几种常见方法

在数字图像的世界里,水印常常被用来标识版权或防止未经授权的使用,但有时它们却成为了美观的障碍。无论是出于个人偏好还是专业需求,去除图片上的水印已经成为一项常见的任务。 Adobe Photoshop 作为行业标准的图像编辑软件,提供…

队列(Queue),循环队列,双端队列(Deque)and LeetCode刷题

队列(Queue),循环队列,双端队列(Deque)and LeetCode刷题 1. 队列的概念2.队列的使用3. 队列的模拟实现3.1 用链式结构实现队列3.2 用顺序结构实现队列 4. 循环队列5. 双端队列(Deque&#xff09…

【内网安全】横向移动-Wmi-Smb-CME密码喷射

目录 环境介绍域信息收集-横向移动前置判断是不是在域内获取域控主机的内网ip端口扫描内网获取主机密码 域横向移动-WMI-自带&命令&套件&插件1.wmic系统自带:(单执行:即无回显) 2.cscript系统自带:(交互式) 3.wmiexec-impacket&a…

文献阅读:A Case for Managed and Model-less Inference Serving

目录 知识点记录推理服务在线推理特点 动机:为什么作者想要解决这个问题?贡献:作者在这篇论文中完成了什么工作(创新点)?规划:他们如何完成工作?1.挑战1.1 选择一个模型变体1.2 异构硬件1.3 资源提供1.4 启…

MySQL双主双从实现方式

双主双从(MM-SS) 前言 避免单一主服务器宕机,集群写入能力缺失 从 1 复制 主1 ,从 2 复制 主 2 主 1 复制 主 2,主 2 复制主 1 也就是 主 1 和主 2 互为主从。主1主2互为主从, 是为了以下情景&#xff0c…

初识XXE漏洞及ctfshow做题(373-378)

初识XXE漏洞 1.XXE简介 XXE就是XML外部实体注入,当允许引用外部实体时, XML数据在传输中有可能会被不法分子被修改,如果服务器执行被恶意插入的代码,就可以实现攻击的目的攻击者可以通过构造恶意内容,就可能导致任意…

昇思25天学习打卡营第29天 | 文本解码原理--以MindNLP为例

今天是29天,学习了文本解码原理--以MindNLP为例。 MindNLP 是一个基于 MindSpore 的开源自然语言处理(NLP)库。它具有以下特点: 支持多种 NLP 任务:如语言模型、机器翻译、问答、情感分析、序列标记、摘要等&#xff…

SPINDILOMETER:用于多导睡眠图的睡眠纺锤波模型

摘要 通过对近年来睡眠脑电(EEG)信号分析方法的研究,本文提出了一种可集成到多导睡眠图(PSG)设备中的SPINDILOMETER模型,以供PSG电生理信号研究人员、临床睡眠医生和技术人员使用。为此,通过分析PSG中的脑电信号,开发了一个测量睡…