JAVA-软开-常见八股文(1)-数据库相关
最佳答案 问答题库508位专家为你答疑解惑
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 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"JAVA-软开-常见八股文(1)-数据库相关":http://eshow365.cn/6-32356-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: SQL左连接实战案例
- 下一篇: 唯一ID如何生成,介绍一下目前技术领域最常使用的几种方法