5-1 你们项目中签到为什么要使用bitmap
在我们项目中是使用bitmap来实现签到功能的,主要是因为以下原因:
1.节省空间:bitmap 位图是一种数据结构,用来存储位的集合,每个位只能是0或1,它通常是一个由二进制位组成的数组,其中每一个位代表一种状态或者标记,可以很好的节省空间,每个用户的签到情况可以使用一个位图来表示,每一位代表一天的签到状态,节省了很大一部分存储空间;
2.快速查询,它具有类似于索引的效果,可以快速的查询用户在某一天的签到状态;
3.高效统计:通过位图,我们可以快速的统计用户的签到情况,连签天数等;
4.可以简化逻辑:使用位图,可以简化签到业务功能的实现,降低开发成本。
总的来说,用位图来实现签到功能可以提升代码效率,简化我们的开发,是一个高效合理的选择。
5-2 你们项目中积分功能是如何实现的
在我们的项目当中,用户签到、学习、参与互动问答、提交学习笔记等行为都可以产生积分,并基于积分形成排行榜。
在所有可以获取积分的业务中发送MQ消息,我以签到和提问问答来讲述一下大概流程吧:
首先,我们会在签到和问答业务中,添加发送消息的代码,将消息发送;
接下来我们就需要编写消息监听器,这个得对应上述积分获取的方式分别设置对应的监听器,有几种获取方式发送过来,就得设置几种监听器;
紧接着就是添加积分的业务了,我们得判断该积分获取的类型是否有积分获取的上限,没有的化就直接保存,若是有积分上限,我们要根据上限确定本次积分可以获取多少,这个过程中,首先我们需要获取到今天这个类型的获取积分方式在之前获取了多少分,然后与积分上限做对比,若超过了积分上限,就不可再添加了,结束程序;若是积分没有达到上限,此时还得分为两类,一类是,它加上本次获取到积分会超过上限,此时只能再保存上限值减去该类型防火已经获取的积分;如果已经获取到的积分加本次的仍然小于上限,既可以将其都保存进去;
最后是查询今天获取的积分,我们会设置查询条件位今天的起始时间和结束时间,用户id,以及积分获取的方式分组等条件,查询今日积分按类型划分,然后将所有积分相加及是今日的所有积分。
5-3 Redis三大新面试点: 跳表、pipeline、bitmap
1.跳表:
- 跳表是一种有序的数据结构,类似于平衡树;
- 跳表通过在每个节点上增加多层索引来加速节点的查找;
- 在Redis中,有序集合的底层实现就是通过跳表来实现的,在实现有序集合时具有良好的性能,能够以O(log n)的时间复杂度进行插入、删除和查找操作,因此被广泛用于Redis中有序集合的实现中。
2.Pipeline(管道)
- 管道是一种用于批量发送命令并批量接收结果的机制,使用管道可以将多个命令一次性发给服务器,然后一次性接收多个命令结果,减少网络通信的开销;
- 管道在Redis中使用方式如下:
1.客户端将多个命令一次发送给服务器,但不等待服务器的响应;
2.服务器一次性执行这些命令 ,并将结果一次性返回给客户端。
通过使用Pipeline,可以在一定程度上提高Redis的性能,特别适用于需要执行多个命令的场景。
3. Bitmap(位图)
位图是一种数据结构,用来存储位的集合,每个位只能是0或1,它通常是一个由二进制位组成的数组,其中每一个位代表一种状态或者标记。
在Redis中,位图常用于处理一些特定场景、如记录用户的签到情况、用户的在线状态,因为位图提供了高效的位级别操作,如设置位、清除位、统计位为1的个数等,因此在这些场景下有较好的性能表现。
总之位图在Redis中是一种高效的数据结构,用于处理位级别的标记和统计。