java 面试 redis_Java面试总结之Redis

近年来,随着redis在互联网行业中的使用越来越广泛,在面试的过程中redis相关的知识也越来越受到面试官的重视。这篇文章为大家总结一下在面试过程中考的最多的redis考题。

4b74a74b442eff51051d33eb15a49bcb.png

什么是redis?答:redis本质上是一个key-value类型的内存数据库,或者说是一个高速缓存中间件。主要支持的数据结构有string,hash,set,list,sorted set.redis的复制特征?答:当redis的主从关系建立的时候,数据会从主节点复制到从节点。一旦主节从宕了,所有对主节点的操作都会复制到从节点上。Memcached与redis的区别?答:(1).Memcached仅仅用于缓存信息,redis除了缓存信息还增加了持久化和复制的特性。(2).Memcached支持LRU(最近最少使用)的清除值的功能,redis不支持此算法。(3).Memcached中当内存overflow的时候,那些LRU的值会被清楚。redis中你可以对任务key设置过期时间,当内存overflow的时候,redis会随机选3个key,并随机删除最接近过期的那个。(4).Memcached支持CAS,redis不支持。CAS对维护缓存一致性没有什么用处。(5).Memcached中存储的数据需要进行序列化,读取出来的时候需要进行反序列化。redis有较强的数据结构,可以处理字符串、二进制安全字符串、二进制安全字符串列表、排序列表等。(6).Memcached的key最大长度为250bytes,redis则为2G。(7).Memcached是多线程的,redis是单线程的。使用redis的优势是什么?答:redis的优势:a.快速 b.支持服务端加锁 c.有各种客户端的lib包 d.支持命令级别的原子操作redis有哪些局限性?答:a.单线程 b.redis客户端对一致性hash支持有限 c.redis对持久化操作需要很大的系统开销列举redis对key的常用的操作?答:redis里常用的key操作,TYPE keyTTL keyKEYS patternEXPIRE key secondsEXPIRE key key timestampEXISTS keyDEL keyredis能同时提高速度和持久化性能吗?答:不能。redis在提供高速度的同时,是牺牲了持久化性能的。当redis发生故障时,redis会写入碰盘,但是可能会丢失数据。如何能提高redis的持久性?答:可以通过fsync配置来提高数据的安全,fsync()每次向日志文件append一个新的命令,这个是安全的,但速度非常慢。fsync()每秒一次,速度快,但系统失败会丢失1秒的数据。never fsync()这是一不安全的方法。谈一下在使用redis的过程中需要注意的点?答:主要有以下注意事项,(1).给你要存储的key配置前缀,便于统一管理你的key。(2).对于每一个放入redis的类,设计他的数据过期策略,迁移策略。(3).在使用redis之前,考虑使用cluster还是Sentinel模式redis是如何保证数据一致性的?答:redis的主从同步机制可以保证master和slave之前的数据同步。同步过程如下图所示:

56b045e8d2531d4682add5bbc1ebd75a.png

(1)slave启动后向master发送同步指令SYNC,master接收到SYNC指令之后将调用该命令的处理函数syncCommand()进行同步处理;

(2)在函数syncCommand中,将调用函数rdbSaveBackground启动一个备份进程用于数据同步,如果已经有一个备份进程在运行了,就不会再重新启动了。

(3)备份进程将执行函数rdbSave()完成将redis的全部数据保存为rdb文件。

(4)在redis的时间事件函数serverCron(redis的时间处理函数是指它会定时被redis进行操作的函数)中,将对备份后的数据进行处理,在serverCron函数中将会检查备份进程是否已经执行完毕,如果备份进程已经完成备份,则调用函数backgroundSaveDoneHandler完成后续处理。

(5)在函数backgroundSaveDoneHandler中,首先更新master的各种状态,例如,备份成功还是失败,备份的时间等等。然后调用函数updateSlavesWaitingBgsave,将备份的rdb数据发送给等待的slave。

(6)在函数updateSlavesWaitingBgsave中,将遍历所有的等待此次备份的slave,将备份的rdb文件发送给每一个slave。另外,这里并不是立即就把数据发送过去,而是将为每个等待的slave注册写事件,并注册写事件的响应函数sendBulkToSlave,即当slave对应的socket能够发送数据时就调用函数sendBulkToSlave(),实际发送rdb文件的操作都在函数sendBulkToSlave中完成。

(7)sendBulkToSlave函数将把备份的rdb文件发送给slave。

11.sorted set的实现原理?

答:sorted set中的每个值都带有分数,按分数进行排序,从而实现了集合的有序。底层数据结构主要用到了ziplist、skiplist和dict数据结构。

skiplist是在有序链表的基础上发展而来的,在有序链表中进行查询,需要进行顺序 遍历,时间复杂度为O(n).

7c6948e291a0a45dbd8affe4ebfb38d2.png有序链表

0f674103fd70c177c444caa16ace2881.png双层链表

可以在新产生的链表之上,每隔两个节点,再增加一个指针,从而产生第三层链表,红色箭头代表查找路径,从最上层链表开始查找,一次可以跳过四个节点,进一步加快了查找速度。

bec5d03526821cb47b25e87b985e0cef.png多层链表

skiplist借鉴了多层链表的思想,但多层链表这种严格的2:1关系,会导致插入和删除节点破坏上下层之间的2:1关系,导致插入位置和删除位置及后续的所有节点都需要进行调整。skiplist并不采用这种严格的2:1对应关系,每个节点的层数采用随机生成的方法,插入节点不会影响其它节点的层数,且只需调整插入节点前后的指针,不需要对所有节点进行调整,降低了插入的复杂度。

b5eba92fe72b1d9dc389c134fa6290d2.pngskiplist插入过程

看完这个演变过程基本就能讲清楚sorted set的实现原理了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值