面试系列之缓存篇

Redis有哪些数据类型?

五大数据类型:string、hash、list、set、sorted set

 

Redis主从复制的过程?

  • slave与master建立连接,发送sync同步命令

  • master会开启一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存

  • 后台完成保存后,将文件发送给slave

  • slave将此文件保存到硬盘上,并载入数据库

 

Redis主节点宕机了怎么办,还有没有同步的数据怎么办?

为了避免主节点宕机带来的数据丢失,所以主节点也需要实现高可用,一般在集群中应当避免主节点单点问题;尽量搭建多主多从的集群模式

 

聊聊Redis缓存穿透,缓存雪崩和缓存击穿?

  • 缓存穿透:指的是当查询一个不存在的key时或者数据库根本不存在的数据时,因为Redis缓存当Key不命中时就会去请求DB查询数据,所有当一个不存在的Key被访问时,每次都会去请求直接请求DB,这就叫缓存穿透;

  • 缓存雪崩:当key的失效时间集中在某一时刻,就会造成大量的缓存穿透,而此时压力就会全部落到数据库上,可能导致数据库无法承受,造成整个应用服务崩溃,这种情况就叫缓存雪崩,大量缓存穿透会导致缓存雪崩;

  • 缓存击穿:指对于某些热点key数据(即经常被大量访问的key),如果在某个时间点该key缓存失效了,则造成大量的访问直接落向DB,可能直接将DB击垮,这种现象就叫缓存击穿;

三者的区别:缓存穿透是指访问一个一定不存在的数据,缓存雪崩指的是对于多个key,不一定是热点数据缓存集中失效时造成的DB宕机,缓存击穿和缓存雪崩有点像,但是不同的是缓存击穿针对的是某些热点key,缓存击穿和缓存穿透都将导致缓存雪崩

 

如何使用Redis来实现分布式锁?

  • 获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的value值为一个随机生成的UUID,用于释放锁的时候进行判断。

  • 获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。

  • 释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放

 

Redis的缓存失效策略?

惰性删除+定期删除

惰性删除:在进行get或者setnx等操作时,先检查key是否过期,如果过期则删除key,然后执行相应操作,如果没有过期则执行相应操作;

定期删除(简单而言,对指定个数个库的每一个库随机删除小于等于指定个数个过期key):遍历每个数据库(就是redis.conf中配置的"database"数量,默认为16),检查当前库中的指定个数个key(默认是每个库检查20个key,注意相当于该循环执行20次,循环体时下边的描述),如果当前库中没有一个key设置了过期时间,直接执行下一个库的遍历,随机获取一个设置了过期时间的key,检查该key是否过期,如果过期,删除key,判断定期删除操作是否已经达到指定时长,若已经达到,直接退出定期删除;

 

Redis是单线程还是多线程的?

单线程,redis的瓶颈并不是CPU而是机器内存或者网络带宽,既然不是CPU不是瓶颈,单线程又容易实现,所以Redis采用单线程的方案了;

Redis操作是不是原子性的?

由于Redis都是单线程处理每个任务,所以很显然是原子性的;

 

Redis有没有事务?事务操作中又是如何保证原子操作?

Redis有一个弱事务处理,本质上是一个批处理,命令multi开启事务,然后每个命令请求会被放入一个队列,当执行exec时,进行批量提交,批处理也是从队列一个个按顺序执行,而且是一起成功或者一起失败,也是原子性操作;

 

Redis的跳跃表有了解吗?

跳跃表skiplist:是一种有序的数据结构, 它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的;

Redis使用跳跃表来作为有序集合键的底层实现,Redis中跳跃表仅仅在有序结合这里和集群中作为节点内部数据结构使用,其他地方都没有用到;

 

Redis的发布订阅有熟悉吗?

发布者将消息发布发布到channel频道上,所有订阅了channel频道的客户端都会接收到消息,这是一种广播的消息模式;

 

Redis持久化知道怎么做吗?

2种方式:RDB(生成快照)和AOF(日志追加)

RDB:Redis在内存中的数据库记录定时dump到磁盘上,生成一个RDB文件;rdb每隔一段时间记录备份一次数据库数据,所以会存在数据丢失的情况;

AOF:AOF是一种以日志的形式记录redis服务器所处理的每一个写和删除命令,查询不会记录,整个过程会将Reids的操作日志以追加的方式写入aof文件;aof每个写命令都会被记录下来,并且同步写到aof文件,所以运行效率比较低,更何况redis还是单线程的,会造成redis停顿;

RDB是通过配置文件配置持久化策略,每隔N秒操作M次就进行持久化;

AOF是三种策略模式,每隔一秒持久化一次,每发生一个写命令持久化一次和用不持久化;

 

Redis如何实现高可用?

主从复制、哨兵,集群

主从复制过程

  • slave与master建立连接,发送sync同步命令;

  • master会开启一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存;

  • 后台完成保存后,将文件发送给slave;

  • slave将此文件保存到硬盘上

哨兵:相当于一个站岗放哨的士兵,他能监测主服务器和从服务器的状态,当主服务器宕机时,他会从该主对应的从服务器列表中,通过投票选举机制完成新主服务器的选举工作,当新的主服务器产生之后,之前的从服务器就重新认主,相当于找到了新的老大,然后之前宕机的主服务器恢复启动之后,也会被归为新主服务器的从服务器;

集群:3.0版本之后正式支持集群,3.0之前高可用都只能使用哨兵来搭建

  • 节点:Redis集群中一个个独立的Redis服务器,他们之间独立部署通过集群产生关联,节点又分为主节点和从节点,每个从节点与自己的主节点关联,多个主节点之间又相互关联组成集群;

  • 槽(slot):Redis集群通过分片的方式来保存缓存数据库中的键值对,集群的整个数据库被分为16384个槽,每个key对应其中的一个槽,集群中的每个节点可以处理0个或者最多16384个槽;

  • 集群状态:当每个槽都被分配完毕,集群就处于上线状态,否则就处于下线状态;

  • 重新分片:当集群中新增主节点时,集群就会进行重新分片,将槽重新划分,并且槽所对应的数据也一起划分,该操作可以在线进行,集群不需要下线,而且在这个过程中,每个节点还能继续处理客户端的请求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值