【大数据开发工程师】面试——Redis
是什么
开源的 key-value 存储系统,noSQL数据库。
redis的优势
数据结构、底层实现及应用场景
-
string:简单地 get / set 缓存。
-
hash:可以缓存kafka偏移量,用户资料。比如命令:hmset user1 name "lin" sex "male" age "25" ,缓存用户 user1 的资料,姓名为 lin ,性别为男,年龄 25。
-
list:可以做队列???。往 list 队列里面 push 数据,然后再 pop 出来。
-
set
-
zset:可以用来做排行榜。
底层实现部分先空。
存储结构
怎么保证数据可靠性?
一个可靠安全的系统,肯定要考虑数据的可靠性,尤其对于内存为主的 Redis ,就要考虑一旦服务器挂掉,启动之后,如何恢复数据的问题,也就是说数据如何持久化的问题。
AOF(Append Of File) 就是备份操作记录。AOF 由于是备份操作命令,备份快、恢复慢。 AOF 的优点:AOF 更好保证数据不会被丢失,最多只丢失一秒内的数据。另外重写操作保证了数据的有效性,即使日志文件过大也会进行重写。AOF 的日志文件的记录可读性非常的高。 AOF 的缺点:对于相同数量的数据集而言, AOF 文件通常要大于 RDB 文件。
RDB (Redis DataBase)就是备份所有数据,使用了快照。RDB 恢复数据比较快,但是最后一次持久化的数据可能会丢失。
问:AOF 文件过大,怎么处理?
会进行 AOF 文件重写。
-
随着 AOF 文件越来越大,里面会有大部分是重复命令或者可以合并的命令。
-
重写的好处:减少 AOF 日志尺寸,减少内存占用,加快数据库恢复时间。
执行一个 AOF 文件重写操作,重写会创建一个当前 AOF 文件的体积优化版本。
事务
先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令。如果想放弃这个事务,可以使用 DISCARD 命令。
问:Redis 事务无法回滚,那怎么处理
问:Redis 的内存回收机制都有哪些?
当前已用内存超过 maxmemory 限定时,会触发主动清理策略,也就是 Redis 的内存回收策略。 LRU 、TTL。 noeviction :默认策略,不会删除任何数据,拒绝所有写入操作并返回客户端错误信息,此时 Redis 只响应读操作。
-
volatitle - lru :根据 LRU 算法删除设置了超时属性的键,知道腾出足够空间为止。如果没有可删除的键对象,回退到 noeviction 策略。
-
allkeys - lru :根据 LRU 算法删除键,不管数据有没有设置超时属性,直到腾出足够空间为止。
-
allkeys - random :随机删除所有键,知道腾出足够空间为止。
-
volatitle - random :随机删除过期键,知道腾出足够空间为止。
-
volatitle - ttl :根据键值对象的 ttl 属性,删除最近将要过期数据。如果没有,回退到 noeviction 策略。
问:手写一下 LRU 算法。
问:讲一下一致性 Hash 算法。
一致性 Hash 算法将整个哈希值空间组织成一个虚拟的圆环, 我们对 key 进行哈希计算,使用哈希后的结果对 2 ^ 32 取模,hash 环上必定有一个点与这个整数对应。依此确定此数据在环上的位置,从此位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器。 一致性 Hash 算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好的容错性和可扩展性。 比如,集群有四个节点 Node A 、B 、C 、D ,增加一台节点 Node X。Node X 的位置在 Node B 到 Node C 直接,那么受到影响的仅仅是 Node B 到 Node X 间的数据,它们要重新落到 Node X 上。 所以一致性哈希算法对于容错性和扩展性有非常好的支持。
问:为什么 Redis Cluster 分片不使用 Redis 一致性 Hash 算法?
一致性哈希算法也有一个严重的问题,就是数据倾斜。 如果在分片的集群中,节点太少,并且分布不均,一致性哈希算法就会出现部分节点数据太多,部分节点数据太少。也就是说无法控制节点存储数据的分配。
问:集群的拓扑结构有没有了解过?集群是怎么连接的?
无中心结构。Redis-Cluster 采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。
redis的搭建模式
- 主从模式:
- 主机数据更新后根据配置和策略,自动同步到备机。
- master以写为主,slaver以读为主。
- 哨兵模式、
- Cluster(集群)模式。
最好是用集群模式。
问:讲一下 Redis 主从复制的过程。
从机发送 SYNC(同步)命令,主机接收后会执行 BGSAVE(异步保存)命令备份数据。
主机备份后,就会向从机发送备份文件。主机之后还会发送缓冲区内的写命令给从机。 当缓冲区命令发送完成后,主机执行一条写命令,就会往从机发送同步写入命令。
问:讲一下 Redis 哨兵机制。
下面是 Redis 官方文档对于哨兵功能的描述:
-
监控(Monitoring):哨兵会不断地检查主节点和从节点是否运作正常。
-
自动故障转移(Automatic Failover):当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点。
-
配置提供者(Configuration Provider):客户端在初始化时,通过连接哨兵来获得当前 Redis 服务的主节点地址。
-
通知(Notification):哨兵可以将故障转移的结果发送给客户端。
问:Redis 的搭建有哪些模式?
主从模式、哨兵模式、Cluster(集群)模式。最好是用集群模式。
问:你用过的 Redis 是多主多从的,还是一主多从的?集群用到了多少节点?用到了多少个哨兵?
集群模式。三主三从。
问:Redis 采用多主多从的集群模式,各个主节点的数据是否一致?
问:Redis 集群有哪些特性
master 和 slaver。主从复制。读写分离。哨兵模式。
问:Redis 是怎么进行水平扩容的? 问:Redis 集群数据分片的原理是什么?
Redis 数据分片原理是哈希槽(hash slot)。
Redis 集群有 16384 个哈希槽。每一个 Redis 集群中的节点都承担一个哈希槽的子集。
哈希槽让在集群中添加和移除节点非常容易。例如,如果我想添加一个新节点 D ,我需要从节点 A 、B、C 移动一些哈希槽到节点 D。同样地,如果我想从集群中移除节点 A ,我只需要移动 A 的哈希槽到 B 和 C。当节点 A 变成空的以后,我就可以从集群中彻底删除它。因为从一个节点向另一个节点移动哈希槽并不需要停止操作,所以添加和移除节点,或者改变节点持有的哈希槽百分比,都不需要任何停机时间(downtime)。
过期机制
问:怎么设置 Redis 的 key 过期时间?
key 的的过期时间通过 EXPIRE key seconds 命令来设置数据的过期时间。返回 1 表明设置成功,返回 0 表明 key 不存在或者不能成功设置过期时间。
问:Redis 的过期策略有哪些?
惰性删除:当读/写一个已经过期的 key 时,会触发惰性删除策略,直接删除掉这个过期 key ,并按照 key 不存在去处理。惰性删除,对内存不太好,已经过期的 key 会占用太多的内存。
定期删除:每隔一段时间,就会对 Redis 进行检查,主动删除一批已过期的 key。
问:为什么 Redis 不使用定时删除?
定时删除,就是在设置 key 的过期时间的同时,创建一个定时器,让定时器在过期时间来临时,立即执行对 key 的删除操作。 定时删会占用 CPU ,影响服务器的响应时间和性能。