积分与签到设计

积分

        在交互系统中,可以通过看视频、发评论、点赞、签到等操作获取积分,获取的积分又可以参与排行榜、兑换优惠券等,提高用户使用系统的积极性,实现引流。这些功能在很多项目中都很常见,关于功能的实现我的思路如下。

1.1 积分规则

用户在使用我们xx系统时,可以通过各种交互行为产生积分,不同类型的行为获得不等的分数,比如:

1.签到规则

        签到1天给1分

        连续7天额外奖励10分

        连续14天额外奖励20分

        连续28天额外奖励40分

        每月签到进度当月第一天重置

2.学习规则

        每学习一小节积分+10,每天获得上限50分

3.交互规则(有效交互数据参与积分规则,无效数据会被删除)

        写评价,积分+10    每日获得上限为50分

        写问答,积分+5      每日获得上限为20分

        写笔记,积分+3,每次被采集+2     每日获得上限为20分

原型图类似下图所示:

1.2 积分数据表设计

根据产品原型可以得到积分表需要记录信息有:本次得到积分值、积分方式、获取积分时间、

获取积分的人。

所以积分表里需要设计的字段有:积分记录表id、用户id、积分方式(1-课程学习,2-每日签到,3-课程问答, 4-课程笔记,5-课程评价)、积分值、创建时间。

1.3  签到

1.3.1 数据库表设计

签到最核心的包含两个要素:

  • 谁签到:用户id
  • 什么时候签的:签到日期

同时要考虑一些功能要素,比如:

  • 补签功能,所以要有补签标示
  • 按照年、月统计的功能:所以签到日期可以按照年、月、日分离保存

所以签到表里需要设计的字段有:主键id、用户id、签到日期、签到月份、签到年份、是否补签。

1.3.2 签到设计优化:Bitmap

但是,通过观察签到表的设计,会发现一条签到记录就会占用22个字节,如果每天有很多用户签到,一个月就会有大量签到记录,这样会非常浪费空间,针对这一问题我们可以采用Redis提供的bitmap(位图)这一数据结构进行优化。

我们可以使用bitmap将用户一个月的签到记录保存为一条数据存入数据库,每一个bit为对应当月的每一天,形成映射关系,用0和1分别标识是否打卡。

在Redis中,bitmap底层还是基于String类型实现的, 存储数据是以二进制(bit位)为单位进行存储的bitmap在处理大量数据统计和判断时,可以只占用非常小的一部分内存,并且计算速度非常高效

1.3.3 签到的功能实现:查询和新增

  • 查询签到:
    • 在签到日历中,把当前登录用户本月第一天到今天为止的所有签到过的日期高亮显示;今天若未打卡,则前端显示蓝色“打卡”,若已打卡,则前端显示蓝色“已打卡”。
    • 需要返回每日签到记录,0表示未签到,前端显示灰色;1表示已签到,前端高亮显示。
    • 最终返回一个由0或1组成的数组,对应从本月第1天到今天为止每一天的签到情况。
  • 新增签到:
    • 在个人中心的积分页面,用户每天都可以签到一次,签到成功则把BitMap中的与签到日期对应的bit位设置为1。
    • 为了便于统计,组装签到记录,保存到redis的bitMap,可以将每个月为每个用户生成一个独立的KEY,KEY中包含用户信息、月份信息,即sign:用户id:日期。
    • 获取连续签到的天数,计算连续签到积分,保存到积分表。

1.4 新增积分

        用户签到、学习、参与互动问答、提交学习笔记等行为都可以产生积分,并基于积分形成排行榜。积分当月有效,月底清零。

        由积分规则可知,获取积分的行为多种多样,而且每一种行为都有自己的独立业务。而这些行为产生的时候需要保存一条积分明细到数据库。

        我们显然不能要求其它业务的开发者在开发时帮我们新增一条积分记录,这样会导致原有业务与积分业务耦合。因此必须采用异步方式,将原有业务与积分业务解耦。如果有必要,甚至可以将积分业务抽离,作为独立微服务。

        所以我的实现思路是使用MQ实现服务之间的解耦:

  • 在所有可以获取积分的业务( 用户签到、学习、参与互动问答、提交学习笔记等)中发送MQ消息
  • 根据不同的积分获取方式,编写不同的消息监听器,监听保存积分的消息,让实现积分的添加
  • 添加积分:
    • 判断当前积分类型是否有上线,如果以达到上限,根据上线确定本次积分保存大小
    • 未达到上线,查询今天本类型已经获取了多少分,判断是否已经到达今日分数上线
    • 如果积分超出每日上限,不做操作,结束程序
    • 如果积分不足每日上限,并且加上本次会超过上限,只保存欠额部分

1.5 查询积分

在个人中心,用户可以查看当天各种不同类型的已获得的积分和积分上限,即需返回的数据有积分类型描述、今日已获取积分值、 积分上限。

总结

1. 设计签到功能时,为什么采用BitMap?

答:使用BitMap是以二进制0 1来表示数据的,0表示未签到,1表示已签到,这样就可以将一个人一个月份的签到记录保存到一条数据中,大大的节省了空间的使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/951107.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Taro+Vue实现图片裁剪组件

cropper-image-taro-vue3 组件库 介绍 cropper-image-taro-vue3 是一个基于 Vue 3 和 Taro 开发的裁剪工具组件,支持图片裁剪、裁剪框拖动、缩放和输出裁剪后的图片。该组件适用于 Vue 3 和 Taro 环境,可以在网页、小程序等平台中使用。 源码 https:…

AI赋能服装零售:商品计划智能化,化危机为转机

在服装零售这片竞争激烈的战场上,每一个细微的决策都可能成为品牌兴衰的关键。当市场波动、消费者口味变化、供应链挑战接踵而至时,许多品牌往往将危机归咎于外部环境。然而,真相往往更为深刻——“危机不是外部的,而是你的商品计…

Flutter:吸顶效果

在分页中,实现tab吸顶。 TDNavBar的screenAdaptation: true, 开启屏幕适配。 该属性已自动对不同手机状态栏高度进行适配。我们只需关注如何实现吸顶。 view import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import p…

企业级PHP异步RabbitMQ协程版客户端 2.0 正式发布

概述 workerman/rabbitmq 是一个异步RabbitMQ客户端,使用AMQP协议。 RabbitMQ是一个基于AMQP(高级消息队列协议)实现的开源消息组件,它主要用于在分布式系统中存储和转发消息。RabbitMQ由高性能、高可用以及高扩展性出名的Erlan…

信号弱开启手机Wifi通话,MIUI显示/隐藏5G开关的方法

1.开启手机Wi-Fi通话,提升无信号或弱信号时的通话质量 Wi-Fi 通话(Wi-Fi calling),又称VoWiFi,是一项名为“ Voice over Wi-Fi ”的服务,它允许手机用户使用他们的智能手机使用 Wi-Fi网络拨打电话,即在Wi-Fi环境下就能…

Echarts的认识和基本用法

Echarts介绍和使用 Echarts介绍 官网地址:Apache ECharts Echarts是一个基于JavaScript的开源可视化图表库,由百度前端开发团队研发和维护。它提供了丰富的图表类型、数据统计分析、动态数据更新、多维数据展示等功能,可以帮助开发人员在 W…

在JavaScript开发中,如何判断对象自身为空?

前言 如何判断一个对象为空是我们在开发中经常会遇到的问题,今天我们来聊聊几种经常使用的方法,以及在不同的场景下我们如何去使用。 1. JSON.stringify JSON.stringify 方法可以使对象序列化,转为相应的 JSON 格式。 const obj {};cons…

大语言模型训练的数据集从哪里来?

继续上篇文章的内容说说大语言模型预训练的数据集从哪里来以及为什么互联网上的数据已经被耗尽这个说法并不专业,再谈谈大语言模型预训练数据集的优化思路。 1. GPT2使用的数据集是WebText,该数据集大概40GB,由OpenAI创建,主要内…

Wireshark 学习笔记1

1.wireshark是什么 wireshark是一个可以进行数据包的捕获和分析的软件 2.基本使用过程 (1)选择合适的网卡 (2)开始捕获数据包 (3)过滤掉无用的数据包 (4)将捕获到的数据包保存为文件…

RK3568平台(USB篇)禁用USB端口

一.linux中怎样查看usb的端口号 在USB口插入U盘: [ 198.141319][ T106] usb 3-1.3: new SuperSpeed Gen 1 USB device number 5 using xhci-hcd [ 198.161695][ T106] usb 3-1.3: New USB device found, idVendor=0781, idProduct=5591, bcdDevice= 1.00 [ 198.161721]…

3298.统计重新排列后包含另一个字符串的字符串数目 I II滑动窗口 优化思路解析全网最详细

II相比于I是数据范围变成了10的6次方了 我们来维护大小关系,把不用的都去掉,优化到O(26n) 首先判断一下要找子字符串的s长度是否小于t字符串,如果小于的话直接返回0 初始答案变量和left左指针为0 用Counter来记录t中所…

双向导航和单向导航

目录 双向导航 单向导航 迁移数据库异常 解决办法 1.导航属性改为空 2.使用 ON DELETE NO ACTION 或 ON UPDATE NO ACTION 选择 双向导航 一对多:一个Article有多个Comment class Article {public long Id { get; set; }public string Title { get; set; }pu…

静态路由配置与调试——计算机网络实训day1

TOC 软件及基本配置下载 通过网盘分享的文件:计网实训 链接: https://pan.baidu.com/s/1AY5qNSN1dnw5Vy1OtwdJGg?pwdijde 提取码: ijde 操作前准备 1.下载软件 2.双击1.基本配置.pkt 3.进入实验环境 一、实验目的 1、掌握路由器的基本配置; 2、掌握…

EasyExcel上传校验文件错误信息放到文件里以Base64 返回给前端

产品需求: 前端上传个csv 或 excel 文件,文件共4列,验证文件大小,类型,文件名长度,文件内容,如果某行某个单元格数据验证不通过,就把错误信息放到这行第五列,然后把带有…

EtherCAT转Modbus网关与TwinCAT3的连接及配置详述

在工业自动化控制系统中,常常需要整合不同的通信协议设备。本案例旨在展示如何利用捷米特JM-ECT-RTU协议转换网关模块,实现 EtherCAT 网络与 Modbus 设备之间的无缝连接,并在 TwinCAT3 环境中进行有效配置,以构建一个稳定可靠的自…

Linux 工作队列

系列文章目录 Linux内核学习 Linux 知识(1) Linux 知识(2) Linux 工作队列 Linux 内核源代码情景分析(一) Linux 设备驱动程序(二) 文章目录 系列文章目录综述工作(work_…

如何评价deepseek-V3 VS OpenAI o1 自然语言处理成Sql的能力

DeepSeek-V3 介绍 在目前大模型主流榜单中,DeepSeek-V3 在开源模型中位列榜首,与世界上最先进的闭源模型不分伯仲。 准备工作: 笔者只演示实例o1 VS DeepSeek-V3两个模型,大家可以自行验证结果或者实验更多场景,同时…

【UI自动化测试】selenium八种定位方式

🏡个人主页:謬熙,欢迎各位大佬到访❤️❤️❤️~ 👲个人简介:本人编程小白,正在学习互联网求职知识…… 如果您觉得本文对您有帮助的话,记得点赞👍、收藏⭐️、评论💬&am…

百度视频搜索架构演进

导读 随着信息技术的迅猛发展,搜索引擎作为人们获取信息的主要途径,其背后的技术架构也在不断演进。本文详细阐述了近年来视频搜索排序框架的重大变革,特别是在大模型技术需求驱动下,如何从传统的多阶段级联框架逐步演变为更加高…

sequelize-cli 多对多关系处理 及某一单项游戏根据成绩降序排名

一、生成模型 Game(游戏表)GameGrades(游戏成绩表)GameUser(用户表) 1.1 对非中间表 做多对多逻辑处理 Game模型 static associate(models) {// define association heremodels.GameUser.belongsToMany(models.Game, {through: models.GameGrade,fore…