统计每个活动的用户访问量,且每个用户仅统计一次
场景:统计每个活动的用户访问量,且每个用户仅统计一次。
首先活动表是已经存在了的,一般情况下,我们都会在创建一个用户访问表,其中唯一主键是用户ID+活动ID作为唯一主键
create table user_visist_activity_record(`id` int(11) NOT NULL AUTO_INCREMENT,user_id int(11) NOT NULL COMMENT '用户ID',activity_id int(11) NOT NULL COMMENT '活动ID',`create_id` bigint(20) NULL DEFAULT NULL COMMENT '创建人',`update_id` bigint(20) NULL DEFAULT NULL COMMENT '修改人',`create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',`deleted_ind` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除(0未删除,1删除)',PRIMARY KEY (`id`) USING BTREE,
unique index user_activity(user_id,activity_id)
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '活动访问记录表' ROW_FORMAT = Dynamic;
创建了用户活动的访问记录表,用户访问当期活动时,都会查询一次表格内容,来判断用户是否访问过该用户,如果已存在了,则不走后续逻辑。
在深入思考一下,是否有更高效的方式呢,毕竟每次都需要查询数据库一次,而且这种活动,访问的用户也不少。业务也需要统计多少用户访问了当前页面,功能是无法砍掉。为了保证这个活动不影响主数据库,可能会将当前功能拆分出去,且数据库也非主数据库。那如果没有拆分服务的情况下,又该如何解决呢?
Redis BitMap
此时是否有想到通过redis的方式来解决,毕竟查询redis比查询mysql快多了。
简单介绍一下BitMap
BitMap就是位图,其实也就是字节数组(byte array),用二进制表示,只有 0 和 1 两个数字,位图就是用每一个二进制位来存放或者标记某个元素对应的值。通常是用来判断某个数据存不存在的,因为是用bit为单位来存储所以Bitmap本身会极大的节省储存空间。
如下图字符串在计算机里是由二进制的形式保存的。

在redis中有一个bitMap的数据结构,因为每一个bit都是一条记录,只需要把key值设置成活动ID,而bit为设置用户访问的次数,1代表访问过,0则表示没有访问过。那么就不需要创建表格来统计当前用户是否访问过。甚至也不需要对活动表的用户访问数进行更新。这样的操作至少省略了两次数据库的操作。一次是判断用户对当前记录是否访问过,一次是对活动表的用户访问数进行更新。
业务逻辑
string key = "pre" + activityId;
if(redis.has(key)) {// 第一次访问时,没有key的记录// 判断当前活动是否存在,活动是否过期等业务操作//redis.setBit(key, userId, 1);redis.expire(key, expireTime);
} else {if(redis.getBit(key, userId)) {return}redis.setBit(key, userId, 1);
}
redis bitmap三个操作
- 添加: SETBIT命令
SETBIT key offset value (offset为偏移量,value设置的值,在上述中,将offset设置为用户ID,value直接设置为1)
- 查询:GETBIT命令
GEIBIT KEY OFFSET (offset为偏移量,offset为用户ID)
- 统计:BITCOUNT命令
BITCOUNT key 统计整个key上为1的个数
相关文章:
统计每个活动的用户访问量,且每个用户仅统计一次
场景:统计每个活动的用户访问量,且每个用户仅统计一次。 首先活动表是已经存在了的,一般情况下,我们都会在创建一个用户访问表,其中唯一主键是用户ID活动ID作为唯一主键 create table user_visist_activity_record(i…...
基于SpringBoot的本科生考研率统计系统
基于SpringBoot的本科生考研率统计系统 一、开发技术二、功能模块三、代码结构四、数据库设计五、运行截图六、源码获取 一、开发技术 技术:SpringBoot、MyBatis-Plus、Redis、MySQL、Thymeleaf、Html、Vue、Element-ui。 框架:基于开源框架easy-admin开…...
JMeter正则表达式提取器和JSON提取器基础用法,小白必会!
最近在利用JMeter做接口自动化测试,正则表达式提取器和JSON提取器用的还挺多,想着分享下,希望对大家的接口自动化测试项目有所启发。 在 JMeter 中,正则表达式和 JSON 提取器都是用于从响应数据中提取所需内容,但它们…...
5-26作业
网络聊天室 服务器: 1 #include <myhead.h>2 int main(int argc, const char *argv[])3 {4 if(argc!3)5 {6 printf("请输入IP和端口号\n");7 return -1;8 }9 int sfd socket(AF_INET, SOCK_DGRAM, 0);10 if(…...
2024.05.28学习记录
1. 小林coding 计网复习 2.代码随想录刷题. 图论.和复习数组.链表 3.rosebush完成select组件...
撤销最近一次的提交,使用git revert 和 git reset的区别
文章目录 工作区 暂存区 本地仓库 远程仓库需求:已推送到远程仓库,想要撤销操作git revert (添加新的提交来“反做”之前的更改,云端会残留上次的提交记录)git reset(相当于覆盖上次的提交)1.--…...
MySQL详细安装、配置过程,多图,详解
本文适合centos7环境下安装mysql,在安装和卸载过程中,都在root用户下完成。文章目录 清理环境获取mysql官方yum源安装mysql yum源安装mysql服务安装报错解决办法验证是否安装完成启动mysql服务登录服务方法一:方法二:方法三&#…...
音视频学习规划
文章目录 概述闲聊点 小结 概述 最近在学习音视频,觉得还是要先写个提纲,给自己制定下学习路线及目标。先写下我的个人流程及思路。 ffmpeg的命令ffmpeg api播放器流媒体RTMP,HLS 闲聊点 先说下学习命令行吧,学习命令行是为了…...
代码随想录算法训练营第21天|● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先
二叉搜索树的最小绝对差 题目连接 https://leetcode.cn/problems/minimum-absolute-difference-in-bst/ 思路: 利用二叉搜索树的中序遍历的特性,将二叉树转成有序数组,进而求任意两个数的最小绝对差。 代码 /*** Definition for a bina…...
K8S中Prometheus+Grafana监控
1.介绍 phometheus:当前一套非常流行的开源监控和报警系统。 运行原理:通过HTTP协议周期性抓取被监控组件的状态。输出被监控组件信息的HTTP接口称为exporter。 常用组件大部分都有exporter可以直接使用,比如haproxy,nginx,Mysql,Linux系统信…...
题解:CF1968F(Equal XOR Segments)
题解:CF1968F(Equal XOR Segments) 题目翻译:定义一个序列是好,当且仅当可以将其分成大于 1 1 1 份,使得每个部分的异或和相等。现在给定一个长度为 n n n 的序列 a a a,以及 q q q 次查询…...
Python操作MySQL实战
文章导读 本文用于巩固Pymysql操作MySQL与MySQL操作的知识点,实现一个简易的音乐播放器,拟实现的功能包括:用户登录,窗口显示,加载本地音乐,加入和删除播放列表,播放音乐。 点击此处获取参考源…...
【Linux系统】进程间通信
本篇博客整理了进程间通信的方式管道、 system V IPC的原理,结合大量的系统调用接口,和代码示例,旨在让读者透过进程间通信去体会操作系统的设计思想和管理手段。 目录 一、进程间通信 二、管道 1.匿名管道 1.1-通信原理 1.2-系统调用 …...
北大国际医院腹膜后纤维化课题组 多学科协作开辟治疗新径
腹膜后纤维化(Retroperitoneal Fibrosis,简称RPF)是一种罕见的自身免疫性疾病,其核心特征是纤维组织的异常增生与硬化。这种疾病主要影响肾脏下方的腹主动脉和髂动脉区域,增生的纤维组织会逐渐压迫周围的输尿管和下腔静脉,从而导致一系列并发症,包括主动脉瘤、肾功能衰竭等,甚至…...
面试数据库八股文十问十答第七期
面试数据库八股文十问十答第七期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新! ⭐点赞⭐收藏⭐不迷路!⭐ 1)索引是越多越好吗ÿ…...
【C++题解】1133. 字符串的反码
问题:1133. 字符串的反码 类型:字符串 题目描述: 一个二进制数,将其每一位取反,称之为这个数的反码。下面我们定义一个字符的反码。 如果这是一个小写字符,则它和字符 a 的距离与它的反码和字符 z 的距离…...
【Python编程实战】基于Python语言实现学生信息管理系统
🎩 欢迎来到技术探索的奇幻世界👨💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…...
AI网络爬虫:批量爬取电视猫上面的《庆余年》分集剧情
电视猫上面有《庆余年》分集剧情,如何批量爬取下来呢? 先找到每集的链接地址,都在这个class"epipage clear"的div标签里面的li标签下面的a标签里面: <a href"/drama/Yy0wHDA/episode">1</a> 这个…...
md5强弱碰撞
一,类型。 1.弱比较 php中的""和""在进行比较时,数字和字符串比较或者涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。按照此理,我们可以上传md5编码后是0e的字符串,在…...
【Docker故障处理篇】运行容器报错“docker: failed to register layer...file exists.”解决方法
【Docker故障处理篇】运行容器报错“docker: failed to register layer...file exists.” 一、Docker环境介绍2.1 本次环境介绍2.2 本次实践介绍二、故障现象2.1 运行容器消失2.2 重新运行容器报错三、故障分析四、故障处理4.1 停止 Docker 服务:4.2 备份重要数据4.3 清理冲突…...
Scream:构建网络音频共享的虚拟声卡解决方案
Scream:构建网络音频共享的虚拟声卡解决方案 【免费下载链接】scream Virtual network sound card for Microsoft Windows 项目地址: https://gitcode.com/gh_mirrors/sc/scream 一、核心价值:突破物理限制的音频传输革命 在数字化办公与家庭娱乐…...
Ubuntu系统优化下的LiuJuan20260223Zimage高性能部署
Ubuntu系统优化下的LiuJuan20260223Zimage高性能部署 本文基于Ubuntu 22.04 LTS系统测试,适用于NVIDIA GPU环境 1. 环境准备与系统优化 在开始部署LiuJuan20260223Zimage之前,我们先对Ubuntu系统进行一些基础优化,这些调整能让后续的模型运行…...
3分钟夺回你的数字音乐资产:Unlock Music浏览器解密全攻略 [特殊字符]
3分钟夺回你的数字音乐资产:Unlock Music浏览器解密全攻略 🎵 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web…...
保姆级教程:用ESP8266-01S和机智云固件,5分钟搞定智能硬件联网(附烧录软件下载)
5分钟极速上手:ESP8266-01S与机智云固件实战指南 当你想把一盏台灯变成手机可控的智能设备,或是让温湿度传感器数据实时上传云端时,ESP8266-01S这个小巧的Wi-Fi模块就是最佳选择。它价格低廉、功能强大,配合机智云的固件…...
从噪声到艺术:深入解析扩散模型采样算法的核心步骤
1. 扩散模型:当数学遇见艺术创作 想象一下,你正在看一位画家作画。他一开始只是在画布上随意涂抹颜料,看起来毫无章法。但随着画笔的不断调整,那些混乱的色块逐渐形成了清晰的轮廓,最终变成一幅精美的画作。这正是扩散…...
新手友好:在快马平台通过生成式ai轻松上手tomcat与servlet开发
作为一个Java Web开发的新手,刚开始接触Tomcat和Servlet时确实会遇到不少困惑。记得我第一次尝试搭建环境时,光是配置Tomcat服务器就折腾了大半天,更别提理解Servlet的运行机制了。直到发现了InsCode(快马)平台,才真正找到了快速上…...
Python实战:构建个人古诗知识库,从古诗文网高效采集与存储
1. 为什么你需要一个古诗知识库? 作为一个诗词爱好者,我经常遇到这样的困扰:读到一首好诗想收藏,结果过几天就忘了出处;想查找某个主题的诗句,却记不清具体内容;看到喜欢的诗人作品,…...
如何用anyRTC-RTMP-OpenSource打造个性化直播数据源:自定义视频采集完整指南
如何用anyRTC-RTMP-OpenSource打造个性化直播数据源:自定义视频采集完整指南 【免费下载链接】anyRTC-RTMP-OpenSource RTMP 推流器,RTMP(HLS)秒开播放器,直播点播,跨平台(Win,IOS,Android)开源代码 项目…...
CMake构建类型避坑指南:为什么你的Release模式没有优化?CMAKE_BUILD_TYPE常见问题排查
CMake构建类型避坑指南:为什么你的Release模式没有优化? 在C项目开发中,构建类型的选择直接影响最终生成的可执行文件性能。许多开发者在使用CMake时都遇到过这样的困惑:明明设置了CMAKE_BUILD_TYPERelease,但生成的代…...
Phi-4-mini-reasoning快速上手:3步完成vLLM服务部署+Chainlit前端验证
Phi-4-mini-reasoning快速上手:3步完成vLLM服务部署Chainlit前端验证 1. 模型简介 Phi-4-mini-reasoning 是一个基于合成数据构建的轻量级开源模型,专注于高质量、密集推理的数据处理能力。作为Phi-4模型家族的一员,它经过专门微调以提升数…...
