欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Redis——面试题整理

程序员文章站 2022-03-26 15:01:00
1. Redis的优缺点优点:具有优异的读写性能,读写速度分别为110000次/s和81000次/s。支持数据的持久化(AOF和RDB两种方式。支持事务,Redis不仅所有操作都是原子性,而且支持对几个操作合并后的原子性执行。数据结构丰富,String、hash、set、zset、list等数据结构。支持主从复制,可读写分离。缺点:数据库容量受到物理内存的限制,不能用作海量数据的高性能读写。并且难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。所以应用场景被局限于较小数据量...

1. Redis的优缺点

  • 优点:
    • 具有优异的读写性能,读写速度分别为110000次/s和81000次/s。
    • 支持数据的持久化(AOF和RDB两种方式。
    • 支持事务,Redis不仅所有操作都是原子性,而且支持对几个操作合并后的原子性执行。
    • 数据结构丰富,String、hash、set、zset、list等数据结构。
    • 支持主从复制,可读写分离。
  • 缺点:
    • 数据库容量受到物理内存的限制,不能用作海量数据的高性能读写。并且难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。所以应用场景被局限于较小数据量的高性能操作和运算上。
    • 不具备自动容错和恢复功能,主机或从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。若是主机宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。

2. 为什么要用Redis(缓存)

  • 高性能,用户首次访问数据库时,数据从硬盘中读取,速度较慢。将该数据放置于缓存中,用户再次访问该数据时,可直接从缓存中获取,操作缓存相当于操作内存,速度比从硬盘中读取更快。
  • 高并发,直接操作缓存能够承受的请求是远远大于直接访问数据库的。故将数据库中的部分数据转移到缓存中去,用户的一部分请求则会直接到缓存而不经过数据库,能够更好的实现高并发。

3. Redis为什么那么快

  • 完全基于内存,大部分请求是纯粹的内存操作,数据在内存中进行查找和操作的时间复杂度均为O(1)。
  • 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU。
  • 使用多路 I/O 复用模型,非阻塞 IO。
  • 使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis 直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;
  • 数据结构简单,对数据操作也简单。

4. 什么是Redis持久化?Redis 的持久化机制是什么?各自的优缺点?

  • 持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。

  • Redis 有两种持久化机制 RDB(默认) 和 AOF 机制。

    • RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。
    • AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。
    • 特别的,当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。
  • RDB的优缺点
    优点:

    • 只有一个文件 dump.rdb,方便持久化。
    • 容灾性好,一个文件可以保存到安全的磁盘。
    • 性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能
    • 相对于数据集大时,比 AOF 的启动效率更高。

    缺点:

    • 数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化期间 redis 发生故障,会发生数据丢失。
  • AOF优缺点
    优点:

    • 数据安全,aof 持久化可以配置 appendfsync 属性,有 always,每进行一次 命令操作就记录到 aof 文件中一次。
    • 通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题。
    • AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令 进行合并重写),可以删除其中的某些命令(比如误操作的 flushall))

    缺点:

    • AOF 文件比 RDB 文件大,且恢复速度慢。
    • 数据集大的时候,比 rdb 启动效率低。

5. Redis的过期键的删除策略是什么

  • 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
  • 定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
  • 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。

6. 为什么Redis要分区?分区方案有什么?

  • 分区可以让Redis管理更大的内存,Redis将可以使用所有机器的内存。如果没有分区,你最多只能使用一台机器的内存。分区使Redis的计算能力通过简单地增加计算机得到成倍提升,Redis的网络带宽也会随着计算机和网卡的增加而成倍增长。
  • 分区方案通常有三种:客户端分区、代理分区和查询路由。
    • 客户端分区就是在客户端就已经决定数据会被存储到哪个redis节点或者从哪个redis节点读取。大多数客户端已经实现了客户端分区。
    • 代理分区 意味着客户端将请求发送给代理,然后代理决定去哪个节点写数据或者读数据。代理根据分区规则决定请求哪些Redis实例,然后根据Redis的响应结果返回给客户端。redis和memcached的一种代理实现就是Twemproxy
    • 查询路由(Query routing) 的意思是客户端随机地请求任意一个redis实例,然后由Redis将请求转发给正确的Redis节点。Redis Cluster实现了一种混合形式的查询路由,但并不是直接将请求从一个redis节点转发到另一个redis节点,而是在客户端的帮助下直接redirected到正确的redis节点。

7. Redis常见性能问题和解决方案?

  • Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务。
  • Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。
  • Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。
  • Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内,主从复制不要用图状结构,用单向链表结构更稳定,即主从关系为:Master<–Slave1<–Slave2<–Slave3…,这样的结构也方便解决单点故障问题,实现Slave对Master的替换。
  • 尽量避免在压力很大的主库上增加从库

本文地址:https://blog.csdn.net/qq_43570075/article/details/107579488

相关标签: redis

上一篇: 2020-09-29

下一篇: 程序的开发流程