面试题准备day02

本文详细阐述了缓存击穿、穿透和雪崩问题及其解决方案,包括使用布隆过滤器、互斥锁和设置过期时间。同时讨论了Redis的内存淘汰策略和一致性哈希算法的作用。还提到了线程创建方式、wait和sleep的区别,以及数据库事务中的脏读、幻读和不可重复读现象。此外,介绍了排序二叉树的遍历和事务隔离级别。
摘要由CSDN通过智能技术生成

面试题02

1,什么是缓存击穿,缓存穿透,缓存雪崩,及其对应解决办法

  1. 缓存穿透:是指查询一个缓存中不存在的数据,然后会到数据库查,数据库也没有这个数据,那么缓存就不会写入,导致每次查询都会到数据库查
  • 解决办法:
    1. 返回空值写入redis
    2. 使用布隆过滤器,先预热数据库中的数据,放入布隆过滤器,然后查询redis之前先到bitmap中查,查不到直接返回结果
  1. 缓存击穿:一个热点数据在特点时间失效,然后有大量请求过来,造成数据库压力
  • 解决办法
    1. 第一可以使用互斥锁:当缓存失效时,不立即去load db,先使用如 Redis 的 setnx 去设置一个互斥锁,当操作成功返回时再进行 load db的操作并回设缓存,否则重试get缓存的方法
    2. 设置逻辑过期时间列,不给key设置过期时间,查询的时候先看数据是否过期,过期则另开一个线程进行数据同步,当前线程正常返回,但是数据不是最新的
  1. 缓存雪崩:就是在同一时间,大量缓存同时失效,所有查询落在数据库上,导致数据库压力甚至宕机
  • 解决办法:给这些缓存设置不同的过期时间或者服务降级

2,假设redis只能存储10000条数据,那么怎么保证redis中存储的数据都是热点数据

可以使用 allkeys-lru (挑选最近最少使用的数据淘汰)淘汰策略,那留下来的都是经常访问的热点数据

3,redis常见的内存淘汰策略

  1. volatile-lru 从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。注意:redis并不是保证取得所有数据集中最近最少使用的键值对,而只是随机挑选的几个键值对中的, 当内存达到限制的时候无法写入非过期时间的数据集。
  2. volatile-ttl 从已设置过期时间的数据集中挑选将要过期的数据淘汰。
  3. volatile-random 从已设置过期时间的数据集中任意选择数据淘汰。
  4. allkeys-lru 从数据集中挑选最近最少使用的数据淘汰。当内存达到限制的时候,对所有数据集挑选最近最少使用的数据淘汰。
  5. allkeys-random 从数据集中任意选择数据淘汰,当内存达到限制的时候,对所有数据集挑选随机淘汰,可写入新的数据集。
  6. no-enviction 当内存达到限制的时候,不淘汰任何数据,不可写入任何数据集,所有引起申请内存的命令会报错。

4,对一致性哈希算法的理解

一致性哈希就是将整个哈希空间组织成一个圆环,服务器在上面是一个个节点,数据也在环上,然后数据会顺时针存到距离最近的节点,一致性哈希的可扩展性和容错性都比较好,但是存在资源倾斜的问题,可以用过映射虚拟节点解决

5,什么是哈希槽

哈希槽是一种数据分片的方法,用于分布式储存系统中实现负载均衡和高可用性,其基本思想是将整个哈希值空间划分为固定数量的槽,每个槽对应一个服务器节点,当需要储存或者查找一个键值对时,先对键值对进行哈希运算,根据哈希值找到对应的槽,再访问槽上的服务器节点

6,线程创建的方式

  1. 继承Thread类
  2. 实现Runable接口
  • 核心是run()方法,没有返回值
  1. 实现Callable接口
  • 核心是call()方法,有返回值
  1. 线程池创建

7,wait()和sleep()区别

  1. wait是Object类的方法,而sleep是Thread类的静态方法。
  2. wait需要在同步代码块或同步方法中使用,并且需要获取对象的锁。sleep可以在任何地方使用,不需要获取锁。
  3. wait会释放对象的锁,让出CPU资源,进入等待状态,直到被其他线程唤醒或者超时。sleep不会释放锁,只是让出CPU资源,暂停执行一段时间。
  4. wait可以被其他线程中断,抛出InterruptedException异常。sleep也可以被中断,需要捕获异常。

8,什么是排序二叉树及其遍历方式

排序二叉树是一种特殊的二叉树,它满足当前节点的左子树的所有节点都小于当前节点,而右子树的所有节点都大于当前节点。排序二叉树可以方便地进行查找、插入和删除操作。

排序二叉树的遍历方式主要分为三种,分别是前序遍历、中序遍历、后序遍历和层次遍历。

前序遍历是指先访问根节点,再访问左子树,最后访问右子树。前序遍历的顺序可以记为“根左右”。

中序遍历是指先访问左子树,再访问根节点,最后访问右子树。中序遍历的顺序可以记为“左根右”。

后序遍历是指先访问左子树,再访问右子树,最后访问根节点。后序遍历的顺序可以记为“左右根”。

9,请解释什么是脏读、幻读、不可重复读、第一类丢失更新以及第二类丢失更新

脏读:是指一个事务读取到了另一个事务未提交的数据,如果另一个事务回滚了,那么读取到的数据就是无效的。

不可重复读:是指一个事务多次读取同一条数据,但每次读取到的结果不同,因为其他事务已经提交了对该数据的修改。

幻读:是指一个事务多次执行同一个查询,但每次查询到的结果集不同,因为其他事务已经提交了对该表的插入或删除操作。

第一类更新丢失是指一个事务回滚时,把另一个事务已经提交的更新数据覆盖了。

第二类更新丢失是指一个事务覆盖了另一个事务已经提交的数据,造成另一个事务所做的操作丢失。

10,事务隔离级别

隔离级别读数据一致性及允许的并发副作用脏读不可重复读幻读
未提交读(Read uncommitted)最低级别,就是一个事务可以读取另一个未提交事务的数据。
已提交读(Read committed)语句级,事务可以看到其他事务已经提交的数据
可重复读(Repeatable read)事务级,在开始读取数据(事务开启)时,不再允许修改操作
可序列化(Serializable)最高级别,事务级。顺序执行
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值