菜鸟面试路上的那些坑—Redis浅篇(第一节)
前言
这个主要讲的就是曾经自己面试的时候,因为自己准备的不恰当,那些没有回答出来的面试问题,菜鸟面试路上的那些坑
一、Redis是什么?
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。(这不重要)
二、直入正题,都问些什么
1.有哪几种数据类型
String(字符串),Hash(哈希),List(列表),Set(集合),ZSet(有序集合)。
这五种是一个标准的答案,但是还有其他几种,他们就是BitMaps,Hyperloglogs,Streams,Geospatial这四种可能比较陌生但你能多说以上几种,然后可以对此进行实用场景进行一些描述,比起原本五个的回答更添光彩。
2.数据类型结构以及他们的适用场景
String:底层结构一般大家都叫做字符串,但查阅一些资料,我才知道他们还有更深层,也就是当我们设置像("hello"或者一个int类型的数字9),他们在底层实现又是不同,可以分为以下三种。
适用场景:
- 缓存热点数据
- 存分布式session
- 比较常见的分布式锁
- 点赞数,限流等(利用INCR这个原子性操作)
Hash:
底层结构可以分为两种:ziplist(压缩列表),ht(dictionary字典)。
ziplist:是一个经过特殊编码的双向链表,有趣的是这个链表它不储存上一个节点以及指向下一个链表节点的指针,而只是存储上一个节点以及当前的节点的长度。
而ht(hashtable)则是数组加链表的一个结构。
适用场景:
- 购物车信息十分适用于此,就比如商品id,商品价格,以及商品数量等。
List:
有一次面试问到List的数据结构是一个怎么样,当时自己也就只看了浅层,就含糊的说了就是链表,真是个憨批。言归正传,Redis中list他是一个双向链表,是一个无环(头节点pre指针和表尾节点的next都指向的是一个null),*zl是指向一个压缩链表ziplist。
适用场景: - 可以当作一个消息队列
- 可以用于秒杀,商品存放在这个队列中
- list类型lpush和lrange命令实现最新列表的功能,通过lpush插入新元素,然后用lrange命令读取最新的元素列表,比如朋友全最新的评论列表等
Set:
这个集合特点:不存在重复元素,元素无序,此外也是比较重要就是支持集合那些交集并集等操作,这些操作也决定了他的适用场景。
他的两种存储结构:1.intset 2.hashtable
适用场景:
- 一些评论的点赞,是否收藏等功能都可以利用Redis中set一些操作指令进行开发。
- 商品筛选,比如各种分类类别中都存在一个相同商品可以利用sinter进行一个交集的得出
ZSet:
有序集合,集合中每一个元素都有一个对应的分数,基于这个分数进行排序,当分数相同,则以key的ascii值进行排序。存储结构如下
在这我们主要讲一下skiplist跳表他的这个原理图以及解释
上面就是普通链表下你假如需要查询到6,就需要从头遍历,时间复杂度效率不高
而上图,便是跳表下的一个效率,你可以把他的看成二分查找或者快速排序那种,先找到在某个区间,在这个区间继续比较最后找到最小区间块进行查找。
适用场景:
- 百度热点:消息标题加热点数值
BitMap:
bitmap,位图使用bit,1Byte = 8 bit,
长度可以根据你的需求,比如用户一周登录次数,长度可以为7,哪天登录了就可以在相应位置上设置为1.
使用场景:
- 用户签到统计
- 统计活跃用户
- 用户在线状态
Redis HyperLogLog
HyperLogLog,是一种用来做基数统计的算法(近似大量统计去重元素数量的算法),在输入元素数量或者体积非常大的时候,计算基数所需的空间总是固定并且很小的。在Redis里面,每个HLL只会华为12KB内存,却可以计算2^64不同元素的基数。
适用场景:
1.计算网站的UV(Uinque Vistor 也就是独立访客)
2.统计网站日活月活
Geospatial
Geo主要用于存储地理位置信息,并对存储的信息进行操作。
适用场景:
- 给定一个坐标吗,查找指定范围内从元素,就比如QQ附近的人
- 打车距离的计算
Stream:
它是在Redis5.0新增的一种数据结构,主要用于消息队列,较于Redis原有发布订阅实现的消息队列的功能,优化了消息持久化主备复制功能,保证了消息不丢失。