一、什么是积分
在互联网应用中经常会有积分的概念,会员积分是一种成长手段,就像游戏中的等级一样,通过积分叠加,让用户深刻感受到自己的价值在提升。
积分的诞生远早于互联网产品,积分从本质上讲是衡量用户消费或贡献行为的标尺,是维护忠诚度的一个重要手段。
在积分运营中,积分一般作为商家向会员或顾客发行的虚拟货币而存在。用户通过特定行为获取积分,再通过积分兑换奖品、优惠券、特权等商品来消耗积分。
在电商体系中,要获取更多积分往往需要产生更多消费额,而获得的积分又可以在消费时抵扣部分现金,这方面主要的代表是京东的京豆。
在兴趣社区中,用户发表越多精华帖子、参与越多互动,就能获得越多积分,积分不仅与社区内的虚拟身份等级挂钩,也能用来解锁某些特权或兑换社区周边。
二、为啥需要积分服务
企业一直以来的发展方式,大都离不开推陈出新、吸引新客户、拓展销售渠道,而随着企业地不断发展,企业往往会面临新品推广困难、拉新乏力、客户不活跃、复购率低等难以解决的痛点。而搭建积分商城,却可以帮助企业解决这些问题。
吸引新用户
企业可以设置多种积分获取途径,增加客户手上的积分数量,并在积分商城平台上设置多种不同类型的积分兑换方式,吸引新客户持续访问,并以新用户专享福利等方式,刺激用户完成首单转化(目的),拉动复购
激活老客户
对那些活跃度不高的老客户,可以采取积分赠送、签到送积分、发放优惠券等形式来进行唤醒,达到再次消费的目的。积分助力产生会员等级,等级为顾客带来不同权益,同时可以给消费者带来荣誉感和尊享感,满足消费者心理需求;
提升留存
企业可以借助积分这种载体,来强化客户权益,来让忠实的客户享受到一定的高折扣优惠以及积分兑换权益,对提升客户留存非常有帮助。
三、积分的获取途径
积分获取的设计主要包括两部分:一是确定哪些行为可以获取积分;二是确定积分兑换比例。
以增长黑客模型(AARRR)作为目标基础,奖励的行为可以一般分为四个维度:打开、活跃、消费、传播。
打开。很多APP之所以设置签到领积分的功能,主要是因为打开是所有用户行为的基础。此外有些APP还会设置连续签到还能获得递增的积分奖励,很多游戏就采用每日签到领奖品的方式保持用户的打开习惯。比签到门槛更低的是每日登录,只要打开app,无需点击任何按钮就能获得积分。
活跃。只有打开还不够,为了让新用户快速了解产品,形成用户粘性,活跃维度的积分奖励一般远高于打开。一般社区类产品,一般会将UGC相关行为设置很高的积分奖励,尤其是精华UGC内容。
消费。一般电商类产品会尤其注重消费指标,消费获得的积分一般都可以方便折算出回馈比例,给消费者下次消费时的抵扣现金,用来鼓励用户复购。
传播。为了提升产品自传播,鼓励用户分享平台内容,内容类产品往往会设置转发积分,让用户更有动力去分享平台优质内容,进而达到拉新效果。这方便比较有代表性的是趣头条的邀请好友模式。
四、数据库表设计
项目初期,我们首先设计了签到表所需的信息字段,设计了具体的签到数据表。
签到最核心的包含两个要素:
• 谁签到:用户id
• 什么时候签的:签到日期
同时要考虑一些功能要素,比如:
• 补签功能,所以要有补签标示
• 按照年、月统计的功能:所以签到日期可以按照年、月、日分离保存
根据产品原型可以得到积分表需要记录下列信息:
• 本次得到积分值
• 积分方式
• 获取积分时间
• 获取积分的人
use tj_learning;
CREATE TABLE IF NOT EXISTS `points_record` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '积分记录表id',
`user_id` bigint NOT NULL COMMENT '用户id',
`type` tinyint NOT NULL COMMENT '积分方式:1-课程学习,2-每日签到,3-课程问答, 4-课程笔记,5-课程评价',
`points` tinyint NOT NULL COMMENT '积分值',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_user_id` (`user_id`,`type`) USING BTREE,
KEY `idx_create_time` (`create_time`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='学习积分记录,每个月底清零';
签到表优化(Bitmap)
通过观察签到表的设计,我们会发现一条签到记录就会占用22个字节,而我们每天的签到记录有很多,这样会很浪费空间。为了节省存储空间,我们可以使用类似于下面的结果保存某个用户一月份的打卡记录
它把每一个bit为对应当月的每一天,形成映射关系,用0和1分别标识是否打卡,这种思路称为bitmap(位图)而我们的redis中恰好提供了bitmap的数据结构和相关操作命令,我们可以直接使用。0
Bitmap数据结构、常用命令
在Redis中,bitmap底层还是基于String类型实现的, 存储数据是以二进制(bit位)为单位进行存储的
bitmap在处理大量数据统计和判断时,可以只占用非常小的一部分内存,并且计算速度非常高效!
下面是Redis中bitmap的操作命令
命令 | 作用 |
---|---|
setbit key offset value | 根据偏移量(索引)设置值,值只能是0和1 ,返回对应偏移量上的旧值 |
getbit key offset | 获取指定偏移量上的值 |
bitconut key | 统计指定范围值为1的个数 |
Bitfield key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP | SAT |
五、签到业务
(一)查询签到
需求介绍:在签到日历中,需要把当前登录用户本月第一天到今天为止的所有签到过的日期高亮显示。
因此我们必须把签到记录返回,具体来说就是每一天是否签到的数据。是否签到,就是0或1,刚好在前端0和1代表false和true,也就是签到或没签到。
因此,每一天的签到结果就是一个0或1的数字,我们最终返回的结果是一个0或1组成的数组,对应从本月第1天到今天为止每一天的签到情况。
接口设计:
(二)新增签到
在个人中心的积分页面,用户每天都可以签到一次:
而在后台,要做的事情就是把BitMap中的与签到日期对应的bit位设置为1
另外,为了便于统计,我们计划每个月为每个用户生成一个独立的KEY,因此KEY中必须包含用户信息、月份信息,长这样:
接口设计:
六、积分业务
(一)新增积分
需求分析:
用户签到、学习、参与互动问答、提交学习笔记等行为都可以产生积分,并基于积分形成排行榜。积分当月有效,月底清零。
由积分规则可知,获取积分的行为多种多样,而且每一种行为都有自己的独立业务。而这些行为产生的时候需要保存一条积分明细到数据库。
我们显然不能要求其它业务的开发者在开发时帮我们新增一条积分记录,这样会导致原有业务与积分业务耦合。
因此必须采用异步方式,将原有业务与积分业务解耦。如果有必要,甚至可以将积分业务抽离,作为独立微服务。
要实现服务之间的解耦,可以使用MQ,实现流程如下:
MQ消息监听流程:
(二)查询积分
在个人中心,用户可以查看当天各种不同类型的已获得的积分和积分上限:
可以看到,页面需要的数据:
• 积分类型描述
• 今日已获取积分值
• 积分上限
接口设计:
七、相关知识点面试题
1.业务相关
答:如上回答。