上篇文章:

Redis原理之集群https://blog.csdn.net/sniper_fandc/article/details/149141342?fromshare=blogdetail&sharetype=blogdetail&sharerId=149141342&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

目录

1 Redis作为MySQL缓存

2 缓存更新策略

2.1 定期生成

2.2 实时生成

3 缓存预热(Cache preheating)

4 缓存穿透(Cache penetration)

5 缓存雪崩(Cache avalanche)

6 缓存击穿(Cache breakdown)


        由于Redis基于内存,比基于磁盘的数据库查询效率(读请求)快的多,因此Redis常用于作为MySQL数据库的缓存。而内存成本高,因此通常只往内存存储少量的热点数据。

1 Redis作为MySQL缓存

        关系型数据库比如MySQL查询效率一般比较慢,有如下原因:

        1.基于磁盘,磁盘IO速度慢。

        2.如果查询不能命中索引,就需要遍历表,增加磁盘IO次数。

        3.关系型数据库会对执行的SQL进行一些解析、校验、优化等工作,进一步增加耗时。

        4.如果是复杂查询,比如涉及到多表联查,笛卡尔积的时间复杂度O(M*N),效率就更低了。

        因此在高并发的环境下,只使用MySQL很容易宕机。为了优化系统性能,提高系统并发量,有两种方式:1.增加MySQL集群,但是成本很高。2.使用Redis作为缓存。方式2就是业界常用的方式:

        注意:这种方式只是加快了读请求的查询效率,而写请求缓存并不能加快效率,还是需要写到MySQL中。

2 缓存更新策略

2.1 定期生成

        定期对访问的数据进行频次统计(通常基于日志分析),选取频次最高的那部分数据作为热点数据存入缓存中。

        优点:实现简单,过程可控,方便排查问题。

        缺点:数据实时性不够。

2.2 实时生成

        实时生成就是当Redis查询未命中时,服务器就会去MySQL数据库查询,并将查询的数据写入到Redis缓存中。

        优点:数据具有实时性。

        缺点:缓存容易很快就写满。

        正因为这样的缺点,就需要合适的内存淘汰策略来更新:

        FIFO:先进先出,缓存时间最久的数据先淘汰。

        LRU:淘汰最久未使用,每个数据设置最近访问时间,优先淘汰最近访问时间最久的数据。

        LFU:淘汰最少使用的,每个数据设置最近一段时间访问次数,优先淘汰访问次数最少的数据。

        Random:随机淘汰。

        而Redis内部也用到了这些策略思想,并按照key是否设置过期时间对这些策略进行了细化:

        volatile-lru:针对设置了过期时间的key(只要设置了过期时间,即使还没过期,如果内存满了又有新数据写入就会淘汰),按照LRU思想淘汰。

        allkeys-lru:针对所有的key,按照LRU思想淘汰。

        volatile-lfu:针对设置了过期时间的key,按照LFU思想淘汰。

        allkeys-lfu:针对所有的key,按照LFU思想淘汰。

        volatile-random:针对设置了过期时间的key,随机淘汰。

        allkeys-random:针对所有的key,随机淘汰。

        volatile-ttl:按照ttl(生存时间,也就是设置了过期时间的key),越早过期越优先淘汰(局限于设置了过期时间key的FIFO)。

        noeviction:默认策略,内存满了再写入就报错。

3 缓存预热(Cache preheating)

        当Redis刚启动或大批key同时过期,此时Redis中没有数据,查询就无法命中缓存,从而去查MySQL,给数据库带来大量查询压力。

        解决办法:通过缓存预热,即提前给缓存中存入一些数据(不一定完全是热点数据),来帮助MySQL减轻大量请求的压力。可以采用定期生成的策略来离线为Redis提前存入一些热点数据,随着时间推移,缓存中的数据最终变为真正的热点数据。

4 缓存穿透(Cache penetration)

        查询的key在Redis和MySQL数据库中都不存在,这样的key不会被实时缓存到Redis中,后续如果这类key频繁访问,依然会对MySQL造成较大压力。

        问题产生原因:1.业务未进行合理的参数校验,导致非法的key被查询。2.数据库部分数据被误删。3.黑客攻击。

        解决办法:1.业务设计更规范,进行必要的参数校验。2.针对不存在的key,可以在MySQL也未命中后,把该key存入Redis中,value设为非法值(比如””,避免频繁访问数据库。3.使用布隆过滤器(hash+bitmap,能够用较少的空间和时间判断某个数据是否存在)存入所有的key,查询Redis和数据库前先查布隆过滤器是否存在该key。

5 缓存雪崩(Cache avalanche)

        短时间内Redis上的大量的key失效,从而导致大量的查询未命中缓存,给数据库带来较大压力。

        问题产生原因:1.Redis节点宕机。2.在短时间内设置了大量过期时间相同的key。

        解决办法:1.部署Redis集群保证高可用性,并进行安全监控。2.不设置过期时间或设置过期时间时附加随机种子,保证不会同时过期。

6 缓存击穿(Cache breakdown)

        缓存穿透的特殊情况,缓存穿透是针对普遍的key(包括热点和非热点)突然同时失效的问题,而缓存击穿是指热点key突然过期,导致大量查询未命中去查数据库。

        解决办法:1.统计出热点key,并设置永不过期。2.必要时进行服务降级(关掉不必要的服务),比如使用分布式锁限制数据库的访问请求。

下篇文章:

Redis原理之分布式锁https://blog.csdn.net/sniper_fandc/article/details/149142059?fromshare=blogdetail&sharetype=blogdetail&sharerId=149142059&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

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

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

相关文章

关于集合的底层数据结构

单列集合Collection分为list集合和set集合list集合分为ArrayList和LinkedListArrayList--底层数据结构是数组1.通过索引查询快2.增删要重构索引,增删慢 LinkedList--底层数据结构是链表1.无索引查询慢2.通过改变前节点的尾指针和后节点的前指针指向可快速增删,增删快set集合(…

批量插入技巧:减少事务提交次数的性能提升

一、事务提交成本分析每次事务提交触发‌磁盘I/O同步‌(WAL机制)、‌日志写入‌和‌锁资源释放‌操作,高频独立提交会产生指数级开销‌。实验表明:MySQL提交1万次单条插入比单次批量插入‌慢20倍以上‌‌。高频提交还加剧锁竞争与…

importlib.import_module() 的用法与实战案例

🌟 一、什么是 importlib? importlib 是 Python 的一个内置标准库,用于在程序运行时 动态导入模块。 🔤 对比:普通 import vs importlib方式示例特点静态导入import os编写代码时就确定要导入的模块动态导入importlib.…

Oracle 12c 创建数据库初级教程

1. 连接到Oracle sqlplus / as sysdba Oracle数据库名称默认为ORCL或sqlplus /ORCL as sysdba Oracle数据库名称默认为ORCL2. 创建表空间(数据库) create user YOUR_USERNAME identified by "YOUR_PASSWORD"; YOUR_USERNAME为数据库名称和登…

zabbix服务器告警处理

zabbix服务器告警,信息为:Utilization of poller processes over 75%处理办法为修改zabbix_server.conf配置文件,一般情况下为/etc/zabbix目录下。根据自己轮询器的类型修改对应的轮询器的数量;我这里把StartPollers,S…

随笔20250721 PostgreSQL实体类生成器

我来帮你创建一个C#程序,从PostgreSQL数据库读取表结构并生成对应的实体类文件。我已经创建了一个完整的PostgreSQL实体类生成器。这个程序包含以下主要功能:主要特性数据库连接: 使用Npgsql连接PostgreSQL数据库表结构读取: 自动读取所有表的结构信息类…

B树、B-树与B+树

B树、B-tree与B树 在计算机科学,尤其是数据库和文件系统的领域中,B树、B-tree和B树是理解数据如何被高效存储和检索的关键。它们之间关系紧密,但功能和应用上又存在着决定性的差异。 一、 核心概念澄清:B树就是B-tree 首先需要明确…

视频格式转换工厂v3.2.5,集音视频、图片处理78MB

今天,我们要介绍的是一款功能强大的视频处理软件——视频格式转换工厂。这款软件已经完美破解,无需登录即可享受全部高级功能。它不仅支持视频格式转换,还涵盖了音频、图片处理等多种功能,是一款真正的多媒体处理工具。 视频格式转…

VUE 中父级组件使用JSON.stringify 序列化子组件传递循环引用错误

背景 VUE 中父级组件使用JSON.stringify 序列化子组件传递的数据会报错 runtime-core.esm-bundler.js:268 Uncaught TypeError: Converting circular structure to JSON –> starting at object with constructor ‘Object’ — property ‘config’ closes the circle 原因…

HTTP,HTTPS

在网络工程师、开发工程师、运维工程师等岗位的面试中,​​HTTP/HTTPS​​ 是高频必考知识点,尤其在前端、后端、测试、DevOps等与网络通信相关的职位中。以下是系统化的核心考点梳理,涵盖基础概念、协议机制、安全特性及应聘高频问题。​​一…

Nginx访问日志分析在云服务器环境的技术实现与案例

在云计算时代,Nginx访问日志分析已成为服务器运维的关键环节。本文将深入解析如何通过日志切割、实时监控和可视化展示三大技术路径,实现云环境下Nginx日志的高效分析。我们将结合具体案例,演示从原始日志到运维决策的完整技术闭环&#xff0…

鸿蒙实现一次上传多张图片

记录初接触鸿蒙,遇到的一个问题,需求是点击一个图片上传的号图,访问本地图片,可以选择多张图片并上传。下面是图片上传后的方法://选择图片并上传private async showPhotoPicker() {const maxImageCount 3;const rema…

【STM32】CRC 校验函数

先上一下 CRC校验 的源代码&#xff1a; void crc_check(unsigned char *ptr,unsigned int len) //crc为开源函数 {unsigned long wcrc0XFFFF;//预置16位crc寄存器&#xff0c;初值全部为1unsigned char temp;//定义中间变量int i0,j0;//定义计数for(i0;i<len;i)//循环计算每…

【Java】SVN 版本控制软件的快速安装(可视化)

目录 一、SVN 的概述 1.1 SVN 的概念 1.2 SVN 与 Git 的对比 1.3 SVN 软件 二、SVN 的安装 2.1 SVN 的工作流程 2.2 服务器端 SVN 的安装 三、SVN 服务器端的配置 3.1 搭建项目 3.2 权限控制 四、SVN 客户端的配置 4.1 SVN 客户端的下载 4.2 客户端连接 SVN 服务器…

Hadoop安全机制深度剖析:Kerberos认证与HDFS ACL细粒度权限控制

Hadoop安全机制概述在大数据时代&#xff0c;Hadoop作为分布式计算框架的核心组件&#xff0c;其安全性直接关系到企业数据资产的保护。随着数据价值的不断提升&#xff0c;Hadoop安全机制已从早期的"简单信任模式"演进为包含多重防护措施的综合体系&#xff0c;其重…

uniapp基本使用

资料 咸虾米视频 黑马视频 uniapp官方文档 hbuilder 1.uniapp页面生命周期 1.1 onLoad 还拿不到dom适合接受上页的参数&#xff0c;联网取数据&#xff0c;更新data。相当于created和beforeCreated期间主要的作用是比如说获取url上的query参数 *url: ***/**?name张三&…

ssh2-sftp-client 简化 sftp 文件传输的 node库

ssh2-sftp-client 极大地简化了通过 sftp 进行文件传输的复杂性。无论你是需要上传、下载、删除文件&#xff0c;还是列出目录内容&#xff0c;可当简易的部署脚步npm run deploy const SftpClient require(ssh2-sftp-client) const sftp new SftpClient()const config {hos…

数字美元与全球支付革命:稳定币的兴起与全球金融格局的重塑

一、数字美元的崛起&#xff1a;美国战略布局与全球竞争1. 数字美元的定位与战略意义 数字美元作为美国构建“数字美元帝国”的核心工具&#xff0c;旨在通过区块链技术实现美元的数字化发行与流通&#xff0c;巩固其全球储备货币地位。其核心逻辑在于&#xff1a;技术赋能货币…

LeetCode 633.平方数之和

给定一个非负整数 c &#xff0c;你要判断是否存在两个整数 a 和 b&#xff0c;使得 a2 b2 c 。 示例 1&#xff1a; 输入&#xff1a;c 5 输出&#xff1a;true 解释&#xff1a;1 * 1 2 * 2 5 示例 2&#xff1a; 输入&#xff1a;c 3 输出&#xff1a;false 提示&…

Spring Boot 使用Jasypt加密

一、配置Jasypt 1.在pom.xml中导入依赖 <!-- Jasypt 加密工具 --><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version></dependency&…