JAVA-软开-常见八股文(1)-数据库相关

1.缓存雪崩和缓存击穿、缓存穿透是什么,造成的原因及解决方式?

缓存雪崩:

当某一个时刻出现大规模的缓存失效的情况,那么就会导致大量的请求直接打在数据库上面,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机

原因:

第一种可能是Redis宕机,第二种可能是采用了相同的过期时间。

解决方式:

1、在原有的失效时间上加上一个随机值,比如1-5分钟随机。

2、使用熔断机制。当流量到达一定的阈值时,直接返回系统繁忙等提示

3、搭建Redis集群,提高Redis的容灾性,防止Redis的宕机。

缓存击穿:

缓存击穿是一个热点的Key,有大并发集中对其进行访问,突然间这个Key失效了,导致大并发全部打在数据库上,导致数据库压力剧增。

解决方式:

1、对于热点的key可以设置永不过期的key。

2、使用互斥锁。如果缓存失效的情况,只有拿到锁才可以查询数据库。

缓存穿透:

假如有大量发送的请求传进来的key是不存在Redis中的,那么就查不到缓存,查不到缓存就会去数据库查询。这些请求像“穿透”了缓存一样直接打在数据库上,这种现象就叫做缓存穿透。

解决方式:

1、把无效的Key存进Redis中。

2、使用布隆过滤器。布隆过滤器的作用是某个 key 不存在,那么就一定不存在,它说某个 key 存在,那么很大可能是存在(存在一定的误判率)。于是我们可以在缓存之前再加一层布隆过滤器,在查询的时候先去布隆过滤器查询 key 是否存在,如果不存在就直接返回。

2.数据库中内连接、外连接是什么?外连接又分为什么?

内连接(INNER JOIN):

它根据两个或多个表之间的共同列值来联接这些表。在内连接中,只有在连接的表之间有匹配的值时,才会返回结果。

SELECT 列名
FROM 表1
INNER JOIN 表2
ON 表1.列 = 表2.列;

外连接(OUTER JOIN):它可以返回两个或多个表之间所有的匹配和不匹配的数据。外连接有三种类型:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)

左外连接:

返回左边表的所有记录以及右边表中与左边表列相匹配的记录。如果右边表中没有匹配的行,则返回NULL值

SELECT 列名
FROM 表1
LEFT OUTER JOIN 表2
ON 表1.列 = 表2.列;

右外连接:

返回右边表的所有记录以及左边表中与右边表列相匹配的记录。如果左边表中没有匹配的行,则返回NULL值。

SELECT 列名
FROM 表1
RIGHT OUTER JOIN 表2
ON 表1.列 = 表2.列;

全外连接:

全外连接(FULL OUTER JOIN)则返回左边表和右边表的所有记录,即使没有匹配的行也不会被过滤掉。如果没有匹配的行,则返回NULL值。

SELECT 列名
FROM 表1
FULL OUTER JOIN 表2
ON 表1.列 = 表2.列;

3、事务隔离出现的问题、以及数据库中事务的隔离级别。

        脏读:指一个线程中的事务读取到了另外一个线程中未提交的数据。

        不可重复读:指一个线程中的事务读取到了另外一个线程中提交的update的数据

        幻读(虚读):指一个线程中的事务读取到了另外一个线程中提交的insert的数据

事务中的隔离级别:

  • READ-UNCOMMITTED(读取未提交) :最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
  • READ-COMMITTED(读取已提交) :允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
  • REPEATABLE-READ(可重复读) :对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
  • SERIALIZABLE(可串行化) :最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。

你可能感兴趣的:(JAVA面试相关,数据库)