redis面试八股文
1.redis中rehash操作
hashmap中的rehash操作:当添加一个元素,达到了阈值,启动rehash操作,直接申请一个大于原先旧数组俩倍大小的新数组。比如原先是4,则申请8;原先是7,则申请16 。必须是2的整数次幂。
然后遍历原先旧数组,重新在新数组计算一下hash。存在的问题就是,在rehash的时候此时是不能进行新的操作的,会变成阻塞状态,如果需要迁移的数据量大,则很容易变得不可用。
redis中采用的rehash操作是渐进式的。redis底层维护俩个数组ht[0],ht[1];rehashiidx 等于-1,表示未进行rehash操作,否则表示正在进行rehash操作。在 每次crud的时候,会把rehashidx指向的索引上面的所有元素都重新计算hash然后迁移到新数组,直到原数组的元素全部迁移完成,交换俩个数组的指针,数组2号置为null。
2.redis的持久化策略
aof和rdb
aof是记录命令的方式,命令执行完然后增量的方式写日志,如果最后记录的文件大会存在重写的方式,把几条日志合并到一起。
三种写回策略:(一般使用2,秒级丢失)
-
always,同步写回,每个子命令执行完,都立即将日志写回磁盘。
-
everysec,每个命令执行完,只是先把日志写到AOF内存缓冲区,每隔一秒同步到磁盘。
- no:只是先把日志写到AOF内存缓冲区,有操作系统去决定何时写入磁盘。
rdb是快照的方式,保存当前时刻数据库中的数据。优点是宕机后能快速恢复,但是是分钟级的数据丢失。
使用save和bgsave命令,前者是同步的,会阻塞当前线程;后者是异步的,重新fork一个新线程执行操作。