reids优化系列(五)

        后面更新的这些文章是将所学的redis知识进行巩固并且分享,也希望这些知识不仅仅是用于复习面试,更能在实际的应用中起到优化的作用。

有时候我们会存储一些查询多,修改少,业务逻辑较弱的数据,并且还能高效查询,那么redis就是一种选择。

redis缓存三件套

        所谓的缓存三件套,说白了就是在高并发的场景下,因为一些奇奇怪怪的操作或者原因导致大量的请求没有去请求redis,而是去请求数据库了,而数据库的连接是有限的,一旦超过了就会出事。因此我们的最终目的就是减少或者尽量不去访问数据库。其实解决方法我觉得可以分为外在和内在,外分为如何控制请求量,内在于如何处理这些请求量。

内在操作

缓存穿透

        大量并发去访问一个数据库不存在的数据,由于缓存中没有该数据导致大量并发查询数据库,这个现象要缓存穿透。缓存穿透可以造成数据库瞬间压力过大,连接数等资源用完,最终数据库拒绝连接不可用。

解决

如何解决缓存穿透?

1、对请求增加校验机制

如果请求参数不符合我们规定的条件就直接让他滚蛋,返回,恶意攻击拜拜。

2、使用布隆过滤器

百度百科:

布隆过滤器可以用于检索一个元素是否在一个集合中。如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢(O(n),O(logn))。不过世界上还有一种叫作散列表(又叫哈希表,Hash table)的数据结构。它可以通过一个Hash函数将一个元素映射成一个位阵列(Bit array)中的一个点。这样一来,我们只要看看这个点是不是1就可以知道集合中有没有它了。这就是布隆过滤器的基本思想。

布隆过滤器的特点是,高效地插入和查询,占用空间少;查询结果有不确定性,如果查询结果是存在则元素不一定存在,如果不存在则一定不存在;另外它只能添加元素不能删除元素,因为删除元素会增加误判率。

我们可以利用如果不存在则一定不存在的特性来运用过滤器去查询。

比如:将商品id写入布隆过滤器,如果分3次hash此时在布隆过滤器有3个点,当从布隆过滤器查询该商品id,通过hash找到了该商品id在过滤器中的点,此时返回1,如果找不到一定会返回0。

所以,为了避免缓存穿透我们需要缓存预热将要查询的内容提前存入布隆过滤器,添加数据时将信息的id也存入过滤器,当去查询一个数据时先在布隆过滤器中找一下如果没有到到就说明不存在,此时直接返回。

实现方法有:

Google工具包Guava实现。

redisson 。

2、缓存空值或特殊值

请求通过了第一步的校验,查询数据库得到的数据不存在,此时我们仍然去缓存数据,缓存一个空值或一个特殊值的数据。

但是要注意:如果缓存了空值或特殊值要设置一个短暂的过期时间。

缓存击穿

缓存击穿是指大量并发访问同一个热点数据,当热点数据失效后同时去请求数据库,瞬间耗尽数据库资源,导致数据库无法使用。

解决

1、使用同步锁控制查询数据库的线程

使用同步锁控制查询数据库的线程,只允许有一个线程去查询数据库,查询得到数据后存入缓存。

锁的话就会想到sychronized,这锁很明显,重量级锁,效率太低。相比于sychronized,这种读多写少的情况更适合用ReentrantReadWriteLock,Semaphore,StampedLock读写锁。

同时我们应该尽量减少锁控制的代码块,可以使用双重校验,也可以用乐观锁来提高效率。

2、热点数据不过期

可以由后台程序提前将热点数据加入缓存,缓存过期时间不过期,由后台程序做好缓存同步。

缓存雪崩

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。

造成缓存雪崩问题的原因是是大量key拥有了相同的过期时间,如果高并发查询大量的课程信息,那么固定时间后就会过期一旦失效将同时失效,造成雪崩问题。

解决

我们要知道,缓存雪崩的原因出现在,请求量大,大量key过期时间相同。所以我们应该对症下药:

1、使用同步锁控制查询数据库的线程

主题的做法在击穿里已经说明

2、缓存预热

不用等到请求到来再去查询数据库存入缓存,可以提前将数据存入缓存。使用缓存预热机制通常有专门的后台程序去将数据库的数据同步到缓存。

3、对同一类型信息的key设置不同的过期时间

通常对一类信息的key设置的过期时间是相同的,这里可以在原有固定时间的基础上加上一个随机时间使它们的过期时间都不相同。

总结下来就是,尽量做到,控制请求量,防止数据不存在,热点数据过期时间设置,过期时间key随机。

外在操作

网关

网关不仅仅可以用来处理负载均衡,权限认证,跨域还可以限流。

全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。区别在于GatewayFilter通过配置定义,处理逻辑是固定的;而GlobalFilter的逻辑需要自己写代码实现。

定义方式是实现GlobalFilter接口。

public interface GlobalFilter {/***  处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理** @param exchange 请求上下文,里面可以获取Request、Response等信息* @param chain 用来把请求委托给下一个过滤器 * @return {@code Mono<Void>} 返回标示当前过滤器业务结束*/Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}

在filter中编写自定义逻辑,可以实现下列功能:

登录状态判断,权限校验,请求限流等

sentinel

这也是一个微服务中间件,这里先不再详细介绍。

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

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

相关文章

漏洞修复整理

一、Geoserver Apache HTTP/2拒绝服务漏洞&#xff08;CVE-2023-44487&#xff09;、Eclipse Jetty 资源管理错误漏洞(CVE-2023-26048)、Eclipse Jetty 信息泄露漏洞(CVE-2023-26049) 受影响版本&#xff1a;9.4.53以下版本 处理方式&#xff1a;原地升级 &#xff08; jdk版本…

【记录】求职经历

目标岗位&#xff1a;嵌入式开发 1. 线上笔试 常用算法&#xff0c;比如动态规划、递归等标准模板库&#xff08;STL&#xff09;C 11新特性LeetCode刷题牛客刷题 2. 技术一面 3. 技术二面 4. 主管面 5. HR面

学习redis有效期和数据类型

1、安装redis和连接redis 参考&#xff1a;ubuntu安装单个redis服务_ubuntu redis单机版安装-CSDN博客 连接redis&#xff1a;redis-cli.exe -h localhost -p 6379 -a 123456 2、Redis数据类型 以下操作我们在图形化界面演示。 2.1、五种常用数据类型介绍 Redis存储的是key…

BCPL语言 :这可是B语言啊,汤姆森大佬趁老婆回老家用来开发第一个unix操作系统的语言(大佬基于BCPL开发的bon语言,C语言前身)

BCPL(“基本组合编程语言”)是一种过程式、命令式和结构化的编程语言。BCPL最初旨在为其他语言编写编译器&#xff0c;现在已不再常用。然而&#xff0c;它的影响仍然存在&#xff0c;因为BCPL的一个剥离和语法改变的版本&#xff0c;称为B&#xff0c;是C编程语言的基础。BCPL…

Linux文件创建教程:简单易懂的操作指南和示例代码详解

在Linux系统中&#xff0c;文件的创建是日常使用中经常遇到的操作之一。本篇教程将向你介绍如何在Linux系统中创建文件&#xff0c;并提供详细的示例代码&#xff0c;让你能够轻松上手。 1. 使用touch命令创建文件 touch命令是最简单、最常用的创建文件的方法之一。它可以用来…

jenkins-cl参数化构建

pipeline片段&#xff08;对应jenkins-cli -p参数的BRANCHdevelop&#xff09; parameters {string(name: BRANCH, defaultValue: master, description: Enter the branch name)}stages {stage(Get Code) {steps {script {def branch params.BRANCHcheckout scmGit(branches: …

算法通关村第十五关—继续研究超大规模数据场景的问题(黄金)

继续研究超大规模数据场景的问题 一、对20GB文件进行排序 题目要求&#xff1a;假设你有一个20GB的文件&#xff0c;每行一个字符串&#xff0c;请说明如何对这个文件进行排序&#xff1f;  分析&#xff1a;这里给出大小是20GB,其实面试官就在暗示你不要将所有的文件都装入到…

单片机学习记录(四)

第8章 1.在异步串行通信中&#xff0c;接收方是如何知道发送方开始发送数据的&#xff1f; 答&#xff1a;当接收方检测到RXD引脚上有负跳变时&#xff0c;即可知道发送方开始发送数据&#xff1b; 2.AT89S51单片机的串行口有几种工作方式&#xff1f;有几种帧格式&#xff…

世邦通信 SPON IP网络对讲广播系统addscenedata.php任意文件上传漏洞

产品介绍 世邦通信SPON IP网络对讲广播系统采用领先的IPAudio™技术,将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输系统。 漏洞描述 spon IP网络对讲广播系统存在任意文件上传漏洞&#xff0c;攻击者可以通过构造特殊请求包上传恶意后门文件&#xff…

Sentinel微服务保护

文章目录 Sentinel微服务保护1.初识Sentinel1.1.雪崩问题及解决方案1.1.1.雪崩问题1.1.2.解决方案1.1.3.总结 1.2.服务保护技术对比1.3.Sentinel介绍和安装1.3.1.初识Sentinel1.3.2.安装Sentinel 1.4.微服务整合Sentinel 2.流量控制2.1.簇点链路2.1.快速入门2.2.流控模式2.2.1.…

华纳云:cdn主服务器连通性异常怎么办

当 CDN 主服务器连通性异常时&#xff0c;可能会影响到内容分发网络(CDN)的正常运行。在面对这种情况时&#xff0c;可以采取以下步骤来处理&#xff1a; 检查网络连接&#xff1a; 首先确保本地网络连接正常。尝试通过其他网络或设备访问 CDN 主服务器&#xff0c;以确定问题是…

redis.conf配置文件常用配置项详解

redis.conf 是 Redis 的配置文件&#xff0c;用于配置 Redis 服务器的各种参数和行为。这个配置文件包含了丰富的选项&#xff0c;允许用户调整 Redis 的行为以满足特定需求。以下是一些 redis.conf 中常见配置项的详解&#xff1a; daemonize&#xff1a; 默认值&#xff1a; …

c++八股3

多态&#xff1a;在C中&#xff0c;如果类B继承自A&#xff0c;并且定义了虚函数f(), 类C又继承自B但没有重写f()&#xff0c;那么当你执行如下代码&#xff1a; Cpp C *c new C(); c->f();调用的将是B类中实现的f()方法&#xff0c;因为C没有提供自己的覆盖版本。若要调用…

onlyoffice导入字体

1.进入容器 docker exec -it onlyoffice-server bash 2.删除自带字体 cd /var/www/onlyoffice/documentserver/core-fonts/ rm -rf * 3.退出容器 exit 1.将字体放入/home/Fonts/ &#xff0c;如果不存在可以新建 2.执行docker cp /home/Fonts onlyoffice-server:/var/www/only…

avcodec send_packet和receive_frame

下面是解码的过程代码&#xff0c;对输入给解码器的pkt桢类型进行判断&#xff0c;关键桢打印出is key frame&#xff0c;解码出来的桢根据pict_type打印桢类型出I/P/B桢类型&#xff0c;从这里也可以看出来&#xff0c;没解码之前&#xff0c;AVPacket只能得到是否关键帧&…

Zung氏焦虑症测试SAS

SAS被称为焦虑自评量表&#xff0c;是一种用来测量焦虑症状程度以及观察治疗过程中变化情况的心理量表。主要用于评估心理状态&#xff0c;辅助参考数据&#xff0c;也是焦虑评定的标准。焦虑自评量表系是由William W.K. Zung编制的&#xff0c;该量表已成为心理咨询师、心理医…

【Python基础】一文搞懂:Python中文件路径的处理方式

文章目录 1 引言2 os 模块2.1 常用函数2.2 示例 3 pathlib 模块3.1 常用类和方法3.1 示例 4 比较 os 和 pathlib5 实例演示5.1 使用 os 模块5.2 使用 pathlib 模块5.3 封装为pathlib_example.py脚本 6 结语 1 引言 在 Python 编程中&#xff0c;正确处理文件路径是一个常见且重…

【GitHub项目推荐--克隆你的声音】【转载】

今天推荐一个黑科技开源项目&#xff0c;只需要你 5 秒钟的声音对话&#xff0c;就能克隆出你的声音&#xff0c;而且能够实时的生成你任意语音。 是不是很顶&#xff1f; 我举个例子&#xff0c;如果我这里有 300 条你说话的语音&#xff0c;我把你的语音数据用这个开源项目…

为求增长,这家消金公司也开始发力小微

来源 | 镭射财经&#xff08;leishecaijing&#xff09; 消金公司业务转向&#xff0c;小微贷越来越香&#xff0c;已成消金行业近年转型奋进的一个插曲。 为求业绩增长&#xff0c;拓宽获客基数&#xff0c;越来越多的消金公司不再局限于单一的C端客群&#xff0c;将目光瞄向…

Android jar包编译及集成

Jar包编译和集成有两种编译方式&#xff0c;mk和bp&#xff0c;Android 7版本之后逐渐采用bp格式编译&#xff0c;目前14版本还是兼容mk方式编译&#xff0c;具体写法入下&#xff1a; Android jar包编译 mk&#xff1a; 如果需要打包到systemimg&#xff0c;则需要将此jar包添…