个人整理redis的面试题(面试官必问!!!)

12/4

1、redis是单线程还是多线程

Redis6.0版本之前的单线程指的是其网络i/o和键值对读写由一个线程完成的

Redis6.0引入的多线程指的是网络请求过程采用了多线程,而键值对读写命令任然是单线程处理的,所以redis依然是并发安全的

也就是只有网络请求模块和数据操作模块是单线程的,而其他的持久化,集群数据同步等,其实是由额外的线程执行的。

  1. redis单线程为什么这么快
  1. 命令执行基于内存操作,一条命令在内存里操作的时间是几十纳秒
  2. 命令执行是单线程操作,没有线程切换开销
  3. 基于io多路复用机制提升redis的i/o利用率
  4. 高效的数据存储结构:全局hash表以及多种高效数据结构:比如调表,压缩列表,链表

Hash列表  一维数组,二维链表

  1. redis底层数据是如何用调表来进行存储的

将有序链表改造为支持近似“折半查找”算法,可以进行快速的插入,删除,查找操作

  1. redis过期了为什么内存没释放

使用set命令时,如果刚开始就设置了过期时间,那么之后修改这个key,也务必加上过期时间的参数,避免过期时间丢失问题

Redis对于过期key的处理一般有惰性删除和定时删除两种策略

  1. 惰性删除:当读写一个过期的key时,会触发惰性删除策略,判断key是否过期,如果过期了直接删除这个key
  2. 定时删除:由于惰性删除策略无法保证冷数据即时被删除掉,所以reids会定期(100ms)主动淘汰一批已经过期的key,这里的一批只是部分过期key,所以可能会出现部分key已经过期,但还没有被删除的情况,导致内存没有被释放

  1. reids没有设置key过期时间,为什么被redis主动删除了

12/5

  1. redis淘汰key的算法LRU与LFU的区别

LRU算法 (最近最少使用)淘汰很久没被访问过的数据,以最近一次访问时间作为参考

LFU算法(最不经常使用)淘汰最近一段时间被访问次数最少的数据,以次数作为参考

绝大多数情况下我们都用LRU策略,当存在大量的热点缓存数据时,LFU可能会更好一点。

  1. 删除key的命令,会阻塞redis吗?

分情况回答,当删除单个字符串类型的key,时间复杂度为0(1),删除单个列表,集合,有序集合或哈希表类型的key,时间复杂度为0(m),m数据结构内的元素量

  1. redis主从,哨兵,集群架构优缺点比较
  2. redis集群数据hash分片算法是怎么回事

redis集群将所有数据划分为16384个槽位,每个节点负责其中一个槽位,槽位的信息存储于每个节点中

当redis集群的客户端连接集群时,它也会集群的槽位配置信息并将其缓存在客户端本地。

这样客户端要查找某个key的时候,可以更=根据槽位定位算法找到目标节点

槽位定位算法

集群默认会对key值使用crc16算法进行hash得到一个整数值,然后用这个整数值对16384进行取模,来得到具体的槽位。再根据槽位置和redis节点的对应关系就可以定位到key具体是落在那个redis节点的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值