5-1 你们项目中签到为什么要使用bitmap
用bitmap存的话,最主要的原因是更节省空间,因为签到表的核心列就只有两个,一个是用户id,一个是签到日期,如果我们用数据库存储的话,会有大量的重复数据,而且如果想实现连续签到发放积分奖励的话,用数据库存储业务实现起来比较复杂,此时就想到了redis里的bitmap,他实际上就是String类型的二进制的字符串,如果用它存储签到信息的话,可以节省大量的空间,并且效率也是非常高的,如果要计算该用户连续签到的天数,我们只需要反转该用户对应key的bitmap的值,所以我们用bitmap实现签到功能。
5-2 你们项目中积分功能是如何实现的
用户签到、学习、参与互动问答、提交学习笔记等行为都可以产生积分,并基于积分形成排行榜。积分当月有效,月底清零。
因此必须采用异步方式,将原有业务与积分业务解耦。如果有必要,甚至可以将积分业务抽离,作为独立微服务。
1.首先用户在获得到积分后,前端会发送请求给后端,后端接收到请求后需要将消息投递到RabbitMq中。
2.后端需要再写一个监听器,监听队列并将数据保存到库中。
3.保存时需要判断是否到达积分上限,如果已经到达上限则直接结束程序,没有到达上限则判断用户获得的积分加上需要保存的积分是否小于上限,如果是则直接保存,反之,则加到积分上限,然后保存到数据库
这就是我项目中积分功能的使用。
5-3 Redis三大新面试点: 跳表、pipeline、bitmap
跳表:单链表 + 索引的方式实现,以空间换时间的形式,提高查找速度。Redis中的ZSet就用到跳表结构。就是元素按照升序排列存储 节点可能包含多个指针,指针跨度不同,查找时从顶层向下,不断缩小搜索范围。
Pipeline:Redis中的Pipeline是一种在客户端和服务器之间批量发送命令的机制。它可以在一次网络往返中发送多个命令,有效地减少了网络延迟的影响。通过Pipeline,客户端可以一次性发送多个命令给服务器,然后一次性接收服务器的响应。这样可以大大提升Redis的性能,特别是在需要执行多个命令的场景下。
bitmap:在Redis中,bitmap底层还是基于String类型实现的, 存储数据是以二进制(bit位)为单位进行存储的。