【Redis】Redis常见面试题总结

目录

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

二、Redis的删除策略

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

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

五、为什么用redis做缓存

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

七、Redis集群

八、Redis的大key问题如何解决


一、谈谈对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也有自动恢复的机制。


八、Redis的大key问题如何解决

首先,redis的大key是指key对应的value过大,对string来说超过10kb就认为为大key,对于set、zset、hash等,数据超过5000条则认为大key。

解决方案:

  • 数据结构优化
    优化 redis 的数据结构,使用合适的数据结构来存储数据,避免出现 redis 大 key 的情况

  • 数据分片
    将大量数据分片存储到多个 key 中,避免单个 key 的数据量过大

  • 压缩数据
    对于存储的大数据,可以采用压缩算法来减少数据的大小,redis支持多种压缩算法,如 LZF、Snappy 等

  • 分布式存储
    将数据分散到多个 redis 实例中,避免单个 redis 实例存储过多数据导致 redis 大 key 的问题

  • 清理过期数据
    及时清理过期数据,避免数据堆积,导致 redis 大 key 的问题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值