面试题02
1,什么是缓存击穿,缓存穿透,缓存雪崩,及其对应解决办法
- 缓存穿透:是指查询一个缓存中不存在的数据,然后会到数据库查,数据库也没有这个数据,那么缓存就不会写入,导致每次查询都会到数据库查
- 解决办法:
- 返回空值写入redis
- 使用布隆过滤器,先预热数据库中的数据,放入布隆过滤器,然后查询redis之前先到bitmap中查,查不到直接返回结果
- 缓存击穿:一个热点数据在特点时间失效,然后有大量请求过来,造成数据库压力
- 解决办法
- 第一可以使用互斥锁:当缓存失效时,不立即去load db,先使用如 Redis 的 setnx 去设置一个互斥锁,当操作成功返回时再进行 load db的操作并回设缓存,否则重试get缓存的方法
- 设置逻辑过期时间列,不给key设置过期时间,查询的时候先看数据是否过期,过期则另开一个线程进行数据同步,当前线程正常返回,但是数据不是最新的
- 缓存雪崩:就是在同一时间,大量缓存同时失效,所有查询落在数据库上,导致数据库压力甚至宕机
- 解决办法:给这些缓存设置不同的过期时间或者服务降级
2,假设redis只能存储10000条数据,那么怎么保证redis中存储的数据都是热点数据
可以使用 allkeys-lru (挑选最近最少使用的数据淘汰)淘汰策略,那留下来的都是经常访问的热点数据
3,redis常见的内存淘汰策略
- volatile-lru 从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。注意:redis并不是保证取得所有数据集中最近最少使用的键值对,而只是随机挑选的几个键值对中的, 当内存达到限制的时候无法写入非过期时间的数据集。
- volatile-ttl 从已设置过期时间的数据集中挑选将要过期的数据淘汰。
- volatile-random 从已设置过期时间的数据集中任意选择数据淘汰。
- allkeys-lru 从数据集中挑选最近最少使用的数据淘汰。当内存达到限制的时候,对所有数据集挑选最近最少使用的数据淘汰。
- allkeys-random 从数据集中任意选择数据淘汰,当内存达到限制的时候,对所有数据集挑选随机淘汰,可写入新的数据集。
- no-enviction 当内存达到限制的时候,不淘汰任何数据,不可写入任何数据集,所有引起申请内存的命令会报错。
4,对一致性哈希算法的理解
一致性哈希就是将整个哈希空间组织成一个圆环,服务器在上面是一个个节点,数据也在环上,然后数据会顺时针存到距离最近的节点,一致性哈希的可扩展性和容错性都比较好,但是存在资源倾斜的问题,可以用过映射虚拟节点解决
5,什么是哈希槽
哈希槽是一种数据分片的方法,用于分布式储存系统中实现负载均衡和高可用性,其基本思想是将整个哈希值空间划分为固定数量的槽,每个槽对应一个服务器节点,当需要储存或者查找一个键值对时,先对键值对进行哈希运算,根据哈希值找到对应的槽,再访问槽上的服务器节点
6,线程创建的方式
- 继承Thread类
- 实现Runable接口
- 核心是run()方法,没有返回值
- 实现Callable接口
- 核心是call()方法,有返回值
- 线程池创建
7,wait()和sleep()区别
- wait是Object类的方法,而sleep是Thread类的静态方法。
- wait需要在同步代码块或同步方法中使用,并且需要获取对象的锁。sleep可以在任何地方使用,不需要获取锁。
- wait会释放对象的锁,让出CPU资源,进入等待状态,直到被其他线程唤醒或者超时。sleep不会释放锁,只是让出CPU资源,暂停执行一段时间。
- wait可以被其他线程中断,抛出InterruptedException异常。sleep也可以被中断,需要捕获异常。
8,什么是排序二叉树及其遍历方式
排序二叉树是一种特殊的二叉树,它满足当前节点的左子树的所有节点都小于当前节点,而右子树的所有节点都大于当前节点。排序二叉树可以方便地进行查找、插入和删除操作。
排序二叉树的遍历方式主要分为三种,分别是前序遍历、中序遍历、后序遍历和层次遍历。
前序遍历是指先访问根节点,再访问左子树,最后访问右子树。前序遍历的顺序可以记为“根左右”。
中序遍历是指先访问左子树,再访问根节点,最后访问右子树。中序遍历的顺序可以记为“左根右”。
后序遍历是指先访问左子树,再访问右子树,最后访问根节点。后序遍历的顺序可以记为“左右根”。
9,请解释什么是脏读、幻读、不可重复读、第一类丢失更新以及第二类丢失更新
脏读:是指一个事务读取到了另一个事务未提交的数据,如果另一个事务回滚了,那么读取到的数据就是无效的。
不可重复读:是指一个事务多次读取同一条数据,但每次读取到的结果不同,因为其他事务已经提交了对该数据的修改。
幻读:是指一个事务多次执行同一个查询,但每次查询到的结果集不同,因为其他事务已经提交了对该表的插入或删除操作。
第一类更新丢失是指一个事务回滚时,把另一个事务已经提交的更新数据覆盖了。
第二类更新丢失是指一个事务覆盖了另一个事务已经提交的数据,造成另一个事务所做的操作丢失。
10,事务隔离级别
隔离级别 | 读数据一致性及允许的并发副作用 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
未提交读(Read uncommitted) | 最低级别,就是一个事务可以读取另一个未提交事务的数据。 | 是 | 是 | 是 |
已提交读(Read committed) | 语句级,事务可以看到其他事务已经提交的数据 | 否 | 是 | 是 |
可重复读(Repeatable read) | 事务级,在开始读取数据(事务开启)时,不再允许修改操作 | 否 | 否 | 是 |
可序列化(Serializable) | 最高级别,事务级。顺序执行 | 否 | 否 | 否 |