Redis——面试题整理
程序员文章站
2022-07-09 18:46:04
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
下一篇: 奶茶可以隔夜喝吗?哪家奶茶好喝?