简言

1. 笔者近两年来一直使用redis,也对redis有过仔细的研究,不敢说精通,熟悉至少是有的

2. redis越来越火,网上相应的文章,总结,面试问题也有很多,但大多是应付简单面试用的,如果面试官再深入一些,恐怕大多数人都hold不住

3. 所以特在这里总结了一些有难度的问题,若你能认真学习研究,不但能大幅提高对redis的理解程度,反杀面试官也是轻轻松松

4. 问题不止10个,随时想到随时更新,有时间就会把答案补上来

问题1:持久化的混合存储模式(前面RDB+后面AOF),它的实现原理和好处

答:

问题2:scan命令,第三个参数应该怎么填

答:先看下scan命令的格式,第1个参数是下标,第2个参数是匹配模式,第三个参数是限制个数

       1          2               3
SCAN cursor [MATCH pattern] [COUNT count]

但是这个count限制并不是必定能起效,受多种因素影响,大致如下

1. 当redis发现你用hscan,zscan,scan命令遍历的对象是压缩列表实现的,说明对象内元素比较少,会全部遍历筛选后返回

2. 如果你不传count参数,那么redis会默认设置为10

3. redis是对数组里面单个下标里面的元素遍历,如果某个下标里面符合match格式的元素很多,会超出count值,单个下标遍历完后才会判断是否超出count值,所以可能已经超过了count

4. 如果单次遍历过程中耗时过长,为防止redis卡顿,即使符合条件的元素有很多,也会提前返回,此时个数会少于count值

综上:具体使用时要根据你对结果值的处理操作(元素数据总体量大小,单个元素的操作耗时等)来决定一批筛选多少个元素,redis已经为我们做好了防护

具体scan命令的实现原理可参考笔者的这篇博客redis的scan命令的源码分析,实现原理_papaya的博客-CSDN博客

问题3:scan命令,返回的游标值在redis中代表什么,是槽位吗,这个槽位和redis集群的槽位概念有关系吗

答:

问题4:scan命令,返回的key中,有一定概率会出现重复的情况,能说下到底什么情况下会出现重复吗?为什么,这种重复能优化吗

答:redis缩容的时候会出现,因为rehash采用高位加法,举例:遍历到下图中的橙色下标(110)时发生了缩容,前面的000,100,010都已经遍历过了,其中000,100节点会被rehash到新的00节点上,不会重复遍历。但是010,110节点都会rehash到新的10下标(第一行绿色的)上,那么010下标上对应的元素就会被重复遍历

问题5:redis的读写分离模式中,因为主从同步需要时间,所以有一定概率会出现主redis刚刚写入,从redis读取不到进而认为该key不存在的情况,如何优化

答:

问题6:redis命令查看单个key的大小有哪些命令,哪些是准确的,哪些是不准确的,比如--bigkeys命令的原理

答:

问题7:redis集群选举时是使用raft算法还是paxos算法,知道raft算法和paxos算法的区别吗

答:

问题8:rehash为什么要用高位加法,而不是我们通常的低位加法,好处是什么

答:采用高位进位加法,无论是扩容还是缩容,rehash 后的槽位在遍历顺序上是相邻的,这也是scan命令能保证全盘遍历的精妙之处,详见这篇博客:redis之rehash原理_papaya的博客-CSDN博客_redis rehash原理

问题9:redis对象中有个字段叫lru,只有24位,在LRU模式下,存储的是最后一次访问时间。由于只有24位,能表示的最大时间只有194天,超过194天的key怎么办,如何才能计算出它真正的空闲时间?

答:代码如下

// 计算对象的空闲时间,也就是没有被访问的时间,返回结果是毫秒
unsigned long long estimateObjectIdleTime(robj* o)
{unsigned long long lruclock = LRU_CLOCK();// 获取Redis时钟,也就是server.lruclock的值,单位:秒if (lruclock >= o->lru){// 正常递增时直接减即可(LRU_CLOCK_RESOLUTION的值默认是1000)return (lruclock - o->lru) * LRU_CLOCK_RESOLUTION;}else{// 折返了,则加一轮最大值后再减(LRU_CLOCK_MAX表示一轮的最大值,即2^24 - 1)return (lruclock + LRU_CLOCK_MAX - 0->lru) * LRU_CLOCK_RESOLUTION;}
}

问题10:redis事务的watch有没有ABA问题,是如何解决的?

答:没有ABA问题。redis会为每个要监听的key维护一个监听的client列表,任何key发生变化时都会检测一下是否是watch中的key。若是watch中的key,则把监控这个key的所有client都标记为REDIS_DIRTY_CAS,意思是为该client的所有CAS操作都“dirty”了。当服务器收到该client的事务执行命令(即exec命令时),会检测是否有REDIS_DIRTY_CAS标记,若有,则直接返回,不再执行事务

详细分析可以见笔者的这篇博客:

redis的watch没有ABA的问题_papaya的博客-CSDN博客

问题11:布隆过滤器怎么删除元素呢?

答:经典的布隆过滤器不支持删除元素

如果一定要删除元素,业内普遍有两种做法

方法1:定时异步重建布隆过滤器,比如每隔3天把所有元素重新hash,建立新的布隆过滤器,重建完后再删掉旧的布隆过滤器。

方法2:使用计数型的布隆过滤器。因为经典的布隆过滤器的一个位只能为0或1,为1时不能记录有多少个元素引用了该位,一旦删除,数据就乱了。但计数型的布隆过滤器每个位是一个数字,记录了有多少个元素引用了该位,删除一个元素时只需对其hash对应的位的数字进行减1即可。

问题12:一般情况下redis cluster中key和slot的映射是通过算法(原理:crc16(key)%16384)对应的,知道如何强制把key映射到指定的slot呢?

答:键哈希标签原理,代码如下

unsigned int keyHashSlot(char *key, int keylen) {undefined int s, e;// 找到 { 的indexfor (s = 0; s < keylen; s++){if (key[s] == '{') break;}// 没找到就计算crc16()的值if (s == keylen) {return crc16(key,keylen) & 0x3FFF;}// 再往后面找 } 的indexfor (e = s+1; e < keylen; e++){if (key[e] == '}') break;}// 没找到 } 或者{}之间为空,仍然计算crc16()的值if (e == keylen || e == s+1) {return crc16(key,keylen) & 0x3FFF;}// 获取{}之间的字符串进行crc16()计算return crc16(key+s+1,e-s-1) & 0x3FFF;
}

redis反杀面试官之10问相关推荐

  1. 面试官最爱问的Redis(三)Redis的基本知识

    面试官最爱问的redis,继续整理了Redis的学习笔记,动力节点的redis视频,13个小时搞定redis,笔记分享给大家. 视频资源:https://www.bilibili.com/video/ ...

  2. 面试java你最擅长什么_面试官最喜欢问的10道Java面试题

    1.Java的HashMap是如何工作的? HashMap是一个针对数据结构的键值,每个键都会有相应的值,关键是识别这样的值. HashMap 基于 hashing 原理,我们通过 put ()和 g ...

  3. 面试官95%会问的接口测试知识

    接口测试最近几年被炒的火热了,越来越多的测试同行意识到接口测试的重要性.接口测试为什么会如此重要呢? 主要是平常的功能点点点,大家水平都一样,是个人都能点,面试时候如果问你平常在公司怎么测试的,你除了 ...

  4. 面试官上来就问:Java 进程中有哪些组件会占用内存?

    本文的内容来自 StackOverflow 的一个问答:Java using much more memory than heap size (or size correctly Docker mem ...

  5. 面试官最爱问的并发问题

    转载自  面试官最爱问的并发问题 在Java相关的岗位面试中,很多面试官都喜欢考察面试者对Java并发的了解程度,而以volatile关键字作为一个小的切入点,往往可以一问到底,把Java内存模型(J ...

  6. 如果我说熟悉SpringBoot 面试官会怎么问?

    SpringBoot 因简化了 Spring 框架使用难度,极大地提高了Java企业级应用开发的效率,成为企业考核人才的重要标准之一.但随着现今互联网行业快速发展.企业业务不断深入,相应地对 Spri ...

  7. 阿里的面试官都喜欢问哪些问题?

    作者:徐刘根 | 公众号:Java之间 金九银十是招聘的旺季,小编在这里也给大家整理了一套阿里面试官最喜欢问的问题或者出场率较高的面试题,助校招或者社招路上的你一臂之力! 首先我们需要明白一个事实,招 ...

  8. 面试官都在问 | Linux命令mpstat详解

    面试官都在问 | Linux命令mpstat详解 1. mpstat的基本用法 mpstat的全称为Multiprocessor Statistics,是一款常用的多核CPU性能分析工具,用来实时查询 ...

  9. 为什么面试官总喜欢问String?

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者:tan日拱一兵 来源:公众号「日拱一兵」 关于 Java String,这是面试的基础 ...

最新文章

  1. android 横向滑动事件,android左右手势滑动事件处理
  2. C++ 注册表取值 按行读取txt文件 时间差天数 格林威治时间转标准时间
  3. Quick-Cocos2d-x 集成 Google protobuf 方法
  4. Spark-submit提交任务到集群
  5. python rtf转txt_将DOC、RTF格式文件批量转为TXT格式文件
  6. 菌群多样性检测_多样性丰富了中学Linux用户群
  7. NO.4 Android开发中常用框架及工具
  8. Java数据库表自动转化为PO对象
  9. 输出空格隔开换行_VB编程(六)数据输出 Print 及相关方法
  10. Delphi调用C++写的dll示例
  11. Hadoop1.1.2开发笔记(一)
  12. 20. PHP 表单验证 - 验证 E-mail 和 URL
  13. Linux cache清理
  14. 现代软件工程 第十五章 【稳定和发布阶段】练习与讨论
  15. 松翰单片机--SN8F5702学习笔记(四)ADC
  16. 湖北工业大学校园网自动认证功能
  17. nslookup命令反解ip_桌面运维常用命令
  18. ITeye4月读书活动之《游戏引擎架构》
  19. wangeditor修改-修改上传视频大小
  20. bilibili源码泄漏后,程序员们从代码里扒出来的彩蛋

热门文章

  1. [Effective C++读书笔记]005_条款05_了解C++默默编写并调用哪些函数
  2. VMware View 5.0从菜鸟到高手系列 3 -安装View Composer组件篇
  3. Error:Can’t find import 2508 in coredll.dll问题解决
  4. 中石油训练赛 - Flow Finder(树上模拟)
  5. 牛客 - 树上求和(贪心+树形dp)
  6. HDU - 4821 String(字符串哈希+优化)
  7. android debug bridge tools_如何优雅的管理多环境下的Android代码
  8. 两条信号之间加电容_上海贴片电阻电容厂家地址-华腾电子
  9. 分治算法-01连续子序列的最大和问题
  10. BZOJ2806(后缀自动机+DP)