5-1 你们项目中签到为什么要使用bitmap
因为我们每天签到记录有很多,如果将签到设计成数据库表结构进行存储,会浪费很多空间。为了节省储存空间,我们使用了bitmap。
bitmap中每一个bit为对应当月的每一天,形成映射关系,用0和1分别标识是否打卡。而redis中恰好提供了bitmap数据结构和有关操作命令,可直接使用。在Rdis中,bitmap底层还是基于String类型实现的,存储数据是以二进制为单位进行存储的,这样一条redis记录就可以储存一个用户一个月份的打卡记录,占用非常小的一部分内存,计算速度也非常的高效。
5-2 你们项目中积分功能是如何实现的
在我们项目中用户签到、学习、参与互动问答、提交学习笔记等行为都可以产生积分,并基于积分形成排行榜。
这些微服务模块获取积分并把积分业务发送到MQ队列中。保存积分模块写在学习微服务中,监听不同积分获取方式消息队列中的消息,进行判断。判断该积分获取方式,是否有积分上限限制,如果有则查询今日已得积分,然后比较是否超过每日上限。如果没超过,正常保存积分记录。如果超过积分上限,则按积分上限进行存储。
5-3 Redis三大新面试点: 跳表、pipeline、bitmap
跳表:跳表是一种用于实现有序集合的数据结构,它通过添加多级索引来加速有序集合的查询操作。跳表的基本思想是在原始链表的基础上,添加额外的索引层。每个索引层都是一个有序的链表,每个节点包含只想下一层节点的指针。通过这些索引层,可以在教高级别的链表中跳过一些节点,从而快速地定位目标节点,从而提高查询效率。
pipeline:Redis中的一种优化技术,允许客户端在一次通信中发送多个命令,并在接收响应时一次性获取所有结果。这种批量操作可以减少网络开销和延迟,提高系统吞吐量。通过使用pipeline,客户端可以在不同命令间建立依赖关系没实现更复杂的操作。
bitmap:bitmap(位图)是一种数据结构。它是由一连串二进制位组成的,每个位只有两个可能的取值:0或1,每个比特位可以表示某个元素是否存在或某个属性是否成立。
位图在很多场景下都有广泛的应用,比如统计用户活跃度,进行布隆过滤器等。它的优势在于占用内存空间比较小,且支持高效的位级操作,能快速处理大量的二进制数据。