5-1 你们项目中签到为什么要使用bitmap
1.原因:我们项目中要实现一个积分的功能,而签到获取积分是重点解决对象,最初设计了签到表。通过观察签到表,我们会发现一条签到记录就会占用22个字节,
而每天的签到记录有很多,这样会很浪费空间 ,为了节省存储空间,所以选择使用bitmap。
2.思路:把每一个bit为对应当月的每一天,形成映射关系,用0和1分别标识是否打卡。
bitmap在处理大量数据统计和判断时,可以只占用非常小的一部分内存,并且计算速度非常高效!而我们的redis中恰好提供了bitmap的数据结构和相关操作命令,可以直接使用。
5-2 你们项目中积分功能是如何实现的
在我们项目中,积分是一个独立通用的微服务。用户签到、学习、互动问答、提交学习笔记等行为都可以产生积分【业务方面】。
下面是积分的实现方式:
1.首先,我们设置了专门的监听器,监听队列并将数据保存到库中。当用户获得积分时,会向rabbitmq中发送消息(编写程序监听MQ,消费消息,消息主要包括:用户id,增加的积分,类型)。
2.然后,保存时判断是否为每日签到,非每日签到类型每日都有积分上限。积分值与行为类型有关,不同类型的操作获得不等的分数
如果不是每日签到,则查询数据库中用户今天某种行为方式已经获得的积分,如果该积分大于等于该类型每日积分的上限,直接返回;如果该积分加上奖励增加的积分大于等于该类型每日积分的上限,那么就把增加的积分改为上限减去查询的积分。
以上就是积分功能的大致实现思路。
补充Redis:
跳表:zset底层数据结构,建立多层索引,快速查找。
优点:简单、高效的查找、插入和删除操作,以及相对容易实现。
缺点:占用更多的内存空间,并且在高并发写入的情况下可能会导致性能下降。
pipeline(管道):redis的批量操作。保存数据时,一个请求中所有数据一起发送,一次性接收所有的响应。总之,pipeline是一种用于批量执行命令的机制,能够显著提高Redis操作的效率,特别适用于需要批量操作的场景,比如批量写入数据、批量读取数据等。
bitmap(位图):
1.布隆过滤器是一种空间效率很高的概率型数据结构,它可以用位图来表示数据的存在与否。布隆过滤器常用于判断一个元素是否可能存在于一个集合中,比如在缓存系统中用于判断某个数据是否存在于缓存中。例如,可用于签到。
2.位图还可以用于实时统计,比如统计网站的访问量、用户活跃度等信息。