Redis高频面试题及答案(肝一天的总结)

Redis面试题汇总

  • Redis语法

  1. redis支持的数据结构?

       答:支持字符串、哈希、list、set、soredset等数据结构

      2.redis如何实现string,这样实现有什么好处?

      答:摘选自《Redis的设计与实现》

Redis高频面试题及答案(肝一天的总结)_第1张图片

 

好处:(1)可以常数复杂度获取字符串长度

(2)杜绝缓冲区溢出

(3)减少修改字符串时,带来的内存分配次数

   3.redis的hash怎么实现的?rehash过程讲一下;

答:如图所示,index就是索引位置

 

Rehash过程:哈希结构如图所示

Redis高频面试题及答案(肝一天的总结)_第2张图片

 

(1)为ht[1]分配空间:空间大小如下:

     <1>若是扩展大小:分配大小=(第一个大于等于ht[0]*used*2)的2的n次方的数;<2>若是缩小大小:分配大小=(第一个大于等于ht[0]*used)的 2的n次方的数;

(2)将ht[0]保存的所有键值对重建计算计算索引值,保存到ht[1];

(3)全部迁移之后,将ht[0]置为空,释放ht[0],把ht[1]设置为ht[0],并在ht[1]新建一个空白哈希表,为下一次rehash准备。

  4.Redis的zset实现原理是什么?为什么不用红黑树来实现?

答:zset的底层结构同时使用了字典与跳跃表的;

红黑树是一种存在于内存中的结构,可以保证在最坏的情况下,对红黑树进行例如search,insert,以及delete等基本的动态集合操作的时间复杂度为O(lg n)。而跳跃表则是一种随机性的结构,所以在跳表中的搜索、插入、删除操作的时间复杂度就都为O(logn),但在最坏的情况下,它的时间复杂性又会变成O(n)

5.讲讲redis里面的哈希表?

答:哈希结构如图所示:

Redis高频面试题及答案(肝一天的总结)_第3张图片

 

哈希表节点如图所示:

Redis高频面试题及答案(肝一天的总结)_第4张图片

Redis持久化

  1. RDB和AOF都是什么,AOF日志量太大时redis如何处理?

答:RDB与AOF是redis的两种持久化策略,由于redis是基于内存的数据库,存储的数据为了防止丢失,需要持久化到硬盘中;

RDB是一种redis数据快照的持久化策略,在一定条件下,备份这个条件下时间点的redis数据,,是redis默认的持久化策略。

AOF是一种存储redis的命令的持久化方式,存储符合redis协议格式的命令数据;

如果AOF日志文件超过一定的大小限制,则会出发AOF的重写机制,重写过程:redis创建新的AOF文件,同时操作的命令会继续追加到现有的AOF文件中,如果新的文件创建完毕,就会从旧的文件切换到新的文件,继续在新的文件追加命令。

比较两种持久化方式:

方式

触发条件

实现过程

优点

缺点

RDB

1.自定义的配置的快照规则;

2.使用save或者bgsave命令

3.执行flushall命令

4.执行主从复制操作

1.redis进程调用操作系统的fork创建子进程;

2.子进程将内存中数据写入硬盘的临时文件中;

3.写入完毕后,临时文件替换掉旧的rdb文件;

1.最大化redis的性能,持久化操作交给子进程完成

2.速度比较快,方便传输,因为保存的压缩的二进制数据

1.若redis突然异常退出,则最后一刻的数据不能持久化

2.fork过程出现耗时的情况下,造成redis服务端一段时间停止处理客户端请求;

AOF

1.手动开启持久化;

2.每次执行更快数据库的命令都会触发AOF持久化

1.更改redis数据库的命令会添加到操作系统的缓冲机制中

2.从缓冲中再写入到磁盘的aof

1.可以及时持久化redis的数据;

2.持久化文件易懂易理解

1.降低了redis服务端的性能;

2.通过AOF恢复数据没有RDB方式的速度快

3Redis主从复制

  • 1. redis的哨兵模式是什么?

  答:哨兵模式是在主从复制模式中用于监控master的状态,可以实现master与slaver服务器的切换,保证系统的可用,主要作用:监控master状态、提醒、自动故障迁移

2. redis哨兵怎么选举主节点?

  答:(1)哨兵leader选举过程:

 当哨兵发现监控的master主观下线,会向其他哨兵发送is-master-down-by-addr,征求判断并将自己设置为领导者,如果哨兵发现选举的票数大于n/2+1,就会成为领导者,否则继续选举

     (2)选slave节点为master的过程:

找到优先级最高的slave>复制偏移量最大的>run_id最小的slave

Redis集群

1.  redis集群有哪些玩法,各自优缺点,场景?

   答:codis方式的集群:一种代理模式,代理服务器负责转发redis客户端的请求,并分发给多个redis服务器节点:

Redis-cluster: redis官方提供的集群方式,是一种去中心化的集群,客户端可访问任意节点,每个节点都存储了其他节点的信息;

2.  redis cluster有没有了解过,怎么做到高可用的?

Redis高频面试题及答案(肝一天的总结)_第5张图片

   答:redis cluster 是redis官方提供的一种去中心化的集群方式,所有节点通过ping-pong机制互联,内部使用二进制协议优化传输速度,客户端直接连接节点,不需要连接每个节点。

   保证高可用:如果其中某个节点挂掉了,则会将哈希槽跟给挂掉的slave,并设置为新的master节点,

 

3.  redis cluster原理是什么?

   答:Redis 集群中内置了 16384个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点

4.  一个key值如何在redis集群中找到存储在哪里

   答:使用crc16算法计算key对应的值,然后除以16384求余数得到对应的哈希槽,再根据哈希槽分布得出key所在的节点

Redis应用

1. redis key的过期淘汰机制?

  答:(1)定时过期:设置过期时间,定时删除,会占用大量CPU资源处理过期数据,从而影响服务器的缓存相应和吞吐量;

(2)惰性过期:当key被访问时,判断key是否已经过期,过期就清除,但是若某个key一直不被访问,就不会清除,从而会占用内存空间;

(3)定期过期:每隔一定的时间,扫描expires字典中过期的key,然后清除

2. 你们redis用在了什么地方?

答:(1)内存数据库(登录信息、购物车信息、用户浏览记录等)

(2)缓存服务器(商品数据、广告数据等等)(最多使用)

(3)解决分布式集群架构中的 session 分离问题( session 共享)

(3)任务队列(秒杀、抢购、12306等等)

(5)分布式锁的实现

(6)支持发布订阅的消息模式

(7)应用排行榜(有序集合)

(8)网站访问统计

(9)数据过期处理(可以精确到毫秒)

3. 为什么要使用Redis,有什么好处  

答:(1)是单线程的内存数据库,不存在线程安全问题

(2)最多支持并发10w QPS请求,因为底层采用了多路IO复用

(3)相比memcache这种专业的缓存技术,具有更高的读写性能,支持丰富的数据类型

4. 讲下redis存穿透?

  答:大量请求的key在redis中对应的value一定不存在,大量请求就会直接请求数据库,造成数据库压力突然变大,解决方案是对查询为空的情况设置值并设置过期时间

5. 讲一下缓存雪崩?

答:缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。

一般并发量不是特别多的时候,使用最多的解决方案是加锁排队。

给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓存。

6. redis单线程为什么快

   答:(1)redis的数据直接存储在内存中,绝大部分请求是直接操作内存;

(2)采用单线程,避免了不必要的上下文切换和竞争条件,也不用考虑多进程或多线程切换消耗的cpu,不考虑锁的问题,

(3)使用多路I/O复用模型,非阻塞IO

7. redis分布式锁实现?

答:串行访问使用setnx命令

使用SETNX完成同步锁的流程及事项如下:

使用SETNX命令获取锁,若返回0(key已存在,锁已存在)则获取失败,反之获取成功,为了防止获取锁后程序出现异常,导致其他线程/进程调用SETNX命令总是返回0而进入死锁状态,需要为该key设置一个“合理”的过期时间释放锁,使用DEL命令将锁数据删除

8. Redis的并发竞争问题如何解决?

答:Redis 的并发竞争 Key 的问题也就是多个系统同时对一个 key 进行操作,但是最后执行的顺序和我们期望的顺序不同,这样也就导致了结果的不同,

可以使用分布式锁,保持请求访问key是串行的

9. redis作为高速缓存和数据库的数据一致性的问题

   答:(1)数据库进行更新操作之前清空缓存,更新之后也清空缓存;

 (2)使用消息队列,串行化执行

10. 如果redis作为分布式锁的时候,主节点挂掉了,但是数据还没有同步到从节点,这种情况怎么办?

   答:使用RedLock

你可能感兴趣的:(面试,redis,面试)