5-1 你们项目中签到为什么要使用bitmap
bitmap是以二进制0和1来表示数据的,在我们项目中,用0 表示未签到,1表示已签到,这样就把一个人在某个月份签到记录放到了一条记录里,可以非常高效地表示和查询用户的签到记录,很大程度上节省了存储空间。
5-2 你们项目中积分功能是如何实现的
在的我项目中积分微服务是一个独立且通用的微服务,可以通过签到、课程学习、评价、问答和笔记等方式获取积分,主要流程如下:
首先,在签到和问答对应的的微服务中找到获取积分的业务,向MQ投递消息。消息主要包括:用户id、增加的积分、增加积分的类型;
其次,在学习微服务中编写程序监听MQ,消费消息;
在编写程序时:
第一步先判断积分类型是否为签到,不是签到类型的话,要对应每个类型的每日积分上限;
第二步查询数据库中对应类型今日已经获取的积分,与对应类型每日上限进行判断,如果该积分大于等于对应类型的积分上限,则直接返回;如果该积分加上增加的积分大于等于对应类型的积分上限,则增加的积分等于该类型上限积分减去查询的积分;
最后把这条记录保存到数据库中;
以上就是我项目中积分功能的实现。
5-3 Redis三大新面试点: 跳表、pipeline、bitmap
跳表是一种数据结构,它通过在有序链表上方建立多层索引来提高查找效率。Redis 中的有序集合ZSet就是使用跳表来实现的,其中集合中的元素按照分数score有序排列。
跳表由多层链表组成,通过在不同层次建立索引,实现了快速的查找,在实际使用中,跳表的特性使得有序集合在查找、插入和范围查询等操作上表现得较为高效。
总之,跳表的使用在Redis中主要体现在有序集合的实现上,提供了对有序集合进行高效操作的手段。
在Redis中,pipeline是一种用于批量执行多个命令的机制,它可以在一个网络往返中发送多个命令,并在一个网络往返中接收它们的响应,这样减少了网络往返的次数和网络开销,可以大大提高性能。
总之在实际应用中,pipeline通常用于批量写入或读取大量数据时,以及需要原子性操作的场景。
在Redis中,bitmap是一种数据结构,用于存储位集合或位图;它是一个由二进制位组成的数据结构,其中每个位都是用0和1进行存储;每个位表示某种状态或标志。
由于每个位只占1个bit,在存储信息时非常节省空间;
bitmap的使用场景也有很多,例如:用户在线状态(0离线、1在线)、用户签到记录(0当天未签到、1当天已签到)等等。
总之,bitmap是一种简单而高效的数据结构,通常用于判断某个数据是否存在。