面试题1. 知道redis为什么这么快吗?
- 首先它是基于单线程的模型,保证了每次操作的原子性,同时也减少了线程上下文之间的切换和竞争。
- 然后它的IO是采用了多路复用的IO模型来实现的,
- 然后是他是基于内存数据库来进行存和读取数据的。
- 另外,数据结构也帮了不少忙,Redis全程使用hash结构,读取速度快,还有一些特殊的数据结构,对数据存储进行了优化,如压缩表,对短数据进行压缩存储,再如,跳表,使用有序的数据结构加快读取的速度
- 使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求
面试题2. 说一下Redis的持久化的方式?
AOF的持久化方式:
AOF持久化的原理:
RDB的持久化方式:
- 首先RDB是一种全量式的持久化方式,通过记录某个时间点全部数据的快照,
RDB的持久化的原理是什么怎么实现的(其实就是BGSAVE的原理)
- 首先当你执行了BGSAVE命令之后,redis服务器会先去检查有没有AOF或者是RDB的子进程是不是存在,如果存在的话,就直接返回错误(这个就是防止子进程的竞争)
- 如果不存在的话就继续执行持久化,然后这个时候会去调用底层方法rdbSaveBackground(),然后系统就回去调用fork指令来创建一个进程(其实这里是利用了写时复制的思想也就是Copy-on-Write),下面有解释,其实这个我们不难发现在java中的线程安全的CopyOnWriteArrayList也是利用了这种写时复制的思想。
那么什么时候会触发RDB的持久化呢?
那么RDB的缺点是什么?
面试题3. AOF和RDB之间的优缺点的对比?
面试题4. 如果不想让Redis中的数据在持久话的时候一秒的数据都不丢失怎么办?
面试题5. 说一下Redis中的一致性哈希算法?
什么是一致性hash算法?
- 其实就是对一个2的32次方进行取模,把0 -----2^32方-1围成了一个大的虚拟的圆环,然后再Redis的集群中,为了保证redis的key均匀分布在不同的节点上,就通过这个一致性哈希算法来进行把key给均匀的分散在不同的redis服务器节点上
即使使用一致性哈希算法的话,其实当如果只有少数的服务器节点使用的时候,还是会有一些问题出现,比如数据的倾斜问题?
为了解决上述的那个数据倾斜的问题,在Redis中还是提供了对应的解决方案,使用了虚拟服务器节点,来使节点进行均匀分布: