Redis面试
Redis数据类型
Redis持久化方式
RDB和AOF
RDB 机制是以指定的时间间隔将 Redis 中的数据生成快照并保存到硬盘中,它更适合于定时备份数据的应用场景。可以通过手动或者自动的方式来触发 RDB 机制。
手动触发命令:
save:save命令会阻塞当前redis服务,直到redis备份完成,在此期间所以查询命令都会被阻塞。
bgsave,fork出一个子线程,阻塞只会发生在fork阶段,之后的操作由子线程来完成。
自动触发条件:
Redis内存淘汰策略
内存淘汰策略发生在redis内存占满的情况下
Redis中共有下面八种内存淘汰策略:
volatile-lru:设置了过期时间的key使用LRU算法淘汰
allkeys-lru:所有key使用LRU算法淘汰
volatile-lfu:设置了过期时间的key使用LFU算法淘汰
allkeys-lfu:所有key使用LFU算法淘汰
volatile-random:设置了过期时间的key使用随机淘汰
allkeys-random:所有key使用随机淘汰
volatile-ttl:设置了过期时间的key根据过期时间淘汰,越早过期越早淘汰
noeviction:默认策略,当内存达到设置的最大值时,所有申请内存的操作都会报错,只读操作如get命令可以正常执行。
过期删除策略
对过期key进行回收
惰性删除:当key被访问时,检查改key的过期时间,若已过期则删除,已过期未被访问的数据仍保持在内存中,消耗内存资源。
定期删除:每隔一段时间,随机检查设置了过期时间的key并删除已过期的key,维护定时器消耗cpu资源。
AOF和RDB的过期删除策略
前面介绍了Redis的持久化策略RDB和AOF,当Redis中的key已过期未删除时,如果进行RDB和AOF的持久化操作时候会怎么操作呢?
在RDB持久化模式中我们可以使用save和bgsave命令进行数据持久化操作
在AOF持久化模式中使用rewriteaof和bgrewriteaof命令进行持久化操作
这四个命令都不会将过期key持久化到RDB文件或AOF文件中,可以保证重启服务时不会将过期key载入Redis。
为了保证一致性,在AOF持久化模式中,当key过期时候,会同时发送DEL命令给AOF文件和所有节点;
从节点不会主动的删除过期key除非它升级为主节点或收到主节点发来的DEL命令;
Redis有哪些集群模式?
1.主从复制模式
主从模式包括一个主节点和多个从节点
主节点负责处理读写操作,并将数据同步到从节点
从节点负责处理读操作,并复制主节点的数据
当主节点出现问题时可以通过故障转移将某个从节点切换为主节点。
主从复制模式适用于读多写少场景。主从模式的缺点在于无法自动进行故障转移、容错和恢复,需要人工手动介入。
2.哨兵模式
哨兵模式是在主从模式的基础上加上了哨兵节点,用于监控主节点和从节点的状态并针对异常情况进行自动故障转移、快速恢复
3.集群模式 Redis Cluster
集群模式是将数据自动分片到各个节点,每个节点负责一部分数据,每个节点可以有多个副本,支持动态扩展和自动伸缩。
Redis的数据分片是将数据集分割成多个部分,存放到集群中不同节点,提升redis的性能和扩展性。具体是通过将数据按照某种规则(key的hash)分配到不同的节点上,当客户端想要访问某个key时,会先计算key应该存储在哪个节点上,然后直接连接到节点进行操作。
redis集群模式使用哈希槽(hash slot)的方式来进行数据分片,每个槽分配给一个节点,客户端访问数据时,先根据key计算所对应的槽,然后连接到对应的节点进行操作。redis集群将数据集分割为16384个槽,每个槽都有一个编号(0-16383),redis每个节点可以分配多个槽。
reids适用自己设计的一种文本协议进行通信RESP,这张协议简单高效,基于tcp协议。
redis为什么快?
基于内存、单线程模型、多路复用I/O模型、高效的数据结构,多线程处理网络请求