面试题总结第二弹

一.Volatile++为什么不保证原子性?

        因为它实际上是三个操作组成的一个复合操作。
        首先获取volatile变量的值,将该变量的值加1,将该volatile变量的值写会到对应的主存地址。而原子性指的是一个或多个操作在CPU执行的过程中不会被中断的特性,即这些操作要么全部执行,要么全部不执行。Volatile虽然能保证变量的可见性,但它不能保证复合操作的原子性。

二.Hashmap的阈值为什么是0.75?

        1.平衡性能和空间利用率
                加载因子的选择是一个权衡。较小的加载因子会导致哈希表更快地达到扩容条件,但可能会浪费空间。较大的加载因子会减少扩容的频率,但可能导致更多的冲突。0.75是在效率和空间利用之间取得的平衡,通常能够提供较好的性能。
        2.减少冲突的可能性
                较小的加载因子意味着哈希表的填充程度相对较低,减少了冲突的可能性。冲突是指两个不同的键映射到了相同的哈希表索引,影响了HashMap的性能。0.75的加载因子在减少冲突的同时,保持了较高的空间利用率。
        3.加载因子对性能的影响
                加载因子的选择直接影响HashMap的性能。较小的加载因子会使得哈希表更频繁地进行扩容,但在容量增加的同时也降低了冲突的可能性。相反,较大的加载因子会减少扩容的频率,但可能导致较多的冲突,从而影响性能。

三.Hashmap的容量为什么是2的n次幂?
        只有数组长度是2的幂次方倍才能够确保数组中的每一个位置发生hash冲突的概率是相同的,数组长度减一的二进制码必须全部是1,否则会出现部分位置永远不会发生hash冲突而造成资源浪费

四.Redis有哪几种数据淘汰策略?
        1.noeviction:返回错误当内存限制达到,并且客户端尝试执行会让更多内存被使用的命令。
        2.allkeys-lru: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
        3.volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
        4.allkeys-random: 回收随机的键使得新添加的数据有空间存放。
        5.volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
        6.volatile-ttl: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。

五.service里的方法a通过this调用方法b会导致方法b事务传播机制失效吗?
        会,事务管理的切面将无法拦截"this"调用,从而导致事务失效

六.Redis 集群模式下一个 Master (主节点)挂掉后如何选举?
        当 slave(从节点) 发现自己的 master(主节点) 变为 FAIL(宕机) 状态时,便尝试进行 Failover(即故障切换),以期成为新的 master。由于挂掉的 master 可能会有多个 slave,从而存在多个 slave 竞争成为 master的过程, 其过程如下:
        1.slave发现自己的 master 变为 FAIL(宕机)。
        2.将自己记录的集群 currentEpoch 加 1,并广播 信息
        3.其他节点收到该信息,只有 master 响应,判断请求者的合法性,并发送信息
        4.尝试 failover(故障切换) 的 slave 收集 master 返回的信息
        5.slave 收到超过半数(N/2+1) master 的 ack 后变成新 Master(这里解释了集群为什么至少需要三个主节点,如果只有两个,当其中一个挂了,只剩一个主节点是不能选举成功的)。
        6.slave 广播 消息通知其他集群节点。

从节点并不是在主节点一进入 FAIL 状态就马上尝试发起选举,而是有一定延迟,一定的延迟确保我们等待 FAIL 状态在集群中传播,slave 如果立即尝试选举,其它 masters 或许尚未意识到 FAIL 状态,可能会拒绝投票

七.Redis哨兵模式是什么?它的作用是什么?
        Redis哨兵是用于监控和管理Redis集群的进程。它负责监测Redis节点的健康状态,当主节点发生故障时,自动进行故障转移,选举新的主节点,保证Redis集群的高可用性。

八.在Redis主从复制中,如果主节点宕机,会发生什么情况?
        如果主节点宕机,从节点会进行选举新的主节点,并进行故障转移。被选为主节点的从节点将成为新的主节点,并继续提供读写服务。

九.redis的key的过期原理
       1. 定时任务:Redis 定时任务会定期检查过期的key,删除这些过期的key。

        2.惰性删除:当一个key被访问时,Redis会检查这个key是否过期,如果过期就删除它。

        3.定期删除:在Redis的内存回收策略中,还包括了主动清理内存的策略,即定期执行一个清理过期key的操作。

十.redis实现分布式锁原理、特点
        分布式锁是分布式系统中的关键概念,用于解决多个节点同时访问共享资源可能引发的并发问题。
为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下五个条件:
        1.互斥性:同一时间只能一个节点获取到锁,其他节点需要等待获取到锁的节点释放了锁才可以获取到锁,而这里的等待一般是通过阻塞,和自旋两种方式
        2.安全性:解铃还须系铃人,只能释放自己的锁不能误删别人的锁
        3.死锁:比如在节点宕机时最容易出现锁没被释放的问题,然后出现死锁,所以做锁的过期
        4.容错:当Redis宕机,客户端仍然可以释放锁
        5.可重入:获取锁失败可以重新尝试获取锁

十一.mysql的表锁行锁页锁应用场景
        表锁和行锁是数据库管理系统中用于管理并发控制的两种锁的类型。
表锁:
        表锁特点:快速锁定和释放,简单高效,适合进行大范围的数据更改操作。
        表锁应用场景:适用于全表扫描的操作,如数据导入导出,备份和恢复等。
行锁:
        行锁特点:提供了更好的并发控制,但是需要消耗更多的资源。
        行锁应用场景:适用于需要高并发且数据竞争激烈的环境,如在线事务处理(OLTP)系统。
页锁:
        页锁特点:页是数据库管理存储的基本单位,页锁是在页级别上进行的。
        页锁应用场景:适用于某些数据库,如Oracle,它在某些情况下可以提供更好的性能,尤其是对于大量随机I/O的操作。
        注意:MySQL的存储引擎InnoDB默认使用行锁,并且不支持页锁。

十二.MySQL深分页问题及三种解决方案
        方案一
                我们可以从业务形态维度去解决,限制查询页数,限制全量导出,查询时要求带必要条件(即时间范围、userId等)
        方案二
                使用覆盖索引进行优化,查询时索引列完全包含查询列
        方案三
                使用Id分页,例如,id> 990000 这种查询,但是不适用跳页场景,只适用上一页,下一页的场景

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值