一、Java基础

(一)集合

  • List接口:有序可重复

    • LinkedList:基于链表实现,每个元素储存本身内存地址还储存下一个元素的地址。(增删快,查找慢)

    • ArrayList:基于数组实现,每次增删都要重新创建新的数组,但数组有索引。(增删慢,查找快)

    • Vector:基于数组,线程安全相关,效率低。

  • Set接口:不可重复

    • HashSet: 储存的元素无序,不可重复,底层是哈希表

    • LinkedHashSet:储存元素有序,不可重复,底层是哈希表和链表的结合

    • TreeSet:可以指定一个顺序,对象存入之后会按照指定的顺序排序。

  • Map接口:双列集合

    • HashMap:非线程安全,高效,支持null

    • LinkedHashMap:是HashMap的一个子类,保存了记录的插入顺序

    • HashTable:线程安全,低效,不支持null

    • TreeMap:能够把他保存的记录根据键排序,默认是键值的升序排序

1.HashMap和Hashtable有什么区别?

  • 存储: HashMap 运行key和value可为null,而Hashtable不允许。

  • 线程安全: Hashtable 是线程安全的,而HashMap是非线程安全的。

2.HashMap的实现原理

  • HashMap基于Hash算法实现的,我们通过put(key,value)存储,get(key)来获取;

  • 当传入key时,HashMap 会根据key. hashCode()计算出hash值,根据hash值将value保存在bucket里;

  • 当计算出的hash值相同时,我们称之为hash冲突,HashMap 的做法是用链表和红黑树存储相同hash值的value;

  • 当hash冲突的个数比较少时,使用链表否则使用红黑树。

3.ArrayList和LinkedList的区别是什么?

  • 数据结构实现: ArrayList是动态数组的数据结构实现,LinkedList是双向链表的数据结构实现。

  • 随机访问效率: ArrayList 比LinkedList 在随机访问的时候效率要高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。

  • 增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比ArrayList效率要高,因为ArrayList增删操作要影响数组内的其他数据的下标。

  • 综合来说,在需要频繁读取集合中的元素时,更推荐使ArrayList,而在插入和删除操作较多时,更推荐使用LinkedList。

4.ArrayList和Vector的区别是什么?

  • 线程安全: Vector使用了Synchronized 来实现线程同步,是线程安全的,而ArrayList是非线程安全的。

  • 性能: ArrayList在性能方面要优于Vector。

  • 扩容: ArrayList和Vector都会根据实际的需要动态的调整容量,只不过在Vector扩容每次会增加1倍,而ArrayList只会增加50%。

5.Array和ArrayList有何区别?

  • Array 可以存储基本数据类型和对象,ArrayList 只能存储对象。

  • Array 是指定固定大小的,而ArrayList大小是自动扩展的。

  • Array内置方法没有ArrayList多,比如addAll、 removeAll、 iteration等方法只有ArrayList有。

6.哪些集合类是线程安全的?

  • Vector、Hashtable、 Stack 都是线程安全的,而像HashMap则是非线程安全的;

  • 不过在JDK 1.5之后随着Java. util. concurrent并发包的出现,它们也有了自己对应的线程安全类,比如HashMap对应的线程安全类就是ConcurrentHashMap。

(二)线程

线程三种队列

LinkedBlockingDeque(链表同步阻塞队列)、ArrayBlockingQueue(数组同步阻塞队列)、SynchronousQueue(同步阻塞队列)

1.创建线程有三种方式

  • 继承Thread重写run方法;

  • 实现Runnable接口;

  • 实现Callable 接口。

  • runnable没有返回值,callable 可以拿到有返回值,callable 可以看作是runnable的补充。

2.线程的状态:

  • NEW尚未启动

  • RUNNABLE正在执行中

  • BLOCKED阻塞的(被同步锁或者I0锁阻塞)

  • WAITING 永久等待状态

  • TIMED_ WAITING 等待指定的时间重新被唤醒的状态

  • TERMINATED执行完成

3.线程池创建有七种方式,最核心的是最后一种:

  • newSingleThreadExecutor(): 它的特点在于工作线程数目被限制为1,操作一个无界的工作队列,所以它保证了所有任务的都是被顺序执行,最多会有一一个任务处于活动状态,并且不允许使用者改动线程池实例,因此可以避免其改变线程数目;

  • newCachedThreadPool(): 它是一种用来处理大量短时间工作任务的线程池,具有几个鲜明特点:它会试图缓存线程并重用,当无缓存线程可用时,就会创建新的工作线程;如果线程闲置的时间超过60秒,则被终止并移出缓存;长时间闲置时,这种线程池,不会消耗什么资源。其内部使用SynchronousQueue作为工作队列;

  • newFixedThreadPol(int nThreads):重用指定数目(nThreads) 的线程,其背后使用的是无界的工作队列,任何时候最多有nThreads个工作线程是活动的。这意味着,如果任务数量超过了活动队列数目,将在工作队列中等待空闲线程出现;如果有工作线程退出,将会有新的工作线程被创建,以补足指定的数目nThreads;

  • newSingleThreadScheduledExecutor() :创建单线程池,返 回ScheduledExecutorService,可以进行定时或周期性的工作调度;

  • newScheduledThreadPool(intcorePoolSize)和 newSingleThreadScheduledExecutor()类似创建的是个ScheduledExecutorService,可以进行定时或周期性的工作调度,区别在于单一工作线程还是多个工作线程;

  • newWorkStealingPool(int parallelism): 这是一 个经常被人忽略的线程池,Java 8才加入这个创建方法,其内部会构建ForkJoinPool, 利用Work- Stealing算法,并行地处理任务,不保证处理顺序;

  • ThreadPoolExecutor(): 是最原始的线程池创建,上面1-3创建方式都是对ThreadPoolExecutor的封装。

4.线程池都有哪些状态?

  • RUNNING(running): 这是最正常的状态,接受新的任务,处理等待队列中的任务。

  • SHUTDOWN(shutdown):不接受新的任务提交,但是会继续处理等待队列中的任务。

  • STOP(stop):不接受新的任务提交,不再处理等待队列中的任务,中断正在执行任务的 线程。

  • TIDYING(tidying): 所有的任务都销毁了,workCount为0,线程池的状态在转换为TIDYING状态时,会执行钩子方法terminated()。

  • TERMINATED(terminated): terminated()方法结束后, 线程池的状态就会变成这个。

5.在Java程序中怎么保证多线程的运行安全?

  • 方法一:使用安全类,比如Java. util. concurrent下的类。

  • 方法二:使用自动锁synchronized.

  • 方法三:使用手动锁Lock。

6.synchronized和Lock有什么区别?

  • synchronized可以给类、方法、代码块加锁;而lock只能给代码块加锁。

  • synchronized不需要手动获取锁和释放锁,使用简单,发生异常会自动释放锁,不会造成死锁;而lock需要自己加锁和释放锁,如果使用不当没有unLock()去释放锁就会造成死锁。

  • 通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。

7.synchronized锁升级原理:

  • 在锁对象的对象头里面有一个threadid字段,在第一次访问的时候threadid为空,jvm 让其持有偏向锁,并将threadid设置为其线程id

  • 再次进入的时候会先判断threadid是否与其线程id-致,如果一致则可以直接使用此对象, 如果不一致,则升级偏向锁为轻量级锁,通过自旋循环一定次数来获取锁,执行一定次数之后,如果还没有正常获取到要使用的对象,此时就会把锁从轻量级升级为重量级锁,此过程就构成了synchronized锁的升级。

  • 锁的升级的目的:锁升级是为了减低了锁带来的性能消耗。在Java6之后优化synchronized的实现方式,使用了偏向锁升级为轻量级锁再升级到重量级锁的方式,从而减低了锁带来的性能消耗。

8.什么是死锁?

  • 当线程A持有独占锁a,并尝试去获取独占锁b的同时,线程B持有独占锁b,并尝试获取独占锁a的情况下,就会发生AB两个线程由于互相持有对方需要的锁,而发生的阻塞现象,我们称为死锁。

(三)反射

1.什么是反射?

  • 反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性; 这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

  • 1、获取Class对象

    在 Java API 中,提供了获取 Class 类对象的三种方法:

    第一种,使用 Class.forName 静态方法。

    前提:已明确类的全路径名。

    第二种,使用 .class 方法。

    说明:仅适合在编译前就已经明确要操作的 Class

    第三种,使用类对象的 getClass() 方法。

    适合有对象示例的情况下

    2、获取对象实例 共两种方法:

    2.1、直接用字节码文件获取对应实例

    // 调用无参构造器 ,若是没有,则会报异常

    Object o = clazz.newInstance();   2.2、有带参数的构造函数的类,先获取到其构造对象,再通过该构造方法类获取实例:

    / /获取构造函数类的对象

    Constroctor constroctor = clazz.getConstructor(String.class,Integer.class); /

    // 使用构造器对象的newInstance方法初始化对象

    Object obj = constroctor.newInstance("阿虎", 29);

(四)JVM

1.Java中都有哪些引用类型?

  • 强引用:发生gc的时候不会被回收。

  • 软引用:有用但不是必须的对象,在发生内存溢出之前会被回收。

  • 弱引用:有用但不是必须的对象,在下一次GC时会被回收。

  • 虚引用(幽灵引用/幻影引用) :无法通过虚弓|用获得对象,用PhantomReference实现虚引用,虚弓|用的用途是在gc时返回一个通知。

2.怎么判断对象是否可以被回收?

  • 引用计数器:为每个对象创建-个引用计数,有对象引用时计数器+1,引用被释放时计数-1,当计数器为0时就可以被回收。它有一个缺点不能解决循环引用的问题;

  • 可达性分析:从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是可以被回收的。

3.说一下JVM有哪些垃圾回收算法?

  • 标记-清除算法:标记无用对象,然后进行清除回收。缺点:效率不高,无法清除垃圾碎片。

  • 标记-整理算法:标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。

  • 复制算法:按照容量划分二个大小相等的内存区域,当一块用完的时候将活着的对象复制到另一块上,然后再把已使用的内存空间一次清理掉。缺点:内存使用率不高,只有原来的一半。

  • 分代算法:根据对象存活周期的不同将内存划分为几块,一般是新生代和老年代,新生代基本采用复制算法,老年代采用标记整理算法。

(五)其他

1.Java中操作字符串的三个类

  • String对象是不可变的,对String对象的增删改,实际上是创建了一个新的对象。

  • StringBuffer是可变的,对StringBuffer对象的增删改是不会创建新对象的,并且它是线程安全的。

  • StringBuilder是可变的,对StringBuilder对象的增删改是不会创建新对象的,它不是线程安全的。

  • String和StringBuffer、StringBuilder 的区别在于String声明的是不可变的对象,每次操作都会生成新的String 对象,然后将指针指向新的String 对象,而StringBuffer、StringBuilder可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用String。

2.深拷贝和浅拷贝区别是什么?

  • 浅克隆:当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。

  • 深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将复制。

3.什么是CSRF攻击,如何避免?

  • CSRF:

    • Cross -Site Request Forgery (中文:跨站请求伪造), 可以理解为攻击者盗用了你的身份,以你的名义发送恶意请求,比如:以你名义发送邮件、发消息、购买商品,虚拟货币转账等。

  • 防御手段:

    • 验证请求来源地址;

    • 关键操作添加验证码;

    • 在请求地址添加token并验证。

4.OSI的七层模型都有哪些?

  • 物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。

  • 数据链路层:负责建立和管理节点间的链路。

  • 网络层:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。

  • 传输层:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。

  • 会话层:向两个实体的表示层提供建立和使用连接的方法。

  • 表示层:处理用户信息的表示问题,如编码、数据格式转换和加密解密等。

  • 应用层:直接向用户提供服务,完成用户希望在网络上完成的各种工作。

5.get和post请求有哪些区别?

  • get请求会被浏览器主动缓存,而post不会。

  • get传递参数有大小限制,而post没有。

  • post参数传输更安全,get 的参数会明文限制在url上,post 不会。

6.说一下你熟悉的设计模式?

  • 单例模式:保证被创建一次,节省系统开销。饿汉式:一开始就创建对象不管用不用,线程不安全,懒汉式:需要用到才去创建对象,线程安全

  • 工厂模式(简单工厂、抽象工厂) :解耦代码。

  • 观察者模式:定义了对象之间的一对多的依赖,这样一来, 当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。

  • 外观模式:提供一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层的接口,让子系统更容易使用。

  • 模版方法模式:定义了一个算法的骨架,而将一些步骤延迟到子类中, 模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤。

  • 状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的 类。

二、基本框架

(一)SSM

1.Spring

  • spring提供ioc技术,容器会帮你管理依赖的对象,从而不需要自己创建和管理依赖对象了,更轻松的实现了程序的解耦。

  • spring提供了事务支持,使得事务操作变的更加方便。

  • spring提供了aop面向切片编程,这样可以更方便的处理某一类的问题。更方便的框架集成,spring 可以很方便的集成其他框架,比如MyBatis、hibernate等。

2.Spring事务实现方式有哪些?

  • 声明式事务:声明式事务也有两种实现方式,基于xml配置文件的方式和注解方式(在类上添加@Transaction注解)

  • 编码方式:提供编码的形式管理和维护事务。

3.Spring的事务隔离:

  • Spring有五大隔离级别,默认值为ISOLATION_ DEFAULT (使用数据库的设置), 其他四个隔离级别和数据库的隔离级别一致:

  • ISOLATION_ DEFAULT(isolation default): 用底层数据库的设置隔离级别,数据库设置的是什么我就用什么;

  • ISOLATION_ READ_ UNCOMMITTED: 未提交读,最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读) ;

  • ISOLATION_ READ_ COMMITTED: 提交读,一个事务提交后才能被其他事读取到(会造成幻读、不可重复读),SQL server的默认级别;

  • ISOLATION_ REPEATABLE READ:可重复读,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读),MySQL 的默认级别;

  • ISOLATION_ SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。

  • 脏读:表示一个事务能够读取另一个事务中还未提交的数据。比如,某个事务尝试插入记录A,此时该事务还未提交,然后另-一个事务尝试读取到了记录A。

  • 不可重复读:是指在一个事务内,多次读同一数据。

  • 幻读:指同一个事务内多次查询返回的结果集不一样。比如同一个事务A第一-次查询时候有n条记录,但是第二次同等条件下查询却有n+1条记录,这就好像产生了幻觉。发生幻读的原因也是另外-个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。

4.spring有哪些主要模块?

  • spring core:框架的最基础部分,提供ioc和依赖注入特性。

  • spring context:构建于core封装包基础上的context封装包,提供了一种框架式的对象访问方法。

  • spring dao: Data Access Object提供了JDBC的抽象层。

  • spring aop:提供了面向切面的编程实现,让你可以自定义拦截器、切点等。

  • spring Web:提供了针对Web开发的集成特性,例如文件.上传,利用servlet listeners进行ioc容器初始化和针对Web的ApplicationContext。

  • springWebmvc:spring中的mvc封装包提供了Web应用的Model-View-Controller (MVC) 的实现。

4.Spring MVC 的工作流程

  • DispatcherServlet(中央处理器)

  • HandlerMapping(处理器映射器)

  • HandlerAdapter(处理器适配器)

  • ViewResolver(视图解析器)

  • View(视图)

5.Mybatis

  • MyBatis中#{}和${}的区别是什么?

    • #{}是预编译处理,${} 是字符替换。

    • 在使用#{} 时,MyBatis 会将SQL中的#{} 替换成“?”,配合PreparedStatement的set方法赋值,这样可以有效的防止SQL注入,保证程序的运行安全。

  • MyBatis逻辑分页和物理分页的区别是什么?

    • 逻辑分页是一次性查询很多数据,然后再在结果中检索分页的数据。这样做弊端是需要消耗大量的内存、有内存溢出的风险、对数据库压力较大。

    • 物理分页是从数据库查询指定条数的数据,弥补了一次性全部查出的所有数据的种种缺点,比如需要大量的内存,对数据库查询压力较大等问题。

(二)Spring Boot

1.为什么要用spring boot?

  • 配置简单

  • 独立运行

  • 自动装配,依赖管理

  • 无代码生成和xml配置

  • 提供应用监控

  • 易上手,提升开发效率

2.spring boot配置文件

  • .properties格式:spring.Rabbi tMQ.port=5672

  • .yml格式:spring : Rabbi tMQ: port: 5672

  • 它们主要的区别是书法风格不同,.yml格式不支持@PropertySource注解导入。

3.Spring boot有哪些方式可以实现热部署?

  • 使用devtools启动热部署,添加devtools库,在配置文件中把spring. devtools.restart. enabled设置为true;

  • 使用Intellij Idea编辑器,勾上自动编译或手动重新编译。

4.jpa和hibernate有什么区别?

  • jpa全称Java Persistence API,是Java持久化接口规范,hibernate 属于jpa的具体实现。

三、微服务

(一)SpringCloud

1.spring cloud的核心组件

  • Eureka:服务注册中心,相当于电话本,A 想要调用 B,先来 Eureka 上查询 B 的地址,查到之后,直接调用 B。

    • Eureka集群如何搭建

    • 全部宕机了服务间是否还能调用

      • 答案是可以的

      • 启动dubbo时,消费者会从注册中心拉取注册的生产者的接口等数据,缓存到本地。每次调用时,按照本地存储的地址进行调用。

      • 注册中心对等集群,任意一台宕掉后,将自动切换到另一台。

      • 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯。

      • 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务

      • 服务提供者无状态,任意一台宕掉后,不影响使用

      • 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复

  • Ribbon:负载均衡工具,A 去 Eureka 上查 B 的地址,查到了多个,那么到底调用哪个?Ribbon 决定。

    • Ribbon负载均衡策略(方法)

      • 随机策略

      • 轮询策略

      • 重试策略

      • 最低并发策略

  • Hystrix:服务降级&容错工具,A 调用 B,调用出错了这么办?由 Hystrix 来处理。

    • Hystrix实现方案

      • 超时降级:

      • 线程池隔离:就是每个过来的请求,系统会单独将这个请求的执行放在一个线程或线程池里,这个根据自己的需求进行配置,以后,相同的请求不管有多少打进来,都会在指定数量的线程池内进行,因此不会出现诸如线程资源耗尽的情况

      • 信号量隔离:信号量的资源隔离只是起到一个开关的作用,比如,服务 A 的信号量大小为 10,那么就是说它同时只允许有 10 个 tomcat 线程来访问服务 A,其它的请求都会被拒绝,从而达到资源隔离和限流保护的作用

  • Feign:声明式服务调用组件,A 调用 B,具体就是通过 Feign 来调用,Feign 的底层是 Http(区别于 Dubbo,Dubbo 是自定义的协议,用 Socket 实现)。

    • Feign最大的特点:底层http,自带负载均衡Ribbon

  • Dubbo:实现远程调用

  • Zuul:服务网关,微服务有很多个,有很多入口,网关把这些入口统一起来,所有请求从网关进,然后分发到不同的微服务上面(可以在网关中做权限校验)。zuul服务的目的是为了实现登录校验和权限检验,以及路由跳转。

    • 如何做权限校验

      • 第一个过滤器AccessFilter.java文件——token过滤器

      • 第二个过滤器LoginFilter.java文件——登录过滤器

      • 第三个过滤器PermissionFilter.java文件——权限过滤器

  • Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台

    • Eureka和Nacos的区别

      • Eureka+Spring Cloud Config 的功能=Nacos的功能

  • Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性

    • 流量防卫兵,一个限流工具。

2.编写规范

  • Spring Cloud Gateway:微服务网关,响应式系统,效率比 Zuu 高。

  • Spring Cloud Config:分布式配置中心(不同微服务的配置文件放在一个地方统一管理,这个事情由 Spring Cloud Config 来实现)。

  • Spring Cloud Sleuth:服务调用链路追踪,一个请求要经过很多服务,请求出错如何排查问题?用这个。

  • Spring Cloud Stream:消息驱动的微服务,上面说的 Feign,本质是 HTTP 调用,Dubbo 底层是 socket,除了这两种方式可以实现 A 调用 B,也可以通过消息中间件实现 A 调用 B,通过消息中间件实现服务间调用时,用这个 Stream。

  • Spring Cloud Alibaba Nacos:Eureka+Spring Cloud Config 的功能=Nacos的功能

  • Spring Cloud Alibaba Sentinel:流量防卫兵,一个限流工具。

3.CAP是什么

  • C:Consistency(强一致性)

  • A:Availability(可用性)

  • P:Partition tolerance(分区容错性)

  • CAP理论关注粒度是否是数据,而不是整体系统设计的策略,最多只能同时较好的满足两个。

  • CAP理论的核心是:一个分布式系统,不可能同时很好的满足一致性,可能用和分区容错性这三个需求;因此,根据CAP原理,将NoSQL数据库分成了满足CA原则,满足CP原则和满足AP原则,三大类:

    • CA-单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。

    • CP-满足一致性,分区容错的系统,通常性能不是特别高。

    • AP-满足可用性,分区容错的系统,通常对一致性要求略低一些。

4.eureka 和zookeeper 的区别:

  • Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像zookeeper那样使整个注册服务瘫痪。

  • eureka 保证的是AP ,(可用性、分区容错)

  • zookeeper保证的是CP,(一致性,分区容错)

(三)中间件

1.Redis

  • Redis是一个使用C语言开发的高速缓存数据库。

  • 非关系型数据库

  • Redis使用场景:

    • 记录帖子点赞数、点击数、评论数; .

    • 缓存近期热帖;

    • 缓存文章详情信息;

    • 记录用户会话信息。

  • Redis有哪些功能?

    • 数据缓存功能

    • 分布式锁的功能

    • 支持数据持久化

    • 支持事务

    • 支持消息队列

  • Redis的数据类型有哪些?

    • Redis 支持五种数据类型:string(字符串),hash(哈希),list(列表), set(集合)及 zsetsorted set:有序集合)。

  • 项目中使用的类型

    • 项目中使用的是hash 类型

    • 将一些结构化的信息打包成HashMap,在客户端序列化后存储为一个字符串的值

    • 比如商品的名称、价格、类型、库存等,这时候在需要修改其中某一项时,只需要将所有值取出反序列化后,修改某一项的值,再序列化存储回去就行。

  • 缓存穿透:

    • 指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。

  • 怎么保证缓存和数据库数据的一致性?

    • 合理设置缓存的过期时间。

    • 新增、更改、删除数据库操作时同步更新Redis,可以使用事务机制来保证数据的一致性。

  • Redis的持久化有两种策略:

    • RDB (Redis Database) :指定的时间间隔能对你的数据进行快照存储。

    • AOF(Append OnlyFile) :每一个收到的写命令都通过write函数追加到文件中。

  • Redis怎么实现分布式锁?

  • Redis分布式锁有什么缺陷?

    • Redis分布式锁不能解决超时的问题,分布式锁有一个超时时间,程序的执行如果超出了锁的超时时间就会出现问题。

  • Redis如何做内存优化?

    • 尽量使用Redis的散列表,把相关的信息放到散列表里面存储,而不是把每个字段单独存储,这样可以有效的减少内存使用。比如将Web系统的用户对象,应该放到散列表里面再整体存储到Redis,而不是把用户的姓名、年龄、密码、邮箱等字段分别设置key进行存储。

  • Redis淘汰策略有哪些?

    • volatile-ru:从已设置过期时间的数据集(server. db[i]. expires)中挑选最近最少使用的数据淘汰。

    • volatile-ttl:从已设置过期时间的数据集(server. db[i]. expires)中挑选将要过期的数据淘汰。

    • volatile-random:从已设置过期时间的数据集(server. db[i]. expires)中任意选择数据淘汰。

    • alkeys-lru:从数据集(server. db[i]. dict)中挑选最近最少使用的数据淘汰。

    • allkeys-random:从数据集(server. db[i]. dict)中任意选择数据淘汰。

    • no-enviction (驱逐) :禁止驱逐数据。

四、数据库

1、MySQL 中有哪几种锁?

  • 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最 高,并发度最低。

  • 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最 低,并发度也最高。

  • 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表 锁和行锁之间,并发度一般。

2.SQL优化

  • SQL 语句及索引的优化

    • 避免全表查询,避免使用 select *,列出需要查询的字段

    • 建立合适索引

    • 避免索引失效的查询,避免在where子句中使用or来连接条件

    • 给字段定义合适的长度,使用varchar代替char

  • 数据库表结构的优化

    • 垂直分割分表

  • 系统配置的优化

  • 硬件的优化

3.三种表连接方式

  • inner join 内连接,只保留两张表中完全匹配的结果集

  • left join 会返回左表所有的行,即使在右表中没有匹配的记录

  • right join 会返回右表所有的行,即使在左表中没有匹配的记录

Java经典面试题汇总相关推荐

  1. Java经典面试题汇总200道

    超详细的Java学习资料汇总 Java经典面试题汇总 Java 基础 1. JDK 和 JRE 有什么区别? 2. == 和 equals 的区别是什么? 3. 两个对象的 hashCode()相同, ...

  2. JAVA经典面试题汇总(保存这篇就够了)

    一. java基础篇 1.final 关键字的作用? 被 final 修饰的类不可以被继承. 被 final 修饰的方法不可以被重写. 被 final 修饰的变量不可以被改变,如果修饰引用,那么表示引 ...

  3. Java经典面试题汇总(五)网络编程

    本篇总结的是Java 网络编程相关的面试题,后续会持续更新,希望我的分享可以帮助到正在备战面试的实习生或者已经工作的同行,如果发现错误还望大家多多包涵,不吝赐教,谢谢~ 目录 1. HTTP 响应码 ...

  4. Java经典面试题汇总(七)多线程

    本篇总结的是Java多线程相关的面试题,后续会持续更新,希望我的分享可以帮助到正在备战面试的实习生或者已经工作的同行,如果发现错误还望大家多多包涵,不吝赐教,谢谢~ 目录 1. 并行和并发有什么区别? ...

  5. 百度校招历年经典面试题汇总:Java开发岗

    这个系列计划收集几百份朋友和读者的面经,作者合集方便查看,各位有面经屯着可以联系我哦 这个系列离结束差的还特别多,会更新涵盖所有一线大厂的所有岗位,也可以关注一下. 百度校园招聘历年经典面试题汇总:C ...

  6. java web试题_Java web开发经典面试题汇总(内附答案详解)

    原标题:Java web开发经典面试题汇总(内附答案详解) 1.说出Servlet 的生命周期,并说出Servlet 和CGI 的区别? 答:Web 容器加载Servlet 并将其实例化后,Servl ...

  7. 阿里巴巴历年经典面试题汇总:Java岗

    这个系列计划收集几百份朋友和读者的面经,作者合集方便查看,各位有面经屯着可以联系我哦 本系列历史文章: 学姐百度实习面经 学姐,来挑战字节最牛部门 最强阿里巴巴历年经典面试题汇总:C++研发岗 关于我 ...

  8. java面试题_阿里大厂流出的数百道 Java 经典面试题

    BAT 常问的 Java基础39道常见面试题 1.八种基本数据类型的大小,以及他们的封装类 2.引用数据类型 3.Switch能否用string做参数 4.equals与==的区别 5.自动装箱,常量 ...

  9. 网易校园招聘历年经典面试题汇总:前端 岗

    这个系列计划收集几百份朋友和读者的面经,作者合集方便查看,各位有面经屯着可以联系我哦 这个系列离结束差的还特别多,会更新涵盖所有一线大厂的所有岗位,也可以关注一下. 腾讯校园招聘历年经典面试题汇总:前 ...

最新文章

  1. C enum(枚举)
  2. 31.1 inforMATION_SCHEMA aCcess syntax
  3. Kebernetes 学习总结(9)认证-授权-RBAC
  4. android封装好的Color类中的常量
  5. Tensorflow object detection API 搭建自己的目标检测模型并迁移到Android上
  6. java可以继承私有的,关于java:继承中的私有方法
  7. Cerberus 银行木马开发团队解散,源代码5万美元起拍
  8. 彻底杜绝warning: Cannot add header information - headers already sent in......
  9. 【sklearn第十六讲】集成方法
  10. 华为服务器双系统教程,双系统安装教程
  11. web前端面试(1) 前端缓存怎么做?
  12. 阴阳师2017 7服务器维护,《阴阳师》手游4月17日维护更新公告
  13. 入门编程(小白写代码的神器)
  14. 一筐梨子一筐水果——协变性(covariant)
  15. 网络安全应急响应----8、网页篡改应急响应
  16. Vue.js+ECharts:切换图表类型(图表工具栏)
  17. java list获取某个字段
  18. 微信小程npm相关问题
  19. 国家、省、市三级联动下拉列表
  20. 未成熟男人; 成熟男人

热门文章

  1. Ant的安装和intellij IDE的配置和使用
  2. bgcolor和background-color;bgColor和backgroundColor
  3. C-V2X(四)C-V2X模组
  4. 误分区的删除之DBR的修复
  5. 智慧停车场微信小程序源码 | 智能停车系统源码 | 全开源
  6. 如何进行GBase 8c数据库的备份和恢复
  7. Token方式 验证登录
  8. 打开计算机我的电脑无法打开,WindowsXP系统“我的电脑”属性打不开怎么办?
  9. 物联网移动APP架构设计
  10. BootStrap笔记参考(全)-优极限