redis面试题汇总(通俗易解版)

参考:图解Redis介绍 | 小林coding (xiaolincoding.com)

目录

Redis的优点?

Redis为什么快?

为什么要用redis作为mysql的缓存?

五种常见redis数据类型:

三种持久化方式:

redis单线程:

分布式锁

分布式锁的实现和四个特性?

AOF日志是如何实现的

redis如何实现服务高可用?

什么是脑裂?

脑裂的解决方案

redis使用的过期删除策略是什么?

redis持久化时,对过期键是如何处理的?

redis主从模式中,对过期键如何处理?

redis内存淘汰机制有哪些?

LRU算法和LFU算法有什么区别

redis缓存雪崩,缓存击穿,缓存穿透

如何设置一个缓存策略,可以动态缓存热点数据呢

说说常见的缓存更新策略?

如何保证缓存和数据库的一致性

Redis如何实现延迟队列

基于Redis实现分布式锁有什么优缺点?

redis如何解决集群情况下分布式锁的可靠性?


Redis的优点?

快,就是快。

Redis基于内存的数据库,对数据的读写都是在内存中完成的,所以它的读写速度非常快,适用于服务器与数据库间的缓存,还可以用来做分布式锁,秒杀,消息队列。

Redis为什么快?

1 因为它是基于内存的数据库,对数据的读写都是在内存中完成的。

2 并采用了高效的数据结构,cpu不是瓶颈,自然采用单线程的解决方案)

这句话多意思就是说,cpu并不是影响redis读写操作速度的因素

其次是它采用的是单线程,相比多线程快,避免了多线程之间等竞争,

省去了多线程切换带来的时间和性能上的开销,也不会导致死锁问题

3 redis采用了I/o多路复用机制处理大量的客户端socket请求,啊啊啊这是神马!

为什么要用redis作为mysql的缓存?

因为redis具备高性能,高并发两种特性

redis具备高性能:

用户第一次访问mysql中的某些数据,这个过程会很慢,因为是从硬盘上读取的。将该用户访问的数据缓存在redis当中,下一次访问的时候就可以直接从缓存中获取了,

操作redis直接就是操作内存,所以速度非常快

redis具备高并发:

补充:直接访问redis能够承受的请求上远远大于直接访问mysql的,把数据库中的部分数据放到redis中,这样一部分请求会直接到缓存里而不用经过数据库

五种常见redis数据类型:

String,Sett,Zset,Hash,Lsit

三种持久化方式:

AOP日志:每执行一条执行操作命令,就把该命令以追加的方式存到文件当中

RDB快照:将某一时刻的内存数据,以二进制的方式写入磁盘

混合持久化:就是集成aop和RDB快照这两种方式的优点

持久化的意思是什么,就是说我们接收客户端写入,第一次读写数据库是MySQL读写的,是在硬盘当中读写的,所以会很慢,然后下一次重启redis的时候之前的数据都消失了,那怎么办呢?就是将这些数据存入redis当中,下一次访问的时候就不用再经过数据库了,直接来到redis里面读写,所以会很快

补充:持久化机制会把数据存储到磁盘,这样在redis重启就能够从磁盘中恢复原有的数据

redis单线程:

redis单线程指的是:当接收到客户端请求后,redis就解析这个请求,并进行数据读写操作,然后发送给客户端

redis是单线程的,但是redis程序不是单线程的。

因为在redis启动的时候,后台线程也启动了,然后把这些线程放到主线程当中处理,就容易造成线程拥塞

关闭文件任务队列:当队列有任务后,后台线程会调用关闭文件任务队列关闭文件

AOF刷盘任务队列:刷盘

lazy_free任务队列:释放

redis采用单线程为什么还这么快?

1 redis大部分操作都是在内存中进行的,所以快

2 redis采用单线程模型可以避免多线程之间的竞争

3 redis采用了i/o多路复用机制

redis6之前还在用单线程,redis6版本之后引入了多线程,但是执行命令的还是单线程,不代表执行的是多线程命令

补充:redis6.0版本引入的多线程i/o特性对性能的提升至少是一倍以上

其次不会出现多线程的那些问题,多线程会比较复杂,还有线程切换,加锁解锁,出现死锁问题等

分布式锁

满足分布式系统或者集群模式下多线程可见并且互斥。

1分布式系统 集群模式

2多线程可见 互斥

四个关键词

分布式锁的实现和四个特性?

可靠性,安全性,对称性,互斥性。

可靠:不管做什么都要考虑它可靠不可靠吧

互斥:就是要保证每一个竞争者都有自己的锁

补充:锁的目的是获取资源的使用权,所以只让一个竞争者持有锁,这一点要保证啊,

安全:能够避免死锁情况发生(我去这里乱套了把对称性的点都写到这来了)

补充:当一个竞争者在持有锁期间,由于意外崩溃-》而导致未能主动解锁,不要慌,其持有的锁也能被正常释放 并保证后续其他竞争者也能加锁

对称性:同一个锁,加锁和解锁都要在同一个竞争者上,不能其他的竞争者释放了锁,

可不可以用一条语句来完成加锁操作

可以。

补充:Redis的set命令有个NX参数可以实现(key不存在才插入),所以可以用它来实现分布式锁

key不存在,则插入成功,加锁成功

key存在,则插入不成功,加锁失败

AOF日志是如何实现的

redis在执行完一条操作命令后,就会把改命令以追加的方式写入一个文件里,然后redis重启时,会读取文件记录的命令,然后逐一执行的命令来进行数据恢复

为什么要先执行命令,然后再把数据写入日志呢

为了避免额外的检查开销

你要是先把命令写入日志再执行,那日志里的命令是对是错都不知道,redis在使用日志恢复数据的时候就容易出错

不会阻塞当前操作命令的执行

那肯定啊,你在那写入日志是不是就会影响了操作命令的执行效率

缺点

数据可能会丢失:执行命令和写入日志是俩进程,你在执行命令的时候还没来得及写入日志,服务器就宕机了。。。

可能会阻塞其他操作的执行,具体是什么操作我也不知道

AOF日志文件

AOF重写工作原理:就是客户端写入两条命令,一条是set name xiaolin,另一条是set name yixiaolin,然后redis执行这两条命令,最后以一条命令set name yixiaolin写入AOF日志文件当中

补充:扫描数据库中所有数据,逐一把内存数据的键值对转换成一条命令,再将命令记录到重写日志

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值