一.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.可重入:获取锁失败可以重新尝试获取锁