首页 > 编程知识 正文

内网即时通讯软件,web即时通讯

时间:2023-05-04 08:42:19 阅读:233643 作者:3464

缓存雪崩

缓存雪崩指的是Redis当中的大量缓存在同一时间全部失效,而假如恰巧这一段时间同时又有大量请求被发起,那么就会造成请求直接访问到数据库,可能会把数据库冲垮。

缓存雪崩一般形容的是缓存中没有而数据库中有的数据,而因为时间到期导致请求直达数据库。

解决方案

解决缓存雪崩的方法有很多:

1、加锁,保证单线程访问缓存。这样就不会有很多请求同时访问到数据库。

2、失效时间不要设置成一样。典型的就是初始化预热数据的时候,将数据存入缓存时可以采用随机时间来确保不会咋同一时间有大量缓存失效。

3、内存允许的情况下,可以将缓存设置为永不失效。

缓存击穿

缓存击穿和缓存雪崩很类似,区别就是缓存击穿一般指的是单个缓存失效,而同一时间又有很大的并发请求需要访问这个key,从而造成了数据库的压力。

解决方案

解决缓存击穿的方法和解决缓存雪崩的方法很类似:

1、加锁,保证单线程访问缓存。这样第一个请求到达数据库后就会重新写入缓存,后续的请求就可以直接读取缓存。

2、内存允许的情况下,可以将缓存设置为永不失效。

缓存穿透

缓存穿透和上面两种现象的本质区别就是这时候访问的数据其在数据库中也不存在,那么既然数据库不存在,所以缓存里面肯定也不会存在,这样如果并发过大就会造成数据源源不断的到达数据库,给数据库造成极大压力。

解决方案

对于缓存穿透问题,加锁并不能起到很好地效果,因为本身key就是不存在,所以即使控制了线程的访问数,但是请求还是会源源不断的到达数据库。

解决缓存穿透问题一般可以采用以下方案配合使用:

1、接口层进行校验,发现非法的key直接返回。比如数据库中采用的是自增id,那么如果来了一个非整型的id或者负数id可以直接返回,或者说如果采用的是32位uuid,那么发现id长度不等于32位也可以直接返回。

2、将不存在的数据也进行缓存,可以直接缓存一个空或者其他约定好的无效value。采用这种方案最好将key设置一个短期失效时间,否则大量不存在的key被存储到Redis中,也会占用大量内存。

布隆过滤器(Bloom Filter)

针对上面缓存穿透的解决方案,我们思考一下:假如一个key可以绕过第1种方法的校验,而此时有大量的不存在key被访问(如1亿个或者10亿个),那么这时候全部存储到缓存,会占用非常大的空间,会浪费大量服务器内存,导致内存不足。

那么有没有一种更好的解决方案呢?这就是我们接下来要介绍的布隆过滤器,布隆过滤器就可以最大程度的解决key值过多的这个问题。

什么是布隆过滤器

可能大部分人都知道有这么一个面试问题:如何在10亿的海量的无序的数据中快速判断一个元素是否存在?

要解决这个问题就需要用到布隆过滤器,否则大部分服务器的内存是无法存储这么大的数量级的数据的。

布隆过滤器(Bloom Filter)是由布隆在1970年提出的。它实际上是一个很长的二进制向量(位图)和一系列随机映射函数(dbl函数)。

布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率而且删除困难。

位图(Bitmap)

Redis当中有一种数据结构就是位图,布隆过滤器其中重要的实现就是位图的实现,也就是位数组,并且在这个数组中每一个位置只有0和1两种状态,每个位置只占用1个字节,其中0表示没有元素存在,1表示有元素存在。如下图所示就是一个简单的布隆过滤器示例(一个key值经过dbl运算和位运算就可以得出应该落在哪个位置):

dbl碰撞

上面我们发现,lonely和wolf落在了同一个位置,这种不同的key值经过dbl运算后得到相同值的现象就称之为dbl碰撞。发生dbl碰撞之后再经过位运算,那么最后肯定会落在同一个位置。

如果发生过多的dbl碰撞,就会影响到判断的准确性,所以为了减少dbl碰撞,我们一般会综合考虑以下2个因素:

1、增大位图数组的大小(位图数组越大,占用的内存越大)。

2、增加dbl函数的次数(同一个key值经过1个函数相等了,那么经过2个或者更多个dbl函数的计算,都得到相等结果的概率就自然会降低了)。

上面两个方法我们需要综合考虑:比如增大位数组,那么就需要消耗更多的空间,而经过越多的dbl计算也会消耗cpu影响到最终的计算时间,所以位数组到底多大,dbl函数次数又到底需要计算多少次合适需要具体情况具体分析。

布隆过滤器的2大特点

下面这个就是一个经过了2次dbl函数得到的布隆过滤器,根据下图我们很容易看到,假如我们的Redis根本不存在,但是Redis经过2次dbl函数之后得到的两个位置已经是1了(一个是wolf通过f2得到,一个是Nosql通过f1得到)。

所以通过上面的现象,我们从布隆过滤器的角度可以得出布隆过滤器主要有2大特点:

1、如果布隆过滤器判断一个元素存在,那么这个元素可能存在。

2、如果布隆过滤器判断一个元素不存在,那么这个元素一定不存在。

而从元素的角度也可以得出2大特点:

1、如果元素实际存在,那么布隆过滤器一定会判断存在。

2、如果元素不存在,那么布隆过滤器可能会判断存在。

PS:需要注意的是,如果经过N次dbl函数,则需要得到的N个位置都是1才能判定存在,只要有一个是0,就可以判定为元素不存在布隆过滤器中。

fpp

因为布隆过滤器中总是会存在误判率,因为dbl碰撞是不可能百分百避免的。布隆过滤器对这种误判率称之为假阳性概率,即:False Positive Probability,简称为fpp。

在实践中使用布隆过滤器时可以自己定义一个fpp,然后就可以根据布隆过滤器的理论计算出需要多少个dbl函数和多大的位数组空间。需要注意的是这个fpp不能定义为100%,因为无法百分保证不发生dbl碰撞。

Spring全套教学资料

Spring是Java程序员的《葵花宝典》,其中提供的各种大招,能简化我们的开发,大大提升开发效率!目前99%的公司使用了Spring,大家可以去各大招聘网站看一下,Spring算是必备技能,所以一定要掌握。

资料领取方式:点击这里前往蓝色传送门

目录:

部分内容:

Spring源码 第一部分 Spring 概述第二部分 核心思想第三部分 手写实现 IoC 和 AOP(自定义Spring框架)第四部分 Spring IOC 高级应用
基础特性
高级特性第五部分 Spring IOC源码深度剖析
设计优雅
设计模式
注意:原则、方法和技巧第六部分 Spring AOP 应用
声明事务控制第七部分 Spring AOP源码深度剖析
必要的笔记、必要的图、通俗易懂的语言化解知识难点

脚手框架:SpringBoot技术

它的目标是简化Spring应用和服务的创建、开发与部署,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用的微服务功能,可以和spring cloud联合部署。

Spring Boot的核心思想是约定大于配置,应用只需要很少的配置即可,简化了应用开发模式。

SpringBoot入门配置文件日志Web开发DockerSpringBoot与数据访问启动配置原理自定义starter

微服务架构:Spring Cloud Alibaba

同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

微服务架构介绍Spring Cloud Alibaba介绍微服务环境搭建服务治理服务容错服务网关链路追踪ZipKin集成及数据持久化消息驱动短信服务Nacos Confifig—服务配置Seata—分布式事务Dubbo—rpc通信

Spring MVC

目录:

部分内容:

7008112031)]

[外链图片转存中…(img-Nv7QFwsr-1627008112032)]

[外链图片转存中…(img-hybRrOTt-1627008112032)]

部分内容:

[外链图片转存中…(img-wraBlEsM-1627008112033)]

[外链图片转存中…(img-9gszYUjZ-1627008112034)]

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。