面向简历的复习内容

掌握 MVC 开发模式以及面向对象开发思想。

1.MVC 开发模式: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。
View(视图)是应用程序中处理数据显示的部分。
Controller(控制器)是应用程序中处理用户交互的部分。
最典型的MVC就是 javabean+JSP + servlet 的模式

三层结构:
dao层: 和数据访问相关的操作
service层: 和业务逻辑相关的操作
web层: 和用户直接交互相关的操作(传接参数,跳转页面)

2、面向对象的特征

  • 抽象:忽略一个主题中与当前目标无关的东西,专注的注意与当前目标有关的方面。
    (就是把现实世界中的某一类东西提取出来,用程序代码表示,抽象出来的一般叫做抽象类)
    抽象包含两方面:数据抽象、过程抽象。
    数据抽象:表示世界中一类事务的特征,即对象的属性。例如:小鸟有翅膀。
    过程抽象:表示世界中一类事务的行为,即对象的行为。例如:小鸟会飞。
  • 封装:封装就是把过程和数据封装过来,对数据的访问只能通过已定义的界面,如私房变量,用set.get方法获取。
    封装保证了模块具有较好的独立性,使程序易于维护,目标是实现“高内聚,低耦合”
  • 继承:一种联结类的层次模型,允许和鼓励类的重用,提供一种明确表达共性的方法。
    对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性。子类还可以增加或修改方法,使其更适合
    特殊的需要,因此可以说:继承是为了重用父类代码,同时为实现多态做准备。
  • 多态:多态是指允许不同类的对象对同一消息做出响应。
    总的来说,方法的重写,重载,动态链接构成多态性。Java引入多态的概念原因之一就是弥补类的单继承的不足。
    动态链接:对于父类中定义的方法,如果子类重写了该方法,那么父类类型的引用将调成子类中的这个方法。

熟悉Java编程语言,有扎实的Java基础

重载与重写是 Java 多态性的不同表现。
  重写是父类与子类之间多态性的表现,在运行时起作用(动态多态性,譬如实现动态绑定)
  而重载是一个类中多态性的表现,在编译时起作用(静态多态性,譬如实现静态绑定)。

熟悉MySQL数据库,熟悉SQL的常用操作,了解SQL优化

  • mysql有哪些储存引擎?都有什么区别?

MyISAM
这种引擎是mysql最早提供的。这种引擎又可以分为静态MyISAM、动态MyISAM 和压缩MyISAM三种:
**静态MyISAM:**如果数据表中的各数据列的长度都是预先固定好的,服务器将自动选择这种表类型。因为数据表中每一条记录所占用的空间都是一样的,所以这种表存取和更新的效率非常高。当数据受损时,恢复工作也比较容易做。
动态MyISAM:如果数据表中出现varchar、xxxtext或xxxBLOB字段时,服务器将自动选择这种表类型。相对于静态MyISAM,这种表存储空间比较小,但由于每条记录的长度不一,所以多次修改数据后,数据表中的数据就可能离散的存储在内存中,进而导致执行效率下降。同时,内存中也可能会出现很多碎片。因此,这种类型的表要经常用optimize table 命令或优化工具来进行碎片整理。
压缩MyISAM:以上说到的两种类型的表都可以用myisamchk工具压缩。这种类型的表进一步减小了占用的存储,但是这种表压缩之后不能再被修改。另外,因为是压缩数据,所以这种表在读取的时候要先时行解压缩。
MyISAM Merge引擎:这种类型是MyISAM类型的一种变种。合并表是将几个相同的MyISAM表合并为一个虚表。常应用于日志和数据仓库。
InnoDB:InnoDB表类型可以看作是对MyISAM的进一步更新产品,它提供了事务、行级锁机制和外键约束的功能。
memory(heap):这种类型的数据表只存在于内存中。它使用散列索引,所以数据的存取速度非常快。因为是存在于内存中,所以这种类型常应用于临时表中。
archive:这种类型只支持select 和 insert语句,而且不支持索引。常应用于日志记录和聚合分析方面。
数据库锁
共享(S)锁:多个事务可封锁一个共享页;任何事务都不能修改该页; 通常是该页被读取完毕,S锁立即被释放。
排它(X)锁:仅允许一个事务封锁此页;其他任何事务必须等到X锁被释放才能对该页进行访问;X锁一直到事务结束才能被释放。
更新(U)锁:用来预定要对此页施加X锁,它允许其他事务读,但不允许再施加U锁或X锁;当被读取的页将要被更新时,则升级为X锁;U锁一直到事务结束时才能被释放。

  • MySQL支持事务吗?

在缺省模式下,MySQL是autocommit模式的,所有的数据库更新操作都会即时提交,所以在缺省情况下,MySQL是不支持事务的。 但是如果你的MySQL表类型是使用InnoDB Tables 或 BDB tables的话,你的MYSQL就可以使用事务处理,使用SET AUTOCOMMIT=0就可以使MYSQL允许在非autocommit模式, 在非autocommit模式下,你必须使用COMMIT来提交你的更改,或者用ROLLBACK来回滚你的更改。

  • MySQL几种备份方式?(重点)

1、逻辑备份:使用MySQL自带的MySQLdump工具进行备份。备份成sql文件形式。
优点:最大好处是能够与正在运行的MySQL自动协同工作,在运行期间可以确保备份是当时的点,它会自动将对应操作的表锁定,不允许其他用户修改(只能访问)。可能会阻止修改操作。sql文件通用方便移植。
缺点:备份的速度比较慢。如果是数据量很多的时候。就很耗时间。如果数据库服务器处在提供给用户服务状态,在这段长时间操作过程中,意味着要锁定表(一般是读锁定,只能读不能写入数据)。那么服务就会影响的。
2、物理备份:直接拷贝MySQL的数据目录。
直接拷贝只适用于myisam类型的表。这种类型的表是与机器独立的。但实际情况是,你设计数据库的时候不可能全部使用myisam类型表。你也不可能因为myisam类型表与机器独立,方便移植,于是就选择这种表,这并不是选择它的理由。
缺点:你不能去操作正在运行的MySQL服务器(在拷贝的过程中有用户通过应用程序访问更新数据,这样就无法备份当时的数据)可能无法移植到其他机器上去。
3、双机热备份。
MySQL数据库没有增量备份的机制。当数据量太大的时候备份是一个很大的问题。还好MySQL数据库提供了一种主从备份的机制(也就是双机热备)
优点:适合数据量大的时候。现在明白了。大的互联网公司对于MySQL数据备份,都是采用热机备份。搭建多台数据库服务器,进行主从复制。

B-Tree和B+Tree详解

https://blog.csdn.net/weixin_41948075/article/details/100180136?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=1328592.543.16146996132315739&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

SQL优化小结

  1. 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
    select id from t where num/2=100
    应改为:
    select id from t where num=100*2
  2. 用 UNION ALL 代替 UNION
    条件允许的情况下,如明确知道UNION的两个结果集不会有重复元素,则使用UNION ALL,因为UNION会把结果去重,涉及到排序操作,而UNION ALL不考虑结果集是否有重复元素。
  3. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
  4. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
    select id from t where num is null
    可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
    select id from t where num=0
  5. 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
    select id from t where num=10 or num=20
    可以这样查询:
    select id from t where num=10
    union all
    select id from t where num=20

熟悉常见的设计模式(单例模式、代理模式、委派模式、策略模式)

  • 单例模式:

单例模式的实现方案:建立一个类,其构造方法都是私有的,只有一个getInstance()方法是public的,通过这个方法获取该类的唯一实例,即让类自身保存这个唯一的实例。
(1)懒汉式,线程不安全 instance = new Singleton();
(2)懒汉式,线程安全 最简单的方法就是将整个getInstance()方法设为同步(Synchronized)。
虽然(2)做到了线程安全,并且解决了多实例的问题,但它并不高效
(3)双重检验锁,线程安全
很可惜,它是有问题。主要在于instance = new Singleton()这句,这并⾮是⼀个原⼦操作
private volatile static Singleton instance; //声明为volatile
(4)饿汉式,线程安全
private static final Singleton instance = new Singleton(); ,因为单例的实例被声明成 static 和 final 变量了,在第⼀次加载类到内存中时就会初始化,
所以创建实例本⾝是线程安全的。缺点是它不是⼀种懒加载模式(lazy initialization)

  • 代理模式:
    https://blog.csdn.net/weixin_44288584/article/details/112578047
  • 委派模式
    它的基本作用就是负责任务的调用和分配,是一种特殊的静态代理模式,可以理解为全权代理模式,但是代理模式注重过程,而委派模式注重结果。委派模式属于行为型设计模式,不属于GoF的23种设计模式。常用的 DispatcherServlet 其实就是用到了委派模式。
    老板(Boss)给项目经理(Leader)下达任务,项目经理会根据实际情况给每个员工派发工作任务,待员工把工作任务完成之后,再由项目经理汇报工作进度和结果给老板
    https://blog.csdn.net/qq_34125999/article/details/109209383?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%A7%94%E6%B4%BE%E6%A8%A1%E5%BC%8F&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-5-109209383.first_rank_v2_pc_rank_v29_10
  • 策略模式 :,定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
  • 出行旅游:我们可以有几个策略可以考虑:可以骑自行车,汽车,做火车,飞机。每个策略都可以得到相同的结果,但是它们使用了不同的资源。选择策略的依据是费用,时间,使用工具还有每种方式的方便程度 。

熟练掌握 Mybatis+Sping+SpringMVC 整合框架进行 Java EE 项目开发。

  1. SpringMVC的流程
    (1)用户发送请求至前端控制器DispatcherServlet;
    (2)DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handler;
    (3)处理器映射器根据请求url找到具体的处理器Handler,生成处理器对象及处理器拦截器(如果有则生成),一并返回给DispatcherServlet;
    (4)DispatcherServlet 调用 HandlerAdapter处理器适配器,请求执行Handler;
    (5)HandlerAdapter 经过适配调用 具体处理器进行处理业务逻辑;
    (6)Handler执行完成返回ModelAndView;
    (7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
    (8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
    (9)ViewResolver解析后返回具体View;
    (10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
    (11)DispatcherServlet响应用户。
    2、使用Spring框架能带来哪些好处?
    Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。

3、什么是控制反转(IOC)?什么是依赖注入?
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入
4、Bean的生命周期?
下面是Spring3的Bean生命周期。
bean的创建
单例模式:(1)默认情况下,bean的创建是在new ClassPathXmlApplicationContext(“applicationContext.xml”)执行后被创建的
(2)假如使用lazy-init=“true” 单例模式使用懒加载机制,只有在使用的时候该bean才被实例化创建
多例模式:bean的创建是在使用ac.getBean(“student”)之后创建
bean的初始化
设定init-method=“init”,指定对象初始化的时候调用init(),初始化发生在对象创建后就会被初始化
bean的使用
调用该bean的具体方法 hw.sayHello()

bean的销毁
设定destroy-method=“destroy”,在销毁该bean时调用destroy()
单例模式
bean的销毁是随着spring ioc容器的关闭而销毁,会调用指定destroy()
多例模式
bean的销毁是不归ioc容器管理的,交由jvm的gc进行管理

5、什么是AOP?

  • 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
  • 主要功能
    日志记录,性能统计,安全控制,事务处理,异常处理等等。
  • 主要意图
    将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
    Aop在Spring中的作用
  • 提供声明式事务
  • 允许用户自定义切面

了解SpringBoot 框架的自动配置

自动配置:
常用框架对应的JavaConfig类都已经编写好了,springboot启动的时候会一个一个的进行读取,读取时会先根据条件注解进行判断,看是否满足条件,满足条件后才会读取配置类然后去配置对应的框架。

  1. Springboot启动后,读取程序的启动类时,就会读取到@SpringBootApplication注解
  2. @SpringBootApplication注解又包含了 @EnableAutoConfiguration注解(开启自动配置功能)
  3. @EnableAutoConfiguration注解导入了AutoConfigurationImportSelector类(自动配置导入选择器),@AutoConfigurationPackage :自动配置包即@Import(AutoConfigurationImportSelector.class)
  4. AutoConfigurationImportSelector.class中,定义了一个方法getCandidateConfigurations,进入getCandidateConfigurations方法,getCandidateConfigurations会到classpath下的读取META-INF/spring.factories文件的配置
  5. spring.factories文件在spring-boot-autoconfigure-2.3.0.RELEASE.jar的META-INF中,spring.factories文件中声明了很多java配置类,但是每个配置类都是需要满足一定的条件才会执行。

总结:SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值
将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;

了解Linux操作系统,掌握Linux的基本操作 ,能够在 Linux 上部署项目。

1、在Linux系统中以什么方式访问硬件设备的?
以文件的方式访问设备 比如访问光驱对应的文件是 /dev/cdrom
2、文件属性的解释,说出ls –l 命令显示的文件每个属性的含义?
[root@www /]# ls -l
total 64
dr-xr-xr-x 2 root root 4096 Dec 14 2012 bin
dr-xr-xr-x 4 root root 4096 Apr 19 2012 boot
1)实例中,bin文件的第一个属性用"d"表示。"d"在Linux中代表该文件是一个目录文件。
2)在Linux中第一个字符代表这个文件是目录、文件或链接文件等等。
• 当为[ d ]则是目录
• 当为[ - ]则是文件;
• 若是[ l ]则表示为链接文档(link file);
• 若是[ b ]则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
• 若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
3)接下来的字符中,以三个为一组,且均为『rwx』 的三个参数的组合。
其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。
每个文件的属性由左边第一部分的10个字符来确定(如下图)。

从左至右用0-9这些数字来表示。第0位确定文件类型,第1-3位确定属主(该文件的所有者)拥有该文件的权限。
第4-6位确定属组(所有者的同组用户)拥有该文件的权限,第7-9位确定其他用户拥有该文件的权限。
其中,第1、4、7位表示读权限,如果用"r"字符表示,则有读权限,如果用"-"字符表示,则没有读权限;
第2、5、8位表示写权限,如果用"w"字符表示,则有写权限,如果用"-"字符表示没有写权限;第3、6、9位表示可执行权限,

如果用"x"字符表示,则有执行权限,如果用"-"字符表示,则没有执行权限。

3、如何创建一个用户组?
案例1:groupadd –g 101 groupname1 ##101 是组的id
案例2:groupadd groupname2 ##直接创建用户组

4、如何删除一个用户组?
groupdel 用户组名

5、如何查看所有用户组的信息?
cat /etc/group

6、如何创建用户?
第一种方式:useradd username
第二种方式: useradd -s /bin/sh -g group1 -G group2,group3 group1_user1
此命令新建了一个用户gem,该用户的登录Shell是/bin/sh,他属于group用户组,同时又属于ad 用户组,其中group用户组是其主组。
这里可能新建组:groupadd group 及 groupadd adm

7、如何删除用户?
userdel username (不会删除用户主目录)
userdel –r username (会删除用户主目录)

8、如何修改账号所属组?
usermod -g ggroup2 g1_user1
把用户g1_user1 改到group2 组

9、如何查看所有用户信息?
cat /etc/passwd

10、如何进行口令管理?
普通用户:
$ passwd
Old password:******
New password:*******
Re-enter new password:*******
超级用户:
passwd sam
New password:*******
Re-enter new password:*******

11、如何给普通用户sudo权限?
第一步:vi /etc/sudoers
第二步:如下图红线部分给hadoop这个用户赋sudo权限

12、如何修改对这个文件的访问权限?
chmod u+x,g+w f01  //为文件f01设置自己可以执行,组员可以写入的权限
chmod u=rwx,g=rw,o=r f01
chmod 764 f01

熟悉redis数据库

https://thinkwon.blog.csdn.net/article/details/103522351

概述

  • 什么是Redis

Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库。
Redis 可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。
与传统数据库不同的是 Redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。另外,Redis 也经常用来做分布式锁。除此之外,Redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。

  • Redis有哪些优缺点

优点
读写性能优异, Redis能读的速度是110000次/s,写的速度是81000次/s。
支持数据持久化,支持AOF和RDB两种持久化方式。
支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
数据结构丰富,除了支持string类型的value外还支持hash、set、zset、list等数据结构。
支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
缺点
数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。

  • 什么是Redis持久化?

持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。

  • Redis 的持久化机制是什么?各自的优缺点?

Redis 提供两种持久化机制 RDB(默认) 和 AOF 机制:
RDB:是Redis DataBase缩写快照
RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。
优点:
1、只有一个文件 dump.rdb,方便持久化。
2、容灾性好,一个文件可以保存到安全的磁盘。
3、性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能
4.相对于数据集大时,比 AOF 的启动效率更高。
缺点:
1、数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候)

AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。
当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。
优点:
1、数据安全,aof 持久化可以配置 appendfsync 属性,有 always,每进行一次 命令操作就记录到 aof 文件中一次。
2、通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题。
3、AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令 进行合并重写),可以删除其中的某些命令(比如误操作的 flushall))
缺点:
1、AOF 文件比 RDB 文件大,且恢复速度慢。
2、数据集大的时候,比 rdb 启动效率低。

优缺点是什么?

AOF文件比RDB更新频率高,优先使用AOF还原数据。
AOF比RDB更安全也更大
RDB性能比AOF好
如果两个都配了优先加载AOF

1、Redis事务的概念:
Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。

总结说:redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令

  • Redis事务的三个阶段

事务开始 MULTI
命令入队
事务执行 EXEC

3、Redis不保证原子性:
Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。

一、为什么Redis可以方便地实现分布式锁

1、Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系。
2、Redis的SETNX命令可以方便的实现分布式锁。
setNX(SET if Not eXists)
语法:SETNX key value
返回值:设置成功,返回 1 ;设置失败,返回 0 。
当且仅当 key 不存在时将 key 的值设为 value,并返回1;若给定的 key 已经存在,则 SETNX 不做任何动作,并返回0。
综上所述,可以通过setnx的返回值来判断是否获取到锁,并且不用担心并发访问的问题,因为Redis是单线程的,所以如果返回1则获取到锁,返回0则没获取到。当业务操作执行完后,一定要释放锁,释放锁的逻辑很简单,就是把之前设置的key删除掉即可,这样下次又可以通过setnx该key获取到锁了。

缓存异常

  • 缓存雪崩

缓存雪崩是指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。

解决方案

1、缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
2、一般并发量不是特别多的时候,使用最多的解决方案是加锁排队。
3、给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓存。

  • 缓存穿透

缓存穿透是指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。
解决方案

1、接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
2、从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击
3、采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap
拦截掉,从而避免了对底层存储系统的查询压力

  • 缓存击穿

缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。和缓存雪崩不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

解决方案

  • 设置热点数据永远不过期。
  • 加互斥锁,互斥锁
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏末微风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值