引子:大家好,redis作为一个最常用的nosql存储,工作中几乎离不开。不过通常我们也仅仅是会用,对于原理不甚了解,对于底层特性也模棱两可。而通常在后端开发程序员面试中,redis是出现频率很高的一个话题。本文结合一次模拟面试流程,串讲几个常见的redis知识点。
小编友情建议,面试简历上不要随随便便写精通Redis
首先第一问:Redis有哪些数据结构?(难度:简单)
答:字符串string,字典hash,列表list,集合set,有序集合SortedSet
如果对redis有更深入了解,加上HyperLogLog,Geo,Pub/Sub
另外,可以加上Redis的BloomFilter(布隆过滤器),Bit操作,Lua脚本等等。
小编注:除了5种基本类型,剩下的类型当然是说的越多越好,但是注意,前提是你真的用过,因为面试官可能眼前一亮,然后往深了问。这时候如果答不上来就尴尬了。
如果能点到即止说下实现,那就更好了
然后第二问:Redis里面有海量的key,比如有w,此时我想根据一定词缀匹配所有符合的key,如果操作?(难度:中等)
答:使用keys命令,keys命令可以扫描出指定词缀的key列表。
接着可能会追问:请问这么做有没有什么风险?你真的这样操作过么?
答:由于redis是单线程的,keys指令的时间复杂度是O(n),常常会阻塞整个redis一段时间,所有其他操作都会被阻塞住。特备是w个key,阻塞时间会很长,
这是无法接受的。通常dba不允许keys命令操作,如果非要检索,可以使用scan命令代替。
scan命令可以使用内置游标快速返回一批指定key,但是有重复,并且需要操作许多次,去重通常用客户端来实现。
面试官这里相比已经对你点头了,如果深究,还会再问一句:如果检索的是hash中的field,set或者zset中的member,如何实现?
答:分别使用hscan,sscan,zscan
小编注:keys和scan命令其实算是常见操作了,通常keys等时间复杂度为O(n)的命令dba是明确禁止的,不要掉进面试官的坑中。
接着第三问:redis中的事务是如何实现的?如何简单使用redis当作分布式锁?(难度:中等偏上)
答:使用setnx命令抢锁,再用expire命令给锁加超时时间,防止锁没有被释放。
接着会问:对于其他的事务操作,redis如何实现?
答:redis的事务并不是典型的acid事务,redis的事务能力有限,建议使用redis+lua脚本实现。
由于redis单线程,将事务操作封装在一个lua脚本中,redis能保证执行这一个lua脚本中的操作都在一个事务中。
lua脚小编注:本是redis的高级特性,答出来能体现对redis的掌握程度比较扎实。
lua脚本用途诸多,值得一学
然后第四问:如果查看一个key是否过期,以及如果有大量的key在同一时刻过期,应该怎么做?
答:ttl命令;如果有大量key同时过期,可能会导致redis的短暂卡顿。通常生产环境,我们利用业务特性,尽量使得redis错峰过期。如果实在有大量key需要同时过期,
建议设置一定的随机时间范围。比如:原来可能是在17:00准时过期,可以再前后的10s内,打散过期时间。
小编注:这里实际上是一个经验问题,体现一个开发人员的项目经验。
最后面试官可能会问一个开放性问题:你的xx项目中如何使用redis的?(难度:高)
小编注:这其实是一个很开放的问题。越是这样的问题越难以回答,建议按照实际情况,选择自己最有把握的回答。有经验的面试官会抓住一点内容不放,层层深入。
以下只是举例,更多的问题会后续放上来:
模拟答案:我使用redis作为缓存。xx项目redis作为缓存,在读数据库之前先尝试读redis。
面试官:什么时候不适合用缓存?答:考虑缓存命中率/数据需要安全持久化等情况
面试官:缓存突然失效会造成什么?答:数据库会被“击穿”
面试官:缓存的结构是什么?答:根据业务,既有灵活运用各种结构的设计过的redis,也有被动存储整条sql的redis
面试官:大量的数据需要操作,如何提升效率?答:使用mget,hmge等批量命令;灵活使用pipeline
面试官:除了单机redis,你还了解或用过什么?答:redis官方有sentinel,cluster;开源界有tweproxy,codis;业界的方案,如新浪微博,,腾讯等公司,有自研的pika/tendis等等。
好了,本次针对redis的面试告一段落。是不是一些概念连听也没有听过呢?
今天分享了一串redis的问题,仅仅是redis问题的一部分;很多问题没有深入。
其实在互联网公司,以上问题仅仅算是常见问题。
没有听过也不要担心,接下来会分批陆续放上一些BAT等大厂常见面试题,敬请期待。
欢迎点赞,评论,转发。您的支持是我码字的最大动力,比心~~
比心~