签到中如何设计签到表?为什么这么设计?
签到的主要功能就是记录那个用户在什么时间进行了打卡这样一个动作。
我们使用redis中的bitmap位图来存储签到表数据。以用户id和签到日期为key,value部分以二进制为单位存储,正好可以映射成为月份下的每一天,0和1刚好可以表示打卡和未打卡两种情况。如果是按照传统的在mysql中建表,虽然可以正常运行,但是每条签到记录都会占用差不多22个字节的空间,常年累月的积累下来,就会造成空间的浪费。而采用bitmap存储,一个人一个月的签到记录最多也只占用31bit,差不多4个字节。不仅节约空间,而且效率也会更高。
如何开发一个积分功能?
单独创建积分微服务,借助MQ来实现。(引用的地方不多,比如整个项目只有某一个服务用到积分,可以直接在该服务中创建积分明细表进行操作的)。
然后,根据积分规则,在相关的业务层,向MQ 发起消息。比如,在签到中,每次打卡成功后,向MQ投递一个消息,积分微服务作为消息消费者监听MQ,一旦监听到消息,就新增积分。在新增积分的时候,考略到一些业务积分是有上限的,比如学习,提问这些都要设置上限,避免用户无休止的刷积。所以,我们在新增的时候,都会先判断是否存在上限,如果没有,直接保存积分记录即可;如果有,我们还要根据当天的积分获取情况与上限进行判断,超过了不予添加,只要没有达到上限,才能添加积分。
redis 跳表
跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针从而达到快速访问节点的目的。
redis pipeline
Redis的执行包含发送命令
、命令排队
、命令执行
、结果响应
四个步骤,一条一条的执行,UI影响性能,这与Redis的高性能背道而驰。而Pipeline
,就可以Redis 命令进行组装,通过一次传输给 Redis 并返回结果集。效果和MySql的批量操作类似。