什么是缓存击穿

转载自   什么是缓存击穿

缓存击穿、缓存并发和缓存雪崩是常见的由于并发量大而导致的缓存问题,本节讲解其产生原因和解决方案。

缓存击穿通常是由恶意攻击或者无意造成的;缓存并发是由设计不足造成的;缓存雪崩是由缓存同时失效造成的,三种问题都比较典型,也是难以防范和解决的。本节给出通用的解决方案,以供在缓存设计的过程中参考和使用。

缓存击穿

缓存击穿指的是使用不存在的key进行大量的高并发查询,这导致缓存无法命中,每次请求都要击穿到后端数据库系统进行查询,使数据库压力过大,甚至使数据库服务被压死。

我们通常将空值缓存起来,再次接收到同样的查询请求时,若命中缓存并且值为空,就会直接返回,不会透传到数据库,避免缓存击穿。当然,有时恶意袭击者可以猜到我们使用了这种方案,每次都会使用不同的参数来查询,这就需要我们对输入的参数进行过滤,例如,如果我们使用ID进行查询,则可以对ID的格式进行分析,如果不符合产生ID的规则,就直接拒绝,或者在ID上放入时间信息,根据时间信息判断ID是否合法,或者是否是我们曾经生成的ID,这样可以拦截一定的无效请求。

当然,每个设计人员都应该对服务的可用性和健壮性负责,应该建设健壮的服务,让我们的服务像不倒翁一样,因此,我们需要对服务设计限流和熔断等功能,请参考《分布式服务架构:原理、设计与实战》中第1章关于微服务设计模式的内容。

 

缓存并发

缓存并发的问题通常发生在高并发的场景下,当一个缓存key过期时,因为访问这个缓存key 的请求量较大,多个请求同时发现缓存过期,因此多个请求会同时访问数据库来查询最新数据,并且回写缓存,这样会造成应用和数据库的负载增加,性能降低,由于并发较高,甚至会导致数据库被压死。

我们通常有3种方式来解决这个问题。

分布式锁

使用分布式锁,保证对于每个key同时只有一个线程去查询后端服务,其他线程没有获得分布式锁的权限,因此只需要等待即可。这种方式将高并发的压力转移到了分布式锁,因此对分布式锁的考验很大。

本地锁

与分布式锁类似,我们通过本地锁的方式来限制只有一个线程去数据库中查询数据,而其他线程只需等待,等前面的线程查询到数据后再访问缓存。但是,这种方法只能限制一个服务节点只有一个线程去数据库中查询,如果一个服务有多个节点,则还会有多个数据库查询操作,也就是说在节点数量较多的情况下并没有完全解决缓存并发的问题。

软过期

软过期指对缓存中的数据设置失效时间,就是不使用缓存服务提供的过期时间,而是业务层在数据中存储过期时间信息,由业务程序判断是否过期并更新,在发现了数据即将过期时,将缓存的时效延长,程序可以派遣一个线程去数据库中获取最新的数据,其他线程这时看到延长了的过期时间,就会继续使用旧数据,等派遣的线程获取最新数据后再更新缓存。

也可以通过异步更新服务来更新设置软过期的缓存,这样应用层就不用关心缓存并发的问题了。

 

缓存雪崩

缓存雪崩指缓存服务器重启或者大量缓存集中在某一个时间段内失效,给后端数据库造成瞬时的负载升高的压力,甚至压垮数据库的情况。

通常的解决办法是对不同的数据使用不同的失效时间,甚至对相同的数据、不同的请求使用不同的失效时间,例如,我们要缓存user数据,会对每个用户的数据设置不同的缓存过期时间,可以定义一个基础时间,假设10秒,然后加上一个两秒以内的随机数,过期时间为10~12秒,就会避免缓存雪崩。

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

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

相关文章

获取笔记本的SHA1的值。

开发Android几年来,经常出现这样的情况,每次使用到地图的时候,不知道如何获得笔记本的SHA1值,尤其是在跟换笔记本开发的时候。 因此在CSDN上做一下笔记! 进入cmd模式 cd C:\Users\Administrator.android> 输入keyto…

建模:确定服务的边界——《微服务设计》读书笔记

什么样的服务才是好的服务? 高内聚、松耦合的服务才是好的服务。简而言之,就是把相关性强的放在一起,相关性不强的分开,物以类聚,人以群分,服务的划分也是这样。这就需要确定什么要放在一起,什么是要分开的…

深入C#中的String类

一、String类里面的方法: 1.indexOf():查找某个字符在字符串中的位置 语法:字符串.indexOf(); //返回一个int 2.Substring():从字符串中截取某个字符串 语法:字符串.Substring();//返回String 3.ToLower():将字符串转换成小写形式 语法&#…

谈谈系统稳定性设计

转载自 谈谈系统稳定性设计 一、差旅随想 因为base在分公司,需要经常去总部出差,所以搭乘飞机成了家常便饭,很多时候坐在飞机上会不由的感叹,设计制造这样精密复杂的机器的那帮人真的是了不起,他们是怎样保证这样一台…

Android使用MPAndroidChat

参考文档: https://blog.csdn.net/u013184970/article/details/52095170 https://blog.csdn.net/cen_yuan/article/details/52204281 注意: 在要使用的module的build.gradle添加: dependencies { compile ‘com.github.PhilJay:MPAndroidChart:v3.0.0-be…

微服务集成——《微服务设计》读书笔记

一.理想的集成应该是什么样的? 1.避免破坏性修改 如果在一个微服务的响应中添加一个字段,服务的消费方不应该受到影响。 2.保证API的技术无关性 微服务之间的通信应该是与技术无关的。 3.使服务的消费方易于使用 如果消费方使用该服务比登天还难&…

使用ADO.NET访问数据库

一、ADO.NET:数据库访问的方法和技术。 二、ADO.NEt的重要组件: 1.DataSet:独立于数据源的数据访问 2…Net framework数据提供程序:用于连接到数据库执行命令和检索结果 三、.NET数据提供程序的四个核心对象: 1.Connection:连接数据库 2.Comm…

React中构造函数、reader和函数的调用次数和时机测试

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>state</title> </head> <body><!-- 准备好一个“容器” --><div id"test"></div><!-- 引入react核…

什么是加密算法

转载自 什么是加密算法 Java的加密知识也是Java常见的领域之一&#xff0c;加密技术的底层确实很复杂&#xff0c;运用了大量的数学知识&#xff0c;要弄明白非常复杂。但是Java语言中运用密码加密工具却是非常简单。我们在Java里面运用这些加密技术&#xff0c;只需要把原理…

使用ADO.NET查询和操作数据

一、StringBuild类&#xff1a; 1.Append&#xff1a;在末尾追加字符串 2.Insert:在指定的位置插入字符串 3.Remove:移除指定的字符串 二、使用DataReader的步骤&#xff1a; 1.连接数据库&#xff1a; SqlConnection conn new SqlConnection(conStr); 2.定义sql语句&#xff…

Android传感器的使用

Android 中主要的传感器有以下几种 TYPE_ACCELEROMETER 加速度传感器又叫 G-sensor&#xff0c;该数值包含地心引力的影响&#xff0c;单位是 m/s 测量应用于设备 x 、y、z 轴上的加速度。 将手机平放在桌面上&#xff0c;x 轴默认为0&#xff0c;y 轴默认0&#xff0c;z 轴默…

理解C# 4 dynamic(2) – ExpandoObject的使用

ExpandoObject的使用非常简单&#xff0c;很容易入手。上一篇里面已经有详细的介绍了&#xff0c;可以看这里(理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用) 下面对ExpandoObject的使用场合和一些认为需要注意的地方&#xff0c;谈一下自己的看法: 一…

谈谈服务限流算法的几种实现

转载自 谈谈服务限流算法的几种实现 保障服务稳定的三大利器&#xff1a;熔断降级、服务限流和故障模拟。今天和大家谈谈限流算法的几种实现方式&#xff0c;本文所说的限流并非是Nginx层面的限流&#xff0c;而是业务代码中的逻辑限流。 为什么需要限流 按照服务的调用方&…

Android如何实现NoActionBar以及Theme.NoTitleBar.Fullscreen效果

效果一 NoActionBar 无论Activity继承自Activity还是AppCompatActivity 只需要在styles中的修改Theme <style name"AppTheme" parent"Theme.AppCompat.Light.NoActionBar"><!-- Customize your theme here. --><item name"colorPrima…

数据库的实现

一、数据库有哪几种文件组成&#xff1a; 1.主数据文件 .mdf 2.次要数据文件 .ndf 3.日志文件 .ldf 二、创建数据库的语法&#xff1a; –创建一个名为TestDB的数据库 create database TestDB on ( name ‘TestDB_data’, --主数据文件的逻辑名称 filename ‘D:\DB\18qn1\Te…

自己动手写一个能操作redis的客户端

转载自 自己动手写一个能操作redis的客户端 引言 redis大家在项目中经常会使用到。官网也提供了多语言的客户端供大家操作redis,如下图所示 但是&#xff0c;大家有思考过&#xff0c;这些语言操作redis背后的原理么&#xff1f;其实&#xff0c;某些大神会说 只要按照redis…

离线安装 VS2017 的正确姿势

国内的网络环境&#xff0c;真的是有很大的不同&#xff0c;有的人装 VS 的时候&#xff0c;号称满速&#xff0c;有的人&#xff08;其实就是我&#xff09;要等它下载很久&#xff0c;还告诉我有个组件没有安装成功。很久很久以前&#xff0c;VS 是提供 ISO 版的离线安装包的…

SQL编程

一、变量的分类&#xff1a; 1.全局变量&#xff08;成员变量&#xff09;&#xff1a; 必须是以为前缀&#xff0c;由系统定义&#xff0c;我们只能读取&#xff0c;不能修改它的值。 2.局部变量&#xff1a; 必须是以为前缀&#xff0c;必须先声明在赋值。 二、局部变量&…

Android中ImageView的旋转与缩放

说明在代码中已经注释 XML代码 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"wra…