常见的Redis面试"刁难"问题-附个人实操之二

之前在某个公众号下看到老钱的一篇文章,题目是《十个常见的Redis面试“刁难”问题》,感觉写的很好,不过里面的解答对于我这种小白来说并不是很全面,所以在这里实际操作、思考一番,并把自己的所得简单记录下来。

原文参考:https://mp.weixin.qq.com/s/Z4a8wbWvPDGFTkKJH0X9VQ

假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来?

使用keys指令可以扫出指定模式的key列表。

>setnx jin value1
>setnx jin-1 value2

>keys jin*
1) "jin"
2) "jin-1"

对方接着追问:如果这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题?

这个时候你要回答redis关键的一个特性:redis的单线程的。keys指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复

这个时候可以使用scan指令,scan指令可以无阻塞的提取出指定模式的key列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用keys指令长。

127.0.0.1:6379> scan 0 match jin*
1) "0"   // 返回0,表示已经完成了整个搜索
2) 1) "jin-1"
   2) "jin"

参数0 表示从游标为0处开始,也就是从头开始。

使用过Redis做异步队列么,你是怎么用的?

一般使用list结构作为队列,rpush生产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep一会再重试。

127.0.0.1:6379> lpush jinlist redis
(integer) 1
127.0.0.1:6379> lpush jinlist wukan
(integer) 2
127.0.0.1:6379> rpush jinlist nizi
(integer) 3
127.0.0.1:6379> lrange jinlist 0 100
1) "wukan"
2) "redis"
3) "nizi"
127.0.0.1:6379> lpop jinlist
"wukan"
127.0.0.1:6379> lrange jinlist 0 100
1) "redis"
2) "nizi"

如果对方追问可不可以不用sleep呢?list还有个指令叫blpop,在没有消息的时候,它会阻塞住直到消息到来。

如果对方追问能不能生产一次消费多次呢?使用pub/sub主题订阅者模式,可以实现1:N的消息队列。

如果对方追问pub/sub有什么缺点?在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如rabbitmq等。

如果对方追问redis如何实现延时队列?我估计现在你很想把面试官一棒打死如果你手上有一根棒球棍的话,怎么问的这么详细。但是你很克制,然后神态自若的回答道:使用sortedset,拿时间戳作为score,消息内容作为key调用zadd来生产消息,消费者用zrangebyscore指令获取N秒之前的数据轮询进行处理。

127.0.0.1:6379> zrangebyscore myzset 0 10
1) "one"
2) "two"
3) "four"
127.0.0.1:6379> 

这里0 和 10 是score的最大和最小取值范围。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 导读:在程序员面试过程中Redis相关的知识是常被问到的话题。作为一名在互联网技术行业打击过成百上千名的资深技术面...
    小刀爱编程阅读 721评论 0 3
  • 导读:在程序员面试过程中Redis相关的知识是常被问到的话题。作为一名在互联网技术行业打击过成百上千名的资深技术面...
    java架构_Zhang阅读 1,752评论 2 3
  • 使用缓存是系统性能优化的第一黄金法则。 缓存的设计和使用对一个系统的性能至关重要,平时接触到项目无论多少也都会在某...
    刀刃丿阅读 1,354评论 0 6
  • 真的要毕业了!早晨起床后,你穿上白色夏季校服,戴上红领巾,精神抖擞的阳光少年。爸爸送你去学校参加小学阶段最后一次散...
    素面迎风阅读 125评论 0 0
  • 有人对我说:“像某某那样的人,你根本就没有必要对他那么好,你根本就没有必要理他。”我听了只是淡淡的笑了笑。也有人对...
    华869f阅读 1,132评论 14 8