本文主要是介绍Reids必背面试题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
说说什么是Redis?
Redis是—种基于键值对(key-value)的NoSQL数据库。
比一般键值对数据库强大的地方,Redis中的value支持string (字符串)、hash (哈希)、 list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、GEO(地理信息定位)等多种数据结构,因此Redis可以满足很多的应用场景。
而且因为Redis会将所有数据都存放在内存中,所以它的读写性能非常出色。
不仅如此,Redis还可以将内存的数据利用快照和日志的形式保存到硬盘上,这样在发生类似断电或者机器故障的时候,内存中的数据不会“丢失”。
Redis可以用来干什么?
-
缓存这是Redis应用最广泛地方,基本所有的Web应用都会使用Redis作为缓存,来降低数据库压力,提高响应速度
-
计数器 Redis天然支持计数功能,而且计数性能非常好,可以用来记录浏览量、点赞量等等
-
排行榜 Redis提供了列表和有序集合数据结构,合理地使用这些数据结构可以很方便地构建各种排行榜系统。
-
社交网络 赞/踩、粉丝、共同好友/喜好。
-
消息队列 Redis提供了发布订阅功能和阻塞队列的功能,可以满足一般消息队列功能。
-
分布式锁 分布式环境下,利用Redis实现分布式锁,也是Redis常见的应用。
Redis为什么快呢?
Redis的速度非常的快,单机的Redis就可以支撑每秒10万的并发,相对于MySQL来说,性能是MySQL的几十倍。速度快的原因主要有几点:
-
完全基于内存操作
-
使用单线程,避免了线程切换和竞态产生的消耗
-
基于非阻塞的IO多路复用机制
-
C语言实现,优化过的数据结构,基于几种基础的数据结构,redis做了大量的优化,性能极高
Redis6.0使用多线程是怎么回事?
Redis6.0的多线程是用多线程来处理数据的读写和协议解析,但是Redis执行命令还是单线程的 , 这样做的⽬的是因为Redis的性能瓶颈在于⽹络IO⽽⾮CPU,使⽤多线程能提升IO读写的效率,从⽽整体提⾼Redis的性能。
Redis持久化方式有哪些?有什么区别?
RDB:
RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发。 RDB文件是一个压缩的二进制文件,通过它可以还原某个时刻数据库的状态。由于RDB文件是保存在硬盘上的,所以即使Redis崩溃或者退出,只要RDB文件存在,就可以用它来恢复还原数据库的状态。手动触发分别对应save和bgsave命令
AOF
AOF(append only file) 持久化: 以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式。
RDB 和 AOF 各自有什么优缺点?
RDB: 恢复速度快,适合全量备份恢复,丢失数据多,兼容性差
AOF:丢失数据少(甚至可以不丢失),恢复数据慢
RDB和AOF如何选择?
-
一般来说,如果想达到足以媲美数据库的 数据安全性,应该 同时使用两种持久化功能。在这种情况下,当 Redis 重启的时候会优先载入 AOF 文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比 RDB 文件保存的数据集要完整。
-
如果 可以接受数分钟以内的数据丢失,那么可以 只使用 RDB 持久化
-
有很多用户都只使用 AOF 持久化,但并不推荐这种方式,因为定时生成 RDB 快照(snapshot) 非常便于进行数据备份,并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快,除此之外,使用 RDB 还可以避免 AOF 程序的 bug。
-
如果只需要数据在服务器运行的时候存在,也可以不使用任何持久化方式。
Redis的数据恢复?
-
当Redis发生了故障,可以从RDB或者AOF中恢复数据
-
恢复的过程也很简单,把RDB或者AOF文件拷贝到Redis的数据目录下,如果使用AOF恢复,配置文件开启AOF,然后启动redis-server即可
-
AOF持久化开启且存在AOF文件时,优先加载AOF文件
-
AOF关闭或者AOF文件不存在时,加载RDB文件。
-
加载AOF/RDB文件成功后,Redis启动成功。
-
AOF/RDB文件存在错误时,Redis启动失败并打印错误信息
Redis分布式会话的解决
<span style="background-color:#f8f8f8"><span style="color:#333333"> <span style="color:#116644">1</span><span style="color:#000000">、session</span> <span style="color:#000000">复制,也就是当一个服务器有新的session保存的时候,通过服务器通信机制,然后将session复制到其他的服务器,如果服务器较多的话,会存在大量的网路和io占用,效率低下。</span>
<span style="color:#116644">2</span><span style="color:#000000">、redis实现session共享。</span></span></span>
如何保持数据的一致性
延时双删策略
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#116644">1.</span><span style="color:#000000">先删除redis,再更新数据库,延迟N秒后再删除一次redis。</span>
<span style="color:#116644">2.</span><span style="color:#000000">上述中(延迟N秒)的时间一定要大于请求2将数据库旧数据写入redis的时间;</span>
<span style="color:#116644">3.</span><span style="color:#000000">如果延迟时间小于请求2写入redis的时间,会导致请求1清除缓存的时机过早,请求2又会将旧的数据写入redis的尴尬</span></span></span>
主从复制了解吗?
主从复制,是指将一台 Redis 服务器的数据,复制到其他的 Redis 服务器。前者称为主节点(master),后者称为 从节点(slave)。且数据的复制是单向的,只能由主节点到从节点。Redis 主从复制支持 主从同步 和 从从同步 两种,后者是 Redis 后续版本新增的功能,以减轻主节点的同步负担。
Redis的主从复制原理了解吗?
-
slave从节点保存主节点(master) 信息 这一步只是保存主节点信息,保存主节点的ip和port。
-
从节点(slave) 发现新的主节点后,会尝试和主节点建立网络连接
-
发送ping命令 连接建立成功后从节点发送ping请求进行首次通信,主要是检测主从之间网络套接字是否可用、主节点当前是否可接受处理命令。
-
权限验证 如果主节点要求密码验证,从节点必须正确的密码才能通过验证.
-
同步数据集 主从复制连接正常通信后,主节点会把持有的数据全部发送给从节点。
-
命令持续复制 接下来主节点会持续地把写命令发送给从节点,保证主从数据一致性
-
初次复制场景使用全量复制 ,Redis早期支持的复制功能只有全量复制,它会把主节点全部数据一次性发送给从节点,当数据量较大时,会对主从节点和网络造成很大的开销。
-
部分复制主要是Redis针对全量复制的过高开销做出的一种优化措施,当从节点 (slave) 正在复制主节点 (master) 时,如果出现网络闪断或者命令丢失等异常情况时,从节点会向 主节点要求补发丢失的命令数据,如果主节点的复制积压缓冲区内存在这部分数据则直接发送给从节点,这样就可以保持主从节点复制的-致性。
Redis Sentinel(哨兵)了解吗?
Redis Sentinel ,它由两部分组成,哨兵节点和数据节点:
-
哨兵节点: 哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的 Redis 节点,不存储数据,对数据节点进行监控。
-
数据节点: 主节点和从节点都是数据节点
在复制的基础上,哨兵实现了 自动化的故障恢复 功能,,下面是官方对于哨兵功能的描述:
-
监控(Monitoring): 哨兵会不断地检查主节点和从节点是否运作正常。
-
自动故障转移(Automatic failover) : 当主节点不能正常工作时,哨兵会开始 自动故障转移操作,它会将失效主节点的其中一个 从节点开级为新的主节点,并让其他从节点改为复制新的主节点。
-
配置提供者 (Configuration provider) : 客户端在初始化时,通过连接哨兵来获得当前 Redis 服务的主节点地址。
-
通知(Notification) : 哨兵可以将故障转移的结果发送给客户端。其中,监控和自动故障转移功能,使得哨兵可以及时发现主节点故障并完成转移。而配置提供者和通知功能,则需要在与客户端的交互中才能体现
领导者Sentinel节点选举了解吗?
Redis使用了Raft算法实 现领导者选举,大致流程如下:
-
每个在线的Sentinel节点都有资格成为领导者,当它确认主节点主观下线时候,会向其他Sentinel节点发送sentinel is-master-down-by-addr命令,要求将自己设置为领导者。
-
收到命令的Sentinel节点,如果没有同意过其他Sentinel节点的sentinel is-master-down-by-addr命令,将同意该请求,否则拒绝。
-
如果该Sentinel节点发现自己的票数已经大于等于quorum,num(sentinels) /2+1),那么它将成为领导者。
-
如果此过程没有选举出领导者,将进入下一次选举
新的主节点是怎样被挑选出来的?
1.过滤:“不健康” (主观下线、断线)、5秒内没有回复过Sentinel节 点ping响应、与主节点失联超过down-after-milliseconds*10秒。 2.选择slave-priority (从节点优先级)最高的从节点列表,如果存在则返回,不存在则继续.
3.选择复制偏移量最大的从节点(复制的最完整),如果存在则返 回,不存在则继续
4.选择runid最小的从节点。
什么是缓存击穿、缓存穿透、缓存雪崩
缓存穿透:
-
发生:客户端请求的数据,在数据库和redis中都不存在,这样缓存永远都不会生效,请求最终都到了数据库上。
-
解决:
-
当在数据库查询的结果也不存在的时候,可以返回null值给redis,并且设置TTL
-
布隆过滤器
-
缓存击穿:
-
发生:也叫热点key问题,一个被高并发访问且业务复杂的key突然失效了,无数的请求瞬间给数据库带来的巨大冲击
-
解决:
-
互斥锁
-
缓存雪崩:
-
发生:同一时间段内,大量的缓存key失效或者redis宕机,到时大量的请求到达数据库,带来巨大的压力。
-
解决:
-
给key设置随机的TTL
-
集群方案防止宕机不可用
-
能说说布隆过滤器吗?
布隆过滤器,它是一个连续的数据结构,每个存储位存都是一个 bit ,即 0或者 1,来标识数据是否存在。 存储数据的时时候,使用n个不同的哈希函数将这个变量映射为bit列表的的n个点,把它们置为1
我们判断缓存key是否存在,同样,n个哈希函数,映射到bit列表上的n个点,判断是不是1: 如果全不是1,那么key不存在; 如果都是1,也只是表示key可能存在
-
布隆过滤器也有一些缺点: 1.它在判断元素是否在集合中时是有一定错误几率,因为哈希算法只有一定的碰撞的概率
2.不支持删除元素。
如何保证缓存和数据库数据的⼀致性?
延时双删策略
缓存预热怎么做呢?
所谓缓存预热,就是提前把数据库里的数据刷到缓存里,通常有这些方法:
-
直接写个缓存刷新页面或者接口,上线时手动操作
-
数据量不大,可以在项目启动的时候自动进行加载。
-
定时任务刷新缓存。
Redis支持事务吗?
-
Redis提供了简单的事务,但它对事务ACID的支持并不完
-
multi命令代表事务开始,exec命令代表事务结束,它们之间的命令是原子顺序执行的:
-
Redis事务的原理,是所有的指令在 exec 之前不执行,而是缓存在 服务器的一个事务队列中服务器一旦收到 exec 指令,才开执行整个事务队列,执行完毕后一次性返回所有指令的运行结果。
-
因为Redis执行命令是单线程的,所以这组命令顺序执行,而且不会被其它线程打断。
-
Redis 的事务不支持回滚。
这篇关于Reids必背面试题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!