5-1 你们项目中签到为什么要使用bitmap
签到用bitmap可以节省空间。
通过观察签到表的设计,我们会发现一条签到记录就会占用22个字节,而我们每天的签到记录有很多,这样会浪费空间
为了节省存储空间,我们可以使用类似于下面的结果保存某个用户一月份的打卡记录
它把每一个bit为对应月的每一天,形成映射关系,用0和1分别标识是否打卡,这种思路称为bitmap(位图)
而我们的redis中恰好提供了bitmap的数据结构和相关操作命令,我们可以直接使用。
在Redis中,bitmap底层还是基于String类型实现的,存储数据是以二进制(bit位)为单位进行存储的
bitmap在处理大量数据统计和判断时,可以只占用非常小的一部分内存,而且计算速度非常高效!
5-2 你们项目中积分功能是如何实现的
积分功能实现有两个,分别是新增积分,和查询积分
新增积分:
修改SignRecordServiceImpl中addSignRecords方法,添加发送积分消息的代码;
修改InteractionQuestionServiceImpl中saveQuestion方法,添加发送积分消息的代码;
监听消息:
接下来,就可以去编写消息监听器了。5种不同积分获取方式,需要5种消息监听器,这里我们先实现两个:签到 写互动问答
在tj-learning模块定义一个消息监听器类,两个监听方法,分别是listenSignInMessage和listenWriteReplyMessage。着两个监听方法都会调用pointRecordService的addPointsRecord方法去保存积分记录。
在PointRecordServiceImpl中,会首先判断是否有积分上限
,如果没有会保存积分记录,然后结束
,如果有积分上限,会查询今日已得积分,如果超过每日上线,直接结束,如果没有超过每日上线,会保存积分记录然后结束。
查询积分的关键点是会分组统计我今天获得的积分
5-3 Redis三大新面试点: 跳表、pipeline、bitmap
跳表:
跳表(SkipList)首先是链表,但与传统的链表相比有几点差异:
1.调表结合了链表和二分查找的思想
2.元素按照升序排列存储
3.节点可能包含多个指针,指针跨度不同
4.查找时从顶层向下,不断缩小搜索范围
4.整个查询的复杂度为O(log n)
Redis数据类型Sorted Set使用了调表作为其中一种数据结构
pipeline:
在Redis中,Pipeline是一种用于批量处理执行命令的机制,可以减少客户端和服务器之间的通信开销,提高性能。通过Pipeline,客户端可以将多个命令打包发送到服务器端执行,然后一次性获取所有命令的执行结果。
bitmap:
见第一题