• 【Redis】Redis常见面试题总结


    目录

    一、谈谈对Redis 的持久化的理解

    二、Redis的删除策略

    三、当数据进入redis内存不足时,将会进行逐出算法

    四、谈谈缓存雪崩、缓存穿透、缓存击穿以及其解决方案

    五、为什么用redis做缓存

    六、分析一下Redis为什么支持那么高的QPS

    七、Redis集群


    一、谈谈对Redis 的持久化的理解

    首先redis的持久化分为两种RDBAOF

            RDB的话他是基于快照的方式来存储的,将数据直接存储在物理磁盘中

    他的优点存储效率高、恢复速度快、占用空间小缺点版本不兼容、并且无法做到实时存储容易丢失数据

            而AOF则是通过AOF重写最终结果数据转换为对应的命令来进行命令存储,通过执行指令来恢复数据。AOF可以通过每秒每次、或者由操作系统来决定redis持久化。

    他的优点是可以最快每秒进行一次持久化保存的数据更完整不容易丢失消耗资源少缺点占用内存大恢复速度慢

            在redis 4.0后还有一个RDB+AOF的混合持久化,结合了RDB和AOF的优点在写入时先把数据以RDB的形式写入文件的开头,再将后续的操作以AOF的格式存储,这样既保证了Redis重启的速度,又能减低数据丢失的风险。

    缺点是实现复杂度高可读性差兼容性差(如果使用混合持久化,则只能用于redis 4.0以上版本)。


    二、Redis的删除策略

    Redis是一种内存级数据库,所有的数据都存放在内容中,内存中的数据可以通过TTL指令来获取其状态

    Redis的删除策略一共分为三种:

    定时删除:是创建一个定时器,当key的过期时间到达后,会立即删除执行删除操作。

    优点是能够很快的删除掉过期数据,不会再占用空间。

    缺点对cpu的压力很大,无论此时cpu负载多高,都会立即执行删除操作,占用cpu,会影响响应时间和指令的吞吐量。

    惰性删除:是指当访问到这个数据时,发现该数据已经过期,才会去执行删除操作。

    优点是cpu没有什么压力,节约cpu性能

    缺点是如果长时间没有访问过期数据的话,就会占用很多空间

    定时删除:是周期性的采用随机收取的策略对数据进行检查,如果过期则删除。


    三、当数据进入redis内存不足时,将会进行逐出算法

    逐出算法的删除策略一共有 8种

    检查易失数据

           挑选最近使用时间最少的数据淘汰

           挑选最近使用次数最少的数据淘汰

           挑选即将过期的数据淘汰

           任意选择数据淘汰

    检查所有数据

           挑选最近使用时间最少的数据淘汰

           挑选最近使用次数最少的数据淘汰

           任意选择数据淘汰

    放弃驱逐数据

           放弃驱逐数据


    四、谈谈缓存雪崩、缓存穿透、缓存击穿以及其解决方案

    缓存雪崩是指在同一时间有大量缓存过期或者服务器宕机,导致大量请求都传至去数据库中。

    解决方案

            给不同key的TTL值添加随机值

            使用多级缓存

            使用redis集群

            使用流量限流策略

    缓存穿透是指某一个高并发的缓存过期了,导致同一时间大量请求访问数据库。

    解决方案

            使用互斥锁,就是当一个请求访问缓存时发现缓存过期了,这是会获取一个互斥锁,然后去访问数据库,获取数据并将数据存放缓存中,释放锁,在这个期间其他请求就会获取锁失败,进行休眠一会,重新请求,直到获取到数据为止。

            使用逻辑过期方案,就是在请求到数据发现失效了,则获取互斥锁,然后创建一个新线程,并返回过期数据,而新线程则去访问数据库,并将数据存储到缓存中,释放锁。在这期间如果有其他线程访问时,获取锁失败,则直接返回过期数据。

    缓存击穿是指客户端的请求在缓存没有找到数据,在数据库中也没有找到数据,最终这些请求都会到数据库中。

    解决方案

            返回空对象就是哪怕这个数据不存在,也会将他存在缓存中,到时候再有请求就会返回一个空对象。

            布隆过滤器是一个基于哈希冲突的思想来判断这个数据是否存在,如果判断不存在,直接拒绝这个请求,如果存在,则进入缓存中找,没有进入数据库中找,并存入缓存。


    五、为什么用redis做缓存

    因为redis的读取速度很快,他是直接存储在内存中的,相对于传统数据库,redis的读取速度可以提高几十倍甚至上百倍。

    而且redis支持持久化便于数据的备份、恢复。

    支持事务,操作满足原子性。

    并且缓存有过期机制。


    六、分析一下Redis为什么支持那么高的QPS

    高效的数据结构:String、Hash、Set、List、ZSet,并且大部分操作都在内存中完成。

    多路复用IO模型:是指一个线程处理多个IO流,它是指将所有建立成功的连接陆续放入event_poll,event_poll会为这些长连接进行注册回调函数,当某一个长连接准备就绪后(建立连接成功、数据读取完成),就会通过回调函数写入event_poll的就绪队列rdlist,这样这个单线程就可以通过rdlist获取需要的数据。


    七、Redis集群

    redis集群其实就是将原来的单服务器变为多服务器,这样即使有一台服务器出问题了,其他服务器还会有备份数据,redis集群一共有三个运行方案:

    主从同步

            这是多机运行中最基础的一个,就是把主要存储数据的节点叫做主节点,把其他复制主节点的副本节点叫做从节点。类似于树状结构。

    哨兵模式

            因为主从同步有一个致命问题,就是如果主节点奔溃了,则需要人工干预才能恢复redis的正常使用,所有需要有一个自动的工具,Redis Sentinel(哨兵模式)来把手动过程变成自动的,让reids有自动恢复的能力。

    Redis Cluster

            Redis ClusterRedis 3.0版本推出的集群方案,他是将数据分布在不同的服务区上,以此来降低对单主节点的依赖,就是可以有多个主节点,每个主节点也能有多个从节点,各个主节点不相互依赖,并且Redis Cluster也有自动恢复的机制。

    q注:本篇文章都是我自己的理解,可能用词和语句不够严谨,如有错误请评论指正,谢谢!(持续更新中......)

  • 相关阅读:
    【LeetCode】50. Pow(x, n)
    三位大咖的「研发效能」实战笔记|大师课精华全回顾
    ros话题通信-自定义msg
    codeforces 1635E-Cars (二分图染色+拓扑排序)
    APICloud可视化编程(二)
    Goland快捷键整理
    盘点JDK中基于CAS实现的原子类
    MySQL高级-SQL优化-insert优化-批量插入-手动提交事务-主键顺序插入
    yml避坑,yml配置使用map,如果key中包含某些符号会消失不见
    解决“distribution shift”的问题
  • 原文地址:https://blog.csdn.net/c1390527393/article/details/133250912