[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.mzph.cn/bicheng/47452.shtml

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

相关文章

EE trade:强平和爆仓的区别

在金融交易市场中,杠杆交易的引入,让投资者可以用少量的资金撬动更大的头寸,获取更大的收益。然而,杠杆交易也带来了更大的风险,一旦市场波动,投资者可能会面临强平或爆仓的风险。了解强平和爆仓的区别&…

选择Maya进行3D动画制作与渲染的理由

如果你对3D动画充满热情并追求成为专业3D动画师的梦想,你一定听说过Maya——近年来3D动画的行业标准。Maya被3D艺术家广泛使用,你是否想知道为什么Maya总是他们的首选?下面一起来了解下。 一、什么是Maya? 由Autodesk开发的Maya是…

2024年土木建筑与结构工程国际会议(IACCASE 2024)

2024年土木建筑与结构工程国际会议 2024 International Conference on Civil and Structural Engineering 【1】会议简介 2024年土木建筑与结构工程国际会议旨在为全球土木建筑与结构工程领域的专家学者、研究人员及从业人员提供一个交流与合作的平台。会议聚焦该领域的最新研究…

影院选座系统小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,影院信息管理,电影类型管理,放映厅管理,电影信息管理,系统管理 微信端账号功能包括:系统首页,影院信息&…

学习小记-Nacos的服务注册与发现原理

服务注册: 当一个服务实例启动时,它会向 Nacos 服务器注册自己的信息,包括 IP 地址、端口号、元数据(如服务版本、区域信息等)。服务实例使用 Nacos API 发送注册请求,Nacos 服务器接收请求并存储服务实例信…

[iOS]浅析isa指针

[iOS]浅析isa指针 文章目录 [iOS]浅析isa指针isa指针isa的结构isa的初始化注意事项 上一篇留的悬念不止分类的实现 还有isa指针到底是什么 它是怎么工作的 class方法又是怎么运作的 class_data_bits_t bits; // class_rw_t * plus custom rr/alloc flags 这里面的class又是何方…

python的tkinter、socket库开发tcp的客户端和服务端

一、tcp通讯流程和开发步骤 1、tcp客户端和服务端通讯流程图 套接字是通讯的利器,连接时要经过三次握手建立连接,断开连接要经过四次挥手断开连接。 2、客户端开发流程 1)创建客户端套接字 2)和服务端器端套接字建立连接 3&#x…

Linux·基本指令(下)

1. mv 指令 (move) 语法:mv[选项] 源文件或目录 目标文件或目录 功能:将源文件或目录剪贴到一个新位置,或给源文件或目录改名但不会改变其内容 常用选项: -f :force 强制,如果目标文件已经存在,…

HCIE-AI大模型直通车火热报名中

第一阶段:HCIA-AI Solution Architect(直播,39课时) 该阶段详细介绍 AI 大模型所需基础技术栈,包含深度学习基础、计算机视觉技术、自然语言处理技术、华为开源深度学习框架 MindSpore、注意力制、Transformer 架构&am…

Spock单元测试框架使用介绍和实践

背景 单元测试是保证我们写的代码是我们想要的结果的最有效的办法。根据下面的数据图统计,单元测试从长期来看也有很大的收益。 单元测试收益: 它是最容易保证代码覆盖率达到100%的测试。可以⼤幅降低上线时的紧张指数。单元测试能更快地发现问题。单元测试的性…

【spring boot】初学者项目快速练手

一小时带你从0到1实现一个SpringBoot项目开发_哔哩哔哩_bilibili 一、简介 二、项目结构 三、代码结构 1.生成框架 Spring Initializr 快速生成一个初始的项目代码,会生成一个demo文件 打开intellj idea,导入demo文件 2.目录结构 源码都放在src-ma…

“论软件维护方法及其应用”精选范文,软考高级论文,系统架构设计师论文

论文真题 软件维护是指在软件交付使用后,直至软件被淘汰的整个时间范围内,为了改正错误或满足 新的需求而修改软件的活动。在软件系统运行过程中,软件需要维护的原因是多种多样的, 根据维护的原因不同,可以将软件维护…

Lua基础知识入门

1 基础知识 标识符:标识符的定义和 C语言相同:字母和下划线_ 开头, 下划线_ 大写字母一般是lua保留字, 如_VERSION 全局变量:默认情况下,变量总是认为是全局的,不需要申明,给一个变…

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

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

HP Superdome2小型机监控指标解读

监控易是一款专注于IT基础设施监控的软件,能够实时监控服务器的各项性能指标,确保服务器的稳定运行。针对HP Superdome2小型机,监控易通过IPMI和网页抓取数据的方式,监测包括服务器温度、风扇及电压等在内的关键指标,为…

Postfix+Dovecot+Roundcube开源邮件系统搭建系列1-2:系统搭建目标+MariaDB数据库配置(MySQL)

1. 系统搭建目标 通过本系列文章,最终可以部署一套提供如下服务的邮件系统: SMTP服务:由Postfix提供,监听25、465、587端口。POP3服务:由Dovecot提供,监听110、995端口。IMAP服务:由Dovecot提…

Java基础笔记(面试题)

一、Tomcat中为什么要使用自定义类加载器 Tomcat中可以放多个Java项目的jar文件,如果每个jar文件中都有一个User的类,那么User类在没有自定义类加载器的情况下是只能加载一次;想要加载多次,只能自定义类加载器 二、JDK、JRE、JVM…

项目管理进阶之RACI矩阵

前言 项目管理进阶系列续新篇。 RACI?这个是什么矩阵,有什么用途? 在项目管理过程中,如Team规模超5以上时,则有必要采用科学的管理方式,满足工作需要。否则可能事倍功半。 Q:什么是RACI矩阵 …

【简单介绍Gitea】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

吴恩达大模型系列课程《Prompt Compression and Query Optimization》中文学习打开方式

Prompt Compression and Query Optimization GPT-4o详细中文注释的Colab观看视频1 浏览器下载插件2 打开官方视频 GPT-4o详细中文注释的Colab 中文注释链接:https://github.com/Czi24/Awesome-MLLM-LLM-Colab/tree/master/Courses/Prompt-Compression-and-Query-Op…