Redis应用--缓存

目录

一、什么是缓存

1.1 二八定律

二、使用Redis作为缓存

三、缓存的更新策略

3.1 定期更新

3.2 实时生成

四、缓存预热、缓存穿透、缓存雪崩和缓存击穿

4.1 缓存预热

4.2 缓存穿透

4.3 缓存雪崩

4.4 缓存击穿


一、什么是缓存

缓存(cache)是计算机的一个经典的概念,在很多场景都会涉及到。

核心思路就是把一些常用的数据放到访问速度更快的地方,方便随时读取。

注:我们知道对于硬件的访问速度来说,通常情况下 CPU寄存器>内存>硬盘>网络

那么硬盘相对于网络来说就是“触手可及的”,我们就可以使用硬盘作为网络的缓存

对于计算机硬件来说, 往往访问速度越快的设备, 成本越高, 存储空间越小.
缓存是更快, 但是空间上往往是不足的. 因此大部分的时候, 缓存只放一些热点数据 (访问频繁的数据), 就非常有用了.

1.1 二八定律

“二八定律”也就是说20%的数据就能应对80%的访问场景。因此我们只需要将这少量的热点数据缓存起来,就可以应对大多数的场景,从而在整体上有着明显的性能提升。

二、使用Redis作为缓存

在一个网站中我们通常会使用一个关系型数据库(比如MySQL)来存储数据。

关系型数据库虽然功能强大, 但是有⼀个很大的缺陷, 就是性能不高. (换而言之, 进行⼀次查询操作消耗的系统资源较多).因此,如果访问数据库的并发量比较高,对于数据库服务器的压力是很大的,很容易就会导致数据库服务器宕机。
如何让数据库能够承担更大的并发量呢?核心思路主要是两个:
开源:引入更多的机器,部署更多的数据库实例,构成数据库集群。
节流:引入缓存,使用其他的方式保存经常访问的热点数据,从而降低直接访问数据库的请求数量。
Redis就是一个作为数据库缓存的常见方案。
Redis访问速度比MySQL快很多,或者说处理同一个访问请求,Redis消耗的系统资源比MySQL少很多,因此Redis能支持的并发量更大。
Redis数据在内存中,访问内存比硬盘快很多
Redis知识支持简单的key-value存储,不涉及复杂查询的那么多限制规则。

 引入缓存后业务执行流程如下:

客户端访问业务服务器,发起查询请求

业务服务器先查询Redis,看想要的数据在Redis是否存在

     如果存在就直接返回,此时就不必访问MySQL了

     如果不存在,再查询MySQL

按照上述讨论的 "二八定律" , 只需要在 Redis 中放 20% 的热点数据, 就可以使 80% 的请求不再真正查询数据库了.

三、缓存的更新策略

3.1 定期更新

每隔一定的周期,对于访问频繁的数据进行统计,挑选出访问频次最高的前n%的数据。

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

3.2 实时生成

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

接下来把用户的每次查询:

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

如果缓存已经满了(达到上限), 就触发缓存淘汰策略, 把⼀些 "相对不那么热门" 的数据淘汰掉.
按照上述过程, 持续⼀段时间之后 Redis 内部的数据自然就是 "热门数据" 了.
通用的淘汰策略有以下几种:
FIFO (First In First Out) 先进先出
把缓存中存在时间最久的(也就是先来的数据)淘汰掉。
LRU (Least Recently Used) 淘汰最久未使用的
记录每个key的最近访问时间,把最近访问时间最老的key淘汰掉。
LFU (Least Frequently Used) 淘汰访问次数最少的
记录每个key最近一段时间的访问次数,把访问次数最少的key淘汰掉
Random 随机淘汰
在所有key中随机抽取幸运儿淘汰。
Redis内置的淘汰策略如下:
volatile-lru 当内存不⾜以容纳新写⼊数据时,从设置了过期时间的key中使⽤LRU(最近最
少使⽤)算法进⾏淘汰allkeys-lru 当内存不⾜以容纳新写⼊数据时,从所有key中使⽤LRU(最近最少使⽤)算法进
⾏淘汰.volatile-lfu 4.0版本新增,当内存不⾜以容纳新写⼊数据时,在过期的key中,使⽤LFU算法
进⾏删除key.allkeys-lfu 4.0版本新增,当内存不⾜以容纳新写⼊数据时,从所有key中使⽤LFU算法进⾏
淘汰.volatile-random 当内存不⾜以容纳新写⼊数据时,从设置了过期时间的key中,随机淘汰数
据.allkeys-random 当内存不⾜以容纳新写⼊数据时,从所有key中随机淘汰数据.volatile-ttl 在设置了过期时间的key中,根据过期时间进⾏淘汰,越早过期的优先被淘汰.
(相当于 FIFO, 只不过是局限于过期的 key)noeviction 默认策略,当内存不⾜以容纳新写⼊数据时,新写⼊操作会报错
整体来说 Redis 提供的策略和我们上述介绍的通用策略是基本⼀致的. 只不过 Redis 这里会针对 "过期key" 和 "全部 key" 做分别处理

四、缓存预热、缓存穿透、缓存雪崩和缓存击穿

4.1 缓存预热

使用 Redis 作为 MySQL 的缓存的时候, 当 Redis 刚刚启动, 或者 Redis ⼤批 key 失效之后, 此时由于Redis 自身相当于是空着的, 没啥缓存数据, 那么 MySQL 就可能直接被访问到, 从而造成较大的压力.因此就需要提前把热点数据准备好,直接写入到Redis,使Redis可以尽快为MySQL撑起保护伞
这份热点数据不⼀定非得那么 "准确", 只要能帮助MySQL 抵挡大部分请求即可. 随着程序运行的推移, 缓存的热点数据会逐渐自动调整, 来更适应当前情况

4.2 缓存穿透

什么是缓存穿透?

访问的 key 在 Redis 和数据库中都不存在. 此时这样的 key 不会被放到缓存上, 后续如果仍然在访问该key, 依然会访问到数据库.
这就会导致数据库承担的请求太多, 压力很大.
这种情况称为缓存穿透.
产生这种情况的原因有以下几个:
业务设置不合理,比如缺少必要的参数校验环节,导致非法的key也被查询了
开发/运维误操作,不小心将部分数据从数据库中误删了
黑客恶意攻击
如何解决这种情况:
针对要查询的参数进行严格的合法性校验. 比如要查询的 key 是用户的手机号, 那么就需要校验当前 key 是否满足⼀个合法的手机号的格式.
针对数据库上也不存在的 key , 也存储到 Redis 中, 比如 value 就随便设成⼀个 "". 避免后续频繁访
问数据库.
使用布隆过滤器先判定 key 是否存在, 再真正查询.

4.3 缓存雪崩

什么是缓存雪崩?

短时间内大量的 key 在缓存上失效,导致数据库压力骤增,甚至直接宕机。

产生原因:

Redis挂了

Redis上大量的key同时过期

解决方案:

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

不给key设置过期时间或者设置过期时间时添加随机时间因子

4.4 缓存击穿

什么是缓存击穿?

相当于缓存雪崩的特殊情况. 针对热点 key , 突然过期了, 导致大量的请求直接访问到数据库上, 甚至引起数据库宕机.
解决方案:
基于统计的方式发现热点key,并设置永不过期
进行必要的服务降级,例如访问数据库时使用分布式锁,降低同时请求数据库服务器的并发量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/80866.shtml

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

相关文章

Unity 喷烟喷气特效:喷快消失慢

快速喷气缓慢消失同时播放3*3序列帧动画。常用在火车烟囱特效、气体释放、摔倒、等效果中,可变种应用场景较多。 下列为Particle System参数: Color over Lifetime参数: UnityEditor.GradientWrapperJSON:{"gradient":{"ser…

关于收集 Android Telephony 网络信息的设计思考2

需求: 目标1: Android Telephony data(数据模块)侧收集多源(ServiceStateTracker/ImsService/其他)网络状态信息。目标2: 收集的数据需统一上报/存储到外部App的Provider。字段分散,不方便只在ServiceStateTracker中收集和插入。多触发点/多场景,需要统一插入。一、架构…

Elasticsearch 深入分析三种分页查询【Elasticsearch 深度分页】

前言: 在前面的 Elasticsearch 系列文章中,分享了 Elasticsearch 的各种查询,分页查询也分享过,本篇将再次对 Elasticsearch 分页查询进行专题分析,“深度分页” 这个名词对于我们来说是一个非常常见的业务场景&#…

CodeBuddy(腾讯云代码助手)最新功能——智能体 Craft 体验

文章目录 📋 前言🎯 关于智能体 Craft🎯 智能体 Craft 体验🧩 安装方法🧩 如何使用🧩 Craft 初体验🧩 Craft 生成代码效果体验 📝最后 📋 前言 CodeBuddy(腾讯…

05 接口自动化-框架封装思想建立之httprunner框架(中)

文章目录 一、httprunner常规的关键字详解httprunner测试用例的结构简化: 二、httpruner接口自动化项目架构三、环境变量四、代码项目框架如下图:api/wx_get_token.ymlapi/wx_get_tag.ymltestcases/wx_get_tag.ymltestsuites/wx_get_tag.yml.env 一、htt…

LabVIEW中EtherCAT从站拓扑离线创建及信息查询

该 VI 主要用于演示如何离线创建 EtherCAT 从站拓扑结构,并查询从站相关信息。EtherCAT(以太网控制自动化技术)是基于以太网的实时工业通信协议,凭借其高速、高效的特性在自动化领域广泛应用。与其他常见工业通讯协议相比&#xf…

java的synchronized 原理及功能

简介: Java中的synchronized关键字是一种同步机制,用于控制多个线程对共享资源的访问。 原理: 在Java锁有一个内部锁 Intrinsic Lock,也称为监视器锁或管程锁,每个Java对象都有一个关联的监视器锁,隐式锁…

HarmonyOS NEXT端云一体化工程目录结构

视频课程学习报名入口:HarmonyOS NEXT端云一体化开发 端云一体化开发工程由端开发工程(Application)和云开发工程(CloudProgram)两大核心模块构成。 1)端开发工程目录结构 端开发工程主要用于开发应用端侧的业务代码,通用云开发模板的端开发工程目录结构如下图所示: …

普通用户的服务器连接与模型部署相关记录

普通用户的服务器连接与模型部署相关记录 一、从登录到使用自己的conda 1.账号登陆: ssh xxx172.31.226.236 2.下载与安装conda: 下载conda: wget -c https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh 安装con…

亲测有效!OGG 创建抽取进程报错 OGG-08241,如何解决?

前言 今天在测试 OGG 一个功能的时候,需要重新初始化 oggca,所以重装了一下 OGG。重建完之后重新添加抽取进程报错,一直无法添加成功: 经过一翻分析,找到了解决方案,本文记录一下解决过程。 问题描述 OG…

Docker构建 Dify 应用定时任务助手

概述 Dify 定时任务管理工具是一个基于 GitHub Actions 的自动化解决方案,用于实现 Dify Workflow 的定时执行和状态监控。无需再为缺乏定时任务支持而感到困扰,本工具可以帮助设置自动执行任务并获取实时通知,优化你的工作效率。 注意&…

ubuntu24.04+RTX5090D 显卡驱动安装

初步准备 Ubuntu默认内核太旧,用mainline工具安装新版: sudo add-apt-repository ppa:cappelikan/ppa sudo apt update && sudo apt full-upgrade sudo apt install -y mainline mainline list # 查看可用内核列表 mainline install 6.13 # 安装…

网络爬虫(Web Crawler)详解

网络爬虫(Web Crawler)详解 1. 基本概念与核心目标 定义: 网络爬虫是一种自动化的程序,通过HTTP协议访问网页,提取并存储数据(如文本、链接、图片),并根据策略递归访问新链接。核心目标: 数据采集:抓取特定网站或全网公开数据。索引构建:为搜索引擎提供页面内容(如…

大模型如何助力数学可视化?

大家好,我是 i 学习的老章 在数学学习和教学中,将抽象概念可视化对于理解至关重要。Manim 是一个强大的数学动画引擎,由著名数学科普视频作者 3Blue1Brown 开发并广为人知。 老章较早之前就介绍过 manim:B 站上爆红的数学视频&a…

Oracle基础知识(二)

目录 1.聚合函数 2.COUNT(1)&COUNT(*)&COUNT(字段)区别(面试常问) 3.分组聚合——group by 4.去重:DISTINCT 、GROUP BY 5.聚合函数的过滤HAVING 6.oracle中having与where的区别 (面试常问) 7.ROUND与TRUNC函数 8.ROLLUP上卷…

DTAS 3D多约束装配助力悬架公差分析尺寸链计算:麦弗逊/双叉臂/多连杆/H臂一网打尽

摘要:汽车四轮定位参数与悬架密切相关。汽车悬架对于车辆的行驶性能、安全性和舒适性至关重要。DTAS 3D提供了各类型悬架的公差仿真分析方法。 关键字:DTAS 3D、前后悬架、公差仿真分析、 运动耦合 一、悬架公差分析综述 悬架是车身(或车架…

Serverless爬虫架构揭秘:动态IP、冷启动与成本优化

一、问题背景:旧技术的瓶颈 在传统爬虫架构中,我们通常部署任务在本地机器或虚拟机中,搭配定时器调度任务。虽然这种方式简单,但存在以下明显缺陷: 固定IP易被封禁:目标网站如拼多多会通过IP频率监控限制…

设备预测性维护的停机时间革命:中讯烛龙如何用AI重构工业设备管理范式

在工业4.0的智能化浪潮中,非计划停机每年吞噬企业3%-8%的产值。中讯烛龙预测性维护系统通过多模态感知矩阵分布式智能体的创新架构,实现设备健康管理的范式跃迁,帮助制造企业将停机时间压缩70%以上。本文将深度解析技术实现路径与行业级实践方…

Java面试攻略:从Spring Boot到微服务架构的深入探讨

Java面试攻略:从Spring Boot到微服务架构的深入探讨 场景设定 在一家知名互联网大厂的会议室里,资深面试官王老师正在对一位求职者谢飞机进行技术面试。谢飞机是一位幽默风趣的程序员,他的回答有时让人捧腹大笑。 第一轮:核心技…

LlamaIndex

1、大语言模型开发框架的价值是什么? SDK:Software Development Kit,它是一组软件工具和资源的集合,旨在帮助开发者创建、测试、部署和维护应用程序或软件。 所有开发框架(SDK)的核心价值,都是降低开发、维护成本。 大语言模型开发框架的价值,是让开发者可以更方便地…