续:
上一篇说到了Redis的5种基础数据结构,在面试中实则是作为亮点呈现的,因为前提不是这个啊,考察的重点还是Redis的特性,综合应用场景,原理和场景的解决方案。这篇我们集中说下Redis的面试集中炮坑点,来抬起你粗壮的麒麟臂给扔回去。
1 数据结构
1.2 高级数据结构
1.2.1 GEO
tip:GEO易理解,重使用,原理清晰也不用深究。
小白难度
1) 什么是GEO?做什么用的?
白话版:帅气的面试官你好,GEO是Redis中用来处理经纬度或者坐标信息的数据结构,可以方便的通过redis的api方便的计算,无须自己引入三方包的繁琐操作。
2)GEO提供的哪些操作?可以进行哪些计算?
白话版:塞值,取值,计算两点距离,计算半径范围内坐标数量,返回地理坐标的时间hash值
对应:geoadd,geopos,geodist,georadius/georadiusbymember,geohash
tip:坐标数据一般是通过传统的缓存操作从数据库中获取或者服务启动时做预热数据+缓存和库双写。
1.2.2 HyperLogLog
小白难度
1)什么是HyperLogLog?做什么用?有哪些操作?
白话版:做数据统计用的数据结构(比如统计访问量/热度/排行榜 为不重复独立的key统计),数据量大不想占用过多内存时使用。
操作:塞元素(pfadd),获取元素统计(pfcount),合并多个HyperLogLog(pfmerge)
尚可难度
1) 为什么使用HyperLogLog?有什么弊端?统计有什么其他的实现方式吗?
白话版:使用HyperLogLog出于节省内存空间考虑,最多占用12k的内存却可以存储2^64个数据。弊端就是因为基于概率算法实现会有0.81%的偏差,完全精准的统计不建议使用。其他的实现方式你是在说Set吗?没问题啊,但日活量大的场景统计访问量白花花的消耗内存啊。
略高难度
1)说一下HyperLogLog的原理
tip:这里涉及到概率学领域,一笔掠过,Why?才疏学浅。
白话版:存入值时会计算值的hash值转成二进制码,根据高位判断大或小,再通过概率公式计算,存入一个长度为16384的数组里。
关键词:伯努利试验。
1.2.3 pub/sub
tip:严格说,这不是一种数据结构用来存储数据的。
小白难度
1)什么是pub/sub?什么是发布订阅?怎么使用?
白话版:是一个简易版发布订阅模式的消息队列,数据接收方通过订阅,注册和一个提供数据的管道(channel绑定),支持多个client绑定一个管道,有数据publish到channel里,client就会接收到数据。
操作:订阅SUBSCRIBE,模糊名称订阅PSUBSCRIBE,退订UNSUBSCRIBE,模糊名称订阅PUNSUBSCRIBE,查看订阅信息PUBSUB,发布消息到管道PUBLISH。
尚可难度
1)能不能使用redis的发布订阅取代消息队列?在什么场景下使用?
白话版:不能。redis消息队列的实现过于简单,只是plus功能。区别于专业的消息队列少了查验机制,不会为发送的数据备份,丢失数据无法找寻,比如各种原因的client下线,只是一个匹配和管道的功能。
1.2.4 BloomFilter
tip:同上不是用来存储数据,但是一个非常好用的功能。
小白难度
1)什么是BloomFilter/布隆过滤器?有什么应用场景?
白话版:和名字一样可以作为数据的过滤器,场景当然是满足过滤器的衍生用途,比如缓存穿透前作为数据的过滤规则,可以有效降低请求绕过缓存将压力打在DB上。一定要注意的是,过滤器是为redis中的数据服务,没有数据那过滤何来意义呢?另外为了过滤将其他地方的数据迁移到redis的成本值得考虑,或者是否已经将redis作为Nosql的DB。
尚可难度
1)BloomFilter是怎么实现的?
白话版:将数据经过n个hash函数产生n个hash值,在数组对应的hash值处存入1。
1.2.5 Redis-Module
tip:这个领域就看个人发挥了,相信接触到的各位水平已经不需要笔者说什么了。
介绍:Redis在进入4.0时代后,开放了Redis-Module,将内部优秀的功能提供给DevEr,丰富Redis的各项用途,比如基于Redis的搜索引擎实现,日志收录等,都让Redis社区日益蓬勃,对开源的形式和官方的态度让笔者有了一个新的认知。
写在最后:Redis后续还有3篇,笔者希望能覆盖到较全面的Redis面试范围,服务大家。
PS:
如果你觉得有那么一丢丢的用处或认同,记得三连,原创不易,来自你的回应是我坚持下去的动力,不再孤军奋战。Thx!