ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

2021/3/24 爱奇艺(电话面试意外凉经) Redis缓存数据满时,如何处理?final关键字的理解 Java异常架构 spring拦截器 SQL

2021-03-25 18:29:20  阅读:121  来源: 互联网

标签:24 拦截器 Java HashMap SQL 线程 rdb 异常


1谈谈你对Sleep和wait的理解?

1所属的类不同:wait继承的是object而sleep继承的是Thread类
2对于锁的处理方式不同:sleep不会释放锁,wait会释放锁
3使用范围不同:sleep可以在任何地方睡,wait必须在同步代码块中

2线程的生命周期?

new,runnable,blocked,waiting,timed waiting,terminated

3线程创建的四种方式?

1继承 Thread 2实现Runnable 3实现Callable 4线程池来创建的方式ThreadPoolExecutor

4线程池的七大参数


```java
public ThreadPoolExecutor(int corePoolSize,  //核心线程池大小,线程池中会维护一个最小的线程数量,即使这些线程处理空闲状态,他们也不会被销毁。
                          int maximumPoolSize, //一个任务被提交到线程池以后,首先会找有没有空闲存活线程,如果有则直接将任务交给这个空闲线程来执行,
                          //如果没有则会缓存到工作队列( BlockingQueue<Runnable> workQueue)中
                          //如果工作队列满了,才会创建一个新线程,然后从工作队列的头部取出一个任务交由新线程来处理,而将刚提交的任务放入工作队列尾部。线程池不会无限制的去创建新线程,
                          //它会有一个最大线程数量的限制,这个数量即由maximunPoolSize指定。

                          long keepAliveTime,  //一个线程如果处于空闲状态,并且当前的线程数量大于corePoolSize,那么在指定时间后,这个空闲线程会被销毁
                          TimeUnit unit, //超时单位
                          BlockingQueue<Runnable> workQueue, //新任务被提交后,会先进入到此工作队列中,任务调度时再从队列中取出任务
                          ThreadFactory threadFactory, //为线程池提供创建新线程的线程工厂
                          RejectedExecutionHandler handler //当工作队列中的任务已到达最大限制,并且线程池中的线程数量也达到最大限制,这时如果有新任务提交进来
                         ) 
}

5Redis的基本数据类型

多种类型的数据结构,如 字符串(strings)散列(hashes)列表(lists)集合(sets)有序集合(sorted sets) 与范围查询, bitmapshyperloglogs 和 地理空间(geospatial) 索引半径查询

6Redis持久化

1RDB(Redis DataBase)
在指定的时间间隔内将内存中的数据集体快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。

Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的。 这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那 RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。我们默认的就是 RDB,一般情况下不需要修改这个配置!
有时候在生产环境我们会将这个文件进行备份!
rdb保存的文件是dump.rdb都是在我们的配置文件中快照中进行配置的!

触发机制:1 save的规则满足的情况下,会自动触发rdb规则 2 执行 flushall 命令,也会触发我们的rdb规则! 3 退出redis,也会产生 rdb 文件!
只需要将rdb文件放在我们redis启动目录就可以,redis启动的时候会自动检查dump.rdb 恢复其中 的数据!

优点:
1 适合大规模的数据恢复!2 对数据的完整性要不高! 3 只有一个文件 dump.rdb,方便持久化。 4 性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能 5 相对于数据集大时,比 AOF 的启动效率更高
缺点:
1 需要一定的时间间隔进行操作!如果redis意外宕机了,这个最后一次修改数据就没有的了! 2 fork进程的时候,会占用一定的内存空间!!

2AOF(Append Only File)
AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。 当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。 AOF保存的是 appendonly.aof 文件

1每一次修改都同步,文件的完整会更加好!
2每秒同步一次,可能会丢失一秒的数据
3从不同步,效率最高的!
缺点:
1相对于数据文件大小来说,aof远远大于 rdb,修复的速度也比 rdb慢!
2Aof 运行效率也要比rdb慢,所以我们redis默认的配置就是rdb持久化

7Redis缓存数据满时,如何处理?

1、加内存:这是最简单粗暴的办法, 不过成本相对较高

2、内存淘汰策略
noeviction 当内存不足以容纳新写入的数据时, 新写入操作会报错
allkeys-lru 当内存不足以容纳新写入数据时, 在键空间中, 移除最近最少使用的key
allkeys-random 当内存不足以容纳新写入数据时, 在键空间中, 随机移除某个key
volatile-ttl 当内存不足以容纳新写入数据时, 在设置了过期时间的键空间中, 有更早过期时间的key优先移除
3、集群搭建集群

8数据库的事务机制?

事务的ACID原则
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency)
事务前后数据的完整性必须保持一致。
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
隔离性(Isolation)
事务的隔离性是并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;

9事务的隔离级别?

Mysql 默认采用的 REPEATABLE_READ隔离级别 Oracle 默认采用的 READ_COMMITTED隔离级别
在这里插入图片描述

10 基本查询语句的操作

11final关键字的理解

用于修饰类、属性和方法;
被final修饰的类不可以被继承
被final修饰的方法不可以被重写
被final修饰的变量不可以被改变被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的

12Java异常架构

在这里插入图片描述

  1. Throwable
    Throwable 是 Java 语言中所有错误与异常的超类。
    Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示发生了异常情况。

  2. Error(错误)
    定义:Error 类及其子类。程序中无法处理的错误,表示运行应用程序中出现了严重的错误
    特点:此类错误一般表示代码运行时 JVM 出现问题。通常有 Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。比如 OutOfMemoryError:内存不足错误StackOverflowError:栈溢出错误。此类错误发生时,JVM 将终止线程。
    这些错误是
    不受检异常,非代码性错误

  3. Exception(异常)
    程序本身可以捕获并且可以处理的异常。Exception 这种异常又分为两类:运行时异常和编译时异常

运行时异常
定义:RuntimeException 类及其子类,表示 JVM 在运行期间可能出现的异常

特点:Java 编译器不会检查它。也就是说,当程序中可能出现这类异常时,倘若既"没有通过throws声明抛出它",也"没有用try-catch语句捕获它",还是会编译通过。比如NullPointerException空指针异常ArrayIndexOutBoundException数组下标越界异常ClassCastException类型转换异常ArithmeticExecption算术异常

RuntimeException 异常会由 Java 虚拟机自动抛出并自动捕获(就算我们没写异常捕获语句运行时也会抛出错误!!),此类异常的出现绝大数情况是代码本身有问题应该从逻辑上去解决并改进代码

编译时异常:定义: Exception 中除 RuntimeException 及其子类之外的异常。

特点: Java 编译器会检查它如果程序中出现此类异常,比如 ClassNotFoundException(没有找到指定的类异常),IOException(IO流异常),要么通过throws进行声明抛出,要么通过try-catch进行捕获处理,否则不能通过编译。

  1. 受检异常与非受检异常
    Java 的所有异常可以分为受检异常(checked exception)和非受检异常(unchecked exception)。

受检异常
编译器要求必须处理的异常。正确的程序在运行过程中,经常容易出现的、符合预期的异常情况。一旦发生此类异常,就必须采用某种方式进行处理。**除 RuntimeException 及其子类外,其他的 Exception 异常都属于受检异常。**编译器会检查此类异常,也就是说当编译器检查到应用中的某处可能会此类异常时,将会提示你处理本异常——要么使用try-catch捕获,要么使用方法签名中用 throws 关键字抛出,否则编译不通过。

非受检异常
编译器不会进行检查并且不要求必须处理的异常,也就说当程序中出现此类异常时,即使我们没有try-catch捕获它,也没有使用throws抛出该异常,编译也会正常通过。该类异常包括运行时异常(RuntimeException极其子类)和错误(Error)。

13 spring对象的注入操作

1@Autowired;1按类型自动装配;2在属性上直接使用,自动注入 前提是IOC容器中是存在这个Bean对象
2@Qualifier;@Autowired是根据类型自动装配的,加上**@Qualifier则可以根据byName的方式**自动装配;@Qualifier不能单独使用

14spring拦截器

最近做的项目中,计划使用Spring Security做权限控制,但以前大多项目都是采用spring拦截器来实现。在Spring MVC的项目中使用Spring 拦截器做权限控制,一般会有两类拦截器:一个登录拦截器多个权限验证拦截器
登录拦截器所有的请求,验证用户是否登录,以及用户名密码是否正确。权限验证拦截器。
多个权限验证拦截器:不同的链接规则使用不的拦截器进行拦截,并进行权限验证

Spring的拦截器实现有两种方式:
第一种方式:自定义Interceptor类要实现Spring 的HandlerInterceptor 接口,
第二种方式是实现Spring的WebRequestInterceptor接口。

Spring拦截器和过滤器Filter的区别:

1、拦截器是基于java的反射机制的,而过滤器是基于函数回调

2、拦截器在spring容器中不依赖与servlet容器,过滤器依赖于servlet容器

3、过滤器在只在Servlet前后起作用。而拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。所以在Spring构架的程序中,要优先使用拦截器。。

4、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

5、拦截器可以获取IOC容器中的各个bean,但过滤器就不行,也就是说在拦截器里注入一个service,可以调用业务逻辑更加灵活。

15SQL注入

解决SQL注入问题的关键是对所有可能来自**用户输入的数据进行严格的检查、对数据库配置使用最小权限原则。**
1、所有的查询语句都使用**数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中**。当前几乎所有的数据库系统都提供了**参数化SQL语句执行接口,使用此接口可以非常有效的防止SQL注入攻击**。
2、对进入**数据库的特殊字符**(’”\尖括号&*;等)**进行转义处理,或编码转换**。
3、**严格限制变量类型**,比如**整型变量就采用intval()函数过滤,数据库中的存储字段必须对应为int型**。
4、**数据长度应该严格规定**,能在一定程度上防止比较长的SQL注入语句无法正确执行。
5、**网站每个数据层的编码统一,建议全部使用UTF-8编码**,上下层编码不一致有可能导致一些过滤模型被绕过。
6、**严格限制网站用户的数据库的操作权限**,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害。
7、**避免网站显示SQL错误信息**,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。
8、在**网站发布之前建议使用一些专业的SQL注入检测工具进行检测,及时修补这些SQL注入漏洞**。
9、确认PHP配置文件中的magicquotesgpc选项保持开启

16HashMap的底层理解

实现原理:HashMap采用链地址法。即底层是一个数组实现,数组的每一项(即一个Entry)又是一个链表。

HashMap的存储机制:首先根据key计算出该key对应的Entry在数组中的位置,然后判断该Entry是否在该位置对应的链表中,如果不在,则插入链表的头部,如果在,则更新该链表中对应Entry的value。

HashMap计算key所属数组的位置方法:首先计算key的hash值,然后根据hash函数hashcode & (length - 1)计算出所在数组的位置(因为HashMap的数组长度为2的整数幂,所以采用位运算的结果和hash % length相同,但是位运算的效率要远高于求余运算)

HashMap的扩容:每当初始化一个HashMap,默认的数组大小(table.size)为16(初始化阶段是没有16,是在添加元素的时候resize=16的),默认的增长因子(loadFactor)为0.75,;当元素个数超过数组大小的loadFactor 时,就会 对数组进行扩容。HashMap采用的扩容方法为:每次把数组大小扩大一倍,然后重新计算HashMap中每个元素在数组中的位置。也可以 自定义扩展容量的大小( HashMap(int initialCapacity))。

17ArrayList && LinkedList区别?

在这里插入图片描述

标签:24,拦截器,Java,HashMap,SQL,线程,rdb,异常
来源: https://blog.csdn.net/zs18753479279/article/details/115215303

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有