20.Redis之缓存

1.什么是缓存?

  • Redis 最主要的用途,三个方面:
  • 1.存储数据(内存数据库)
  • 2.缓存 【redis 最常用的场景】
  • 3.消息队列【很少见】
  • 缓存 (cache) 是计算机中的⼀个经典的概念. 在很多场景中都会涉及到.
  • 核⼼思路就是把⼀些常⽤的数据放到触⼿可及(访问速度更快)的地⽅, ⽅便随时读取.
  • 速度快的设备,可以作为速度慢的设备的缓存
    最常见的是, 使用 内存 作为 硬盘【硬盘也可以作为网络的缓存浏览器的缓存】【浏览器通过 http/https 从服务器【网络】上获取到数据(html, css,js,图片,视频,音频,字体......) 并进行展示】 的缓存.(redis 定位)
  • 缓存能够有意义~~二八定律。
  • 缓存速度虽然快,但是空间小,
  • 20% 的数据, 可以应对 80% 的请求

2.使用redis作为mysql的缓存

  • 因为 mysql 等数据库,效率比较低,所以承担的并发量就有限.一旦请求数量多了,数据库的压力就会很大,甚至很容易就宕机了
  • 服务器每次处理一个请求,一定都要消耗一些硬件资源(cpu, 内存, 硬盘, 网络...)任意一种资源的消耗超出了机器能提供的上限,机器就很容易出现故障了.
  • 如何提高 mysql 能承担的并发量?(客观需求)
  • 1.开源: 引入更多的机器, 构成数据库集群,
  • 2.节流: 引入缓存, 就是典型的方案,把一些频繁读取的热点数据,保存到缓存上
    后续在查询数据的时候,如果缓存中已经存在了,就不再访问 mysql 了

3.缓存更新策略

1) 定期⽣成

每隔⼀定的周期(⽐如⼀天/⼀周/⼀个⽉), 对于访问的数据频次进⾏统计. 挑选出访问频次最⾼的前 N% 的数据.
以搜索引擎为例.
⽤⼾在搜索引擎中会输⼊⼀个 "查询词", 有些词是属于⾼频的, ⼤家都爱搜(鲜花, 蛋糕, 同城交
友, 不孕不育...). 有些词就属于低频的, ⼤家很少搜.
搜索引擎的服务器会把哪个⽤⼾什么时间搜了啥词, 都通过⽇志的⽅式记录的明明⽩⽩. 然后
每隔⼀段时间对这期间的搜索结果进⾏统计 (⽇志的数量可能⾮常巨⼤, 这个统计的过程可能
需要使⽤ hadoop 或者 spark 等⽅式完成). 从⽽就可以得到 "⾼频词表" .
这种做法实时性较低. 对于⼀些突然情况应对的并不好.
⽐如春节期间, "春晚" 这样的词就会成为⾮常⾼频的词. ⽽平时则很少会有⼈搜索 "春晚"

2) 实时⽣成

先给缓存设定容量上限(可以通过 Redis 配置⽂件的 maxmemory 参数设定).
接下来把⽤⼾每次查询:
如果在 Redis 查到了, 就直接返回.
如果 Redis 中不存在, 就从数据库查, 把查到的结果同时也写⼊ Redis.
如果缓存已经满了(达到上限), 就触发缓存淘汰策略, 把⼀些 "相对不那么热⻔" 的数据淘汰掉.
按照上述过程, 持续⼀段时间之后 Redis 内部的数据⾃然就是 "热⻔数据" 了.
通⽤的淘汰策略主要有以下⼏种:
下列策略并⾮局限于 Redis, 其他缓存也可以按这些策略展开.
FIFO (First In First Out) 先进先出
把缓存中存在时间最久的 (也就是先来的数据) 淘汰掉.
LRU (Least Recently Used) 淘汰最久未使⽤的
记录每个 key 的最近访问时间. 把最近访问时间最⽼的 key 淘汰掉.
LFU (Least Frequently Used) 淘汰访问次数最少的
记录每个 key 最近⼀段时间的访问次数. 把访问次数最少的淘汰掉.
Random 随机淘汰
从所有的 key 中抽取幸运⼉被随机淘汰掉.

4.缓存使用注意事项

  • 关于缓存预热 (Cache preheating)

  • 什么是缓存预热
  • 使⽤ Redis 作为 MySQL 的缓存的时候, 当 Redis 刚刚启动, 或者 Redis ⼤批 key 失效之后, 此时由于Redis ⾃⾝相当于是空着的, 没啥缓存数据, 那么 MySQL 就可能直接被访问到, 从⽽造成较⼤的压⼒.
  • 因此就需要提前把热点数据准备好, 直接写⼊到 Redis 中. 使 Redis 可以尽快为 MySQL 撑起保护伞.
  • 热点数据可以基于之前介绍的统计的⽅式⽣成即可. 这份热点数据不⼀定⾮得那么 "准确", 只要能帮助 MySQL 抵挡⼤部分请求即可. 随着程序运⾏的推移, 缓存的热点数据会逐渐⾃动调整, 来更适应当前情况.
  • 关于缓存穿透 (Cache penetration)

  • 什么是缓存穿透?
  • 访问的 key 在 Redis 和 数据库中都不存在. 此时这样的 key 不会被放到缓存上, 后续如果仍然在访问该 key, 依然会访问到数据库.
  • 这就会导致数据库承担的请求太多, 压⼒很⼤.
  • 这种情况称为 缓存穿透.
  •  为何产⽣?

  • 原因可能有⼏种:
  • 业务设计不合理. ⽐如缺少必要的参数校验环节, 导致⾮法的 key 也被进⾏查询了.
  • 开发/运维误操作. 不⼩⼼把部分数据从数据库上误删了.
  • ⿊客恶意攻击.
  • 如何解决?

  • 针对要查询的参数进⾏严格的合法性校验. ⽐如要查询的 key 是⽤⼾的⼿机号, 那么就需要校验当前
  • key 是否满⾜⼀个合法的⼿机号的格式.
  • 针对数据库上也不存在的 key , 也存储到 Redis 中, ⽐如 value 就随便设成⼀个 "". 避免后续频繁访
  • 问数据库.
  • 使⽤布隆过滤器先判定 key 是否存在, 再真正查询.
  • 关于缓存雪崩 (Cache avalanche)

  • 什么是缓存雪崩
  • 短时间内⼤量的 key 在缓存上失效, 导致数据库压⼒骤增, 甚⾄直接宕机.
  • 本来 Redis 是 MySQL 的⼀个护盾, 帮 MySQL 抵挡了很多外部的压⼒. ⼀旦护盾突然失效了, MySQL ⾃⾝承担的压⼒骤增, 就可能直接崩溃.
    • 为何产⽣?
    • ⼤规模 key 失效, 可能性主要有两种:
    • Redis 挂了.
    • Redis 上的⼤量的 key 同时过期.
    • 为啥会出现⼤量的 key 同时过期?
    • 这种和可能是短时间内在 Redis 上缓存了⼤量的 key, 并且设定了相同的过期时间.
    • 如何解决?
    • 部署⾼可⽤的 Redis 集群, 并且完善监控报警体系.
    • 不给 key 设置过期时间 或者 设置过期时间的时候添加随机时间因⼦

5.小结

1.缓存基本概念
2. 如何使用 redis 作为缓存
3.缓存更新策略 =>redis 内存淘汰机制,
4. 缓存使用的注意事项 [重点]

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

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

相关文章

基础—SQL—DQL(数据查询语言)聚合函数

一、引言 一般情况下,我们在进行分组查询的时候,一般配合着聚合函数来进行操作,所以先了解和学习聚合函数再学习和操作分组查询。 二、DQL—聚合函数 1、介绍 聚合函数指的是讲一列数据作为一个整体,进行纵向的计算。 2、常见…

域内用户枚举和密码喷洒

一. 域内用户枚举原理和流量 1. 原理 在AS-REQ阶段客户端向AS发送用户名,cname字典存放用户名,AS对用户名进行验证,用户存在和不存在返回的数据包不一样。 不同之处主要是在返回数据包中的状态码不同,根据不同的状态码来区分账…

数学建模 —— 人工神经网络(6)

目录 一、人工神经网络 1.1 人工神经网络结构 1.2 神经元/感知器 1.3 激活函数 1.3.1 sign函数 1.3.2 sigmoid函数(Logistic函数) 1.3.3 tanh双曲正切函数 1.3.4 ReLU函数 1.4 分类 二、BP人工神经网络 2.1 概述 2.2 处理过程 2.3 例题 2.…

Android Studio插件开发 - Dora SDK的IDE插件

IDE插件开发简介 Android Studio是一种常用的集成开发环境(IDE),用于开发Android应用程序。它提供了许多功能和工具,可以帮助开发人员更轻松地构建和调试Android应用程序。 如果你想开发Android Studio插件,以下是一…

移动系统编程-安装和运行Ionic应用程序 (Installation and Running Ionic Apps)

安装 (Installation) 假设您已经安装了Node.js和Angular,您可以使用以下命令安装Ionic: npm install -g ionic/cli您也可以不使用CLI安装Ionic,但如果您使用的是最新版本的Cordova,这样做可能会导致版本不匹配,不推荐…

【技术实操】银河高级服务器操作系统实例分享,数据库日志文件属主不对问题分析

1. 问题现象描述 2023 年 06 月 30 日在迁移数据库过程中,遇到数据库 crash 的缺陷,原因如下:在数据库启动时候生成的一组临时文件中,有 owner 为 root 的文件, 文件权限默认为 640, 当数据库需要使用的时…

高速服务区智慧公厕管理系统引导屏UI界面展示

在现代社会,高速服务区作为人们出行途中的重要休憩场所,其各项设施的智能化水平也在不断提升。其中,智慧公厕管理系统的出现,为人们带来了更加便捷、舒适的如厕体验,而引导屏 UI 界面更是这一系统的重要展示窗口。 智慧…

Python | Leetcode Python题解之第126题单词接龙II

题目: 题解: class Solution:def findLadders(self, beginWord: str, endWord: str, wordList: List[str]) -> List[List[str]]:ans []if endWord not in wordList:return anssize len(beginWord)cur_word_set {beginWord}ws set(wordList)# 用于…

WPF Binding对象、数据校验、数据转换

在WinForm中,我们要想对控件赋值,需要在后台代码中拿到控件对象进行操作,这种赋值形式,从根本上是无法实现界面与逻辑分离的。 在WPF中,微软引入了Binding对象,通过Binding,我们可以直接将控件与…

CSS双飞翼布局

双飞翼布局是一种经典的CSS布局模式&#xff0c;主要用于实现左右两列固定宽度&#xff0c;中间列自适应的布局。 比如&#xff1a;写一个左中右布局占满全屏&#xff0c;其中左、右两块固定宽 200px&#xff0c;中间自适应&#xff0c;要求先加载中间块。 <!DOCTYPE html…

启动u盘恢复成普通u盘

DiskUtility&#xff08;磁盘工具&#xff09;恢复可启动U盘为普通存储设备。点击顶部菜单栏的"抹掉"按钮。 u盘启动盘怎么恢复成u盘

如何使用Dora SDK完成Fragment流式切换和非流式切换

我想大家对Fragment都不陌生&#xff0c;它作为界面碎片被使用在Activity中&#xff0c;如果只是更换Activity中的一小部分界面&#xff0c;是没有必要再重新打开一个新的Activity的。有时&#xff0c;即使要更换完整的UI布局&#xff0c;也可以使用Fragment来切换界面。 何…

Vue3实战笔记(59)—从零开始掌握Vue3插槽机制,进阶与提高

文章目录 前言一、具名插槽二、高级列表组件示例总结 前言 接上文&#xff0c;接下来看一点稍微复杂的&#xff1a;具名插槽 一、具名插槽 子组件 MyComponent.vue&#xff1a; <template><div><slot name"header"></slot><slot><…

点到线段的最短矩离 及垂足的计算

过P做MN的垂线&#xff0c;垂足为Q&#xff0c;若Q在线段MN以内(包括与点M点N重合)&#xff0c;则最短距离为垂线段长度&#xff0c;若垂足在MN以外&#xff0c;则最短距离为PM&#xff0c;PN中的较小者。&#xff08;若P与MN共线&#xff0c;垂线长度为零&#xff0c;同样适用…

[机器学习] 低代码机器学习工具PyCaret库使用指北

PyCaret是一个开源、低代码Python机器学习库&#xff0c;能够自动化机器学习工作流程。它是一个端到端的机器学习和模型管理工具&#xff0c;极大地加快了实验周期&#xff0c;提高了工作效率。PyCaret本质上是围绕几个机器学习库和框架&#xff08;如scikit-learn、XGBoost、L…

每天半小时,让大脑变得更聪明

晚上好。 今天的文章&#xff0c;我想跟你分享一套简单又有效的「大脑保健操」。每天只需要很短的时间&#xff0c;就能有效地锻炼和强化你的脑力。 这些都是我践行了许多年的习惯&#xff0c;也有切实的实验和理论基础作为依托。 你不需要每天都完全按照这套模式来执行&#x…

Kafka篇:Kafka搭建、使用、及Flink整合Kafka文档

一、Kafka搭建 1、上传并解压改名 tar -xvf kafka_2.11-1.0.0.tgz mv kafka_2.11-1.0.0 kafka-1.0.0 2、配置环境变量 vim /etc/profile export KAFKA_HOME/usr/local/soft/kafka-1.0.0 export PATH$PATH:$KAFKA_HOME/bin source /etc/profile &#xff08;使环境变量生效…

机器学习学习

机器学习类型(按学习方式分):监督学习、半监督学习、无监督学习、强化学习; 通过已知标签训练集训练模型,使用模型及逆行预测、测试; 向量表示法,其中每一维对应一个特征(feature)或者称为属性,记为[x1,x2,...,xn] 特征值、特征、标签,共同完成训练集的数据填充,最…

FreeRTOS基础(六):中断管理

在嵌入式系统开发中&#xff0c;中断管理是一个至关重要的概念。它允许我们的系统能够及时响应外部事件&#xff0c;而不需要通过轮询的方式来浪费宝贵的处理器资源。FreeRTOS作为一款广泛应用的实时操作系统&#xff0c;它提供了灵活且高效的中断管理机制&#xff0c;可以帮助…

搭建基于Django的博客系统增加广告轮播图(三)

上一篇&#xff1a;ChatGPT搭建博客Django的web网页添加用户系统&#xff08;二&#xff09; 下一篇&#xff1a;搭建基于Django的博客系统数据库迁移从Sqlite3到MySQL&#xff08;四&#xff09; 功能概述 增加轮播图显示广告信息。 需求详细描述 1. 增加轮播图显示广告信…