当前位置: 首页 > news >正文

Redis全系列学习基础篇之位图(bitmap)常用命令的解析

文章目录

  • 描述
  • 常用命令及解析
    • 常用命令
    • 解析
  • 应用场景
    • 统计不确定时间周期内用户登录情况
      • 思路分析
      • 实现
    • 统计某一特定时间内活跃用户(登录一次即算活跃)的数量
      • 思路分析与实现

描述

  bitmap是redis封装的用于针对位(bit)的操作,其特点是计算效率高,占用空间少,常被用来统计用户签到、登录等场景

常用命令及解析

常用命令

  • setbit key offset value
      给key在指定位索引位置上(offset)设置一个value,因为是bit所以value只能为0或1;如setbit zhangsan 2 1表示在位索引的2号位设置为1,对应的二进制位应该是0010 0000
  • getbit key offset
      获取key在指定位索引位置上对应的二进制值,要么是0要么是1
  • bitcount key [start end]
      统计key在给定的字节索引范围内1出现的次数;如bitcount zhangsan 1 2表示统计张三在字节所以1-2之间1出现的次数
  • bitpos key bit [start] [end]
      统计key对应的二进制串中指定的bit(1或0)在指定字节索引下标内第一次出现的位置,没有出现返回-1;
  • bitop operation destkey key [key …]
      将两个或多个key的二进制位进行或、与的操作然后赋值给指定的新key(destkey);如bitop and k3 k1 k2表示将k1和k2按与操作后赋值给k3

解析

  针对上面的常用命令,如果是初识的话有可能会比较蒙蔽,下面结合我画的图来进行解析;首先需要明确的一点是上文提到的offset(偏移量)指的是bit(位)的索引位置,一个字节等于8个bit,bit的索引下标从0开始;然后命令里的start end这些表示的是字节索引位置,如[0,2]表示字节的0到2的区间,相当于3个字节对应bit位置的0-24,下面上图:
image
针对上图我们再跑一遍上面的常用命令进行解析:

  • setbit zhangsan 3 1 表示将bit下标为3的位置设置为1,二进制表示如下:0001 0000
  • getbit zhangsan 3 表示获取bit下标为3位置上的二进制值为1,如果getbit zhangsan 2则值为0
  • bitcount zhangsan 0 1 表示获取字节下标0-1(相当于bit下标的0-15)之间位置内1出现的次数,这里结果为1
  • bitpos zhangsan 1 0 1 表示获取字节下标0-1(相当于bit下标的0-15)之间位置内1第一次出现的次数,因为上面设置了zhangsan对应的二进制为0001 0000,所以这里结果应为3
  • bitop operation destkey key [key …] 这是bitop前再设置一个key,setbit lisi 2 1,然后执行bitop or k3 zhangsan lisi,这时k3的值因为zhangsan/lisi二进制or运算后的值,应为0011 0000;

应用场景

统计不确定时间周期内用户登录情况

  比方说需要统计20220101-20220107区间内用户登录的次数

思路分析

  针对用户量不是那么多且登录不频繁的非互联网型的应用,利用mysql维护一张用户登录的日志表就能解决问题,但是假设用户量过大且用户登录次数频繁的情况下,mysql就并不是最优解了;这时可以结合使用bitmap来实现这一需求

实现

  在redis里维护一个key为用户id的bitmap,用户每次登录时setbit userId offset 1;需要注意的是这里的offset需要进行计算映射,将bit的下标与一年的365天对应上;统计的时候根据不同需求有好几种实现;
1、bitcount userId 0 -1 统计用户一年登录的次数
2、根据具体查询区间循环getbit userId offset;如查询20220101-20220107区间内用户登录的次数则先找到20220101-10对应的偏移量接着循环getbit,判断结果,如果是1则给登录天数加1即可

统计某一特定时间内活跃用户(登录一次即算活跃)的数量

思路分析与实现

  将日期作为key,offset映射成不同的用户id,当不同的用户登录时setbit 20210101 offset,如:
setbit 20220101 0 1
setbit 20220102 1 1
setbit 20220102 0 1
setbit 20220102 2 1
以日期为key,将用户id与位索引提前做好映射,比方说0位表示张三1位表示李四2位表示王五,当张三登录时在0位设置1,李四登录在1位设置1,王五登录在2位设置1,统计指定时间时将指定时间对应的key做bitop操作即可,如下:bitop or k3 20220101 20220102 上面命令表示将20220101和02这两个key做or操作,因为二进制or操作是有1即是1,最后统计k3里1出现的次数即得出20210101到02之间活跃用户数为3:bitcount k3 0 -1

相关文章:

Redis全系列学习基础篇之位图(bitmap)常用命令的解析

文章目录 描述常用命令及解析常用命令解析 应用场景统计不确定时间周期内用户登录情况思路分析实现 统计某一特定时间内活跃用户(登录一次即算活跃)的数量思路分析与实现 描述 bitmap是redis封装的用于针对位(bit)的操作,其特点是计算效率高,占用空间少,常被用来统计…...

Copilot功能

Copilot 1、简介:Copilot是由GitHub与OpenAI共同开发的一款AI编程助手,旨在帮助开发者提高工作效率,改善代码质量。 2、主要功能包括: 1.代码补全:Copilot可以在开发者编写代码时提供代码建议,包括函数、循…...

《GBDT 算法的原理推导》 11-13初始化模型 公式解析

本文是将文章《GBDT 算法的原理推导》中的公式单独拿出来做一个详细的解析,便于初学者更好的理解。 公式(11-13)是GBDT算法的第一步,它描述了如何初始化模型。公式如下: f 0 ( x ) arg ⁡ min ⁡ c ∑ i 1 N L ( y i , c ) f_0(x) \arg \m…...

# Easysearch 与 LLM 融合打造高效智能问答系统

LangChain通过提供统一的抽象层和丰富的工具,极大地简化了LLM应用程序的开发过程,使得开发者能够更加专注于业务逻辑。RAG技术则通过索引和检索生成两步流程,利用最新数据或私有数据作为背景信息来增强大模型的推理能力。然而,对于…...

本地可以插入表记录,生产不能插入表记录

先说解决方案: 切面没有注入容器,在切面这加上Component详情: 大致是这样一个方法,本地运行会插入数据到sys_log表,但部署到服务器上就不会插入,而服务部署三年多了,一个表一直是空的居然没人…...

11.Three.js使用indexeddb前端缓存模型优化前端加载效率

11.Three.js使用indexeddb前端缓存模型优化前端加载效率 1.简述 在使用Three.js做数字孪生应用场景时,我们常常需要用到大量模型或数据。在访问我们的数字孪生应用时,每次刷新都需要从web端进行请求大量的模型数据或其他渲染数据等等,会极大…...

功能测试:方法、流程与工具介绍

功能测试是对产品的各功能进行验证的一种测试方法,旨在确保软件以期望的方式运行并满足设计需求。以下是对功能测试的详细解释: 一、定义与目的 定义:功能测试(Functional Testing),也称为行为测试&#…...

【Orange Pi 5 Linux 5.x 内核编程】-设备驱动中的sysfs

设备驱动中的sysfs 文章目录 设备驱动中的sysfs1、sysfs介绍2、内核对象(kobject)介绍3、设备驱动中的SysFS31 在/sys中创建目录3.2 创建sysfs文件3.2.1 创建属性3.2.2 创建sysfs文件4、驱动程序实现5、驱动验证1、sysfs介绍 sysfs是内核导出的虚拟文件系统,类似于/proc。sys…...

微信小程序-全局数据共享/页面间通信

一.全局数据共享 声明全局的变量,在app.js文件里 App({//全局共享的数据globalData:{token:},//设置全局数据setToken(token){this.globalData.tokentoken}})使用 getApp() 获取全局App实例 //返回全局唯一的APP实例 const appInstancegetApp()Page({login(){con…...

java计算机毕设课设—Java聊天室(附源码、文章、相关截图、部署视频)

这是什么系统? 资源获取方式再最下方 java计算机毕设课设—Java聊天室(附源码、文章、相关截图、部署视频) Java聊天室系统是一个基于Java语言开发的在线即时通讯平台,旨在为用户提供一个简单、易用的实时交流环境。该系统支持多用户同时在线交流&…...

图像识别基础认识

import numpy as np import pandas as pd import matplotlib.pyplot as plt import cv2 %matplotlib inline读取图像 img = cv2.imread(shuzi.png) # 显示图像 cv2.imshow(shuzi, img) # 设置窗口大小 #cv2.resizeWindow(shuzi, 800, 600) # 设置宽为800,高为600 cv2.waitKe…...

使用 OpenCV 读取和显示图像与视频

概述 OpenCV 是一个强大的计算机视觉库,广泛应用于图像处理和视频处理等领域。本文将详细介绍如何使用 OpenCV 在 Python 中读取和显示图像以及视频,并通过具体的代码示例来展示整个过程。 环境准备 在开始之前,请确保已经安装了 OpenCV 库…...

【1】Elasticsearch 30分钟快速入门

文章目录 一、Elasticsearch 基本概念及工作原理(一)基本概念(二)工作原理二、Elasticsearch 原生 RESTful 方式的增删改查(一)创建索引(二)插入文档(三)查询文档(四)更新文档(五)删除文档(六)删除索引三、Python SDK 实现增删改查(一)安装 Elasticsearch Py…...

教材管理系统设计与实现

教材管理系统设计与实现 1. 系统概述 教材管理系统是一个基于PHP和SQL的Web应用程序,旨在为学校提供一个高效的教材管理平台。该系统可以帮助管理员录入教材信息、教师查询和申请教材、学生查询教材信息,提高教材管理的效率和透明度。 2. 技术栈 前端…...

软考(中级-软件设计师)数据库篇(1101)

第6章 数据库系统基础知识 一、基本概念 1、数据库 数据库(Database ,DB)是指长期存储在计算机内的、有组织的、可共享的数据集合。数据库中的数据按一定的数据模型组织、描述和存储,具有较小的冗余度、较高的数据独立性和扩展…...

安装nscd及glibc包冲突降级【centos7】

安装nscd及glibc包冲突降级【centos7】 一、查看当前glibc版本二、查找可用的glibc版本三、备份系统和数据四、降级glibc五、验证降级是否成功六、解决其他依赖问题七、测试和验证八、考虑使用容器技术endl [08:41:07 rootcentos7 ~]# yum -y install nscd Loaded plugins: fas…...

Qt字符编码

目前字符编码有以下几种: 1、UTF-8 UTF-8编码是Unicode字符集的一种编码方式(CEF),其特点是使用变长字节数(即变长码元序列、变宽码元序列)来编码。一般是1到4个字节,当然,也可以更长。 2、UTF-16 UTF-16是Unicode字符编码五层次…...

Ubuntu用docker安装AWVS和Nessus(含破解)

Ubuntu安装AWVS(更多搜索:超详细Ubuntu用docker安装AWVS和Nessus) 首先安装docker,通过dockers镜像安装很方便,且很快;Docker及Docker-Compose-安装教程。 1.通过docker search awvs命令查看镜像; docker search awvs…...

tauri开发中如果取消了默认的菜单项,复制黏贴撤销等功能也就没有了,解决办法

取消默认的菜单项:清除tauri默认的菜单项,让顶部的菜单menu不显示-CSDN博客 就是通过配置空菜单,让菜单不显示,但是这个引发的问题就是复制黏贴撤销等功能也就没有了,解决办法: 新增加编辑下的子菜单&…...

HNU-小学期-专业综合设计

写在前面 选题:大数据技术-智慧交通预测系统 项目github地址(如果有用麻烦点个star与follow):https://github.com/wolfvoid/HNU-ITPS (全部代码以及如何部署参见README) 项目报告:如下&…...

ESLyric歌词源一站式配置:Foobar2000多平台格式转换高效解决方案

ESLyric歌词源一站式配置:Foobar2000多平台格式转换高效解决方案 【免费下载链接】ESLyric-LyricsSource Advanced lyrics source for ESLyric in foobar2000 项目地址: https://gitcode.com/gh_mirrors/es/ESLyric-LyricsSource ESLyric歌词源是Foobar2000播…...

VisionPro实战:CogGraphicCollection在工业检测中的5个高效用法(附代码)

VisionPro实战:CogGraphicCollection在工业检测中的5个高效用法(附代码) 在工业自动化领域,机器视觉系统正变得越来越智能和高效。作为康耐视VisionPro平台的核心组件之一,CogGraphicCollection为工程师提供了强大的图…...

告别Electron臃肿!用Tauri 2.0 + Rust打造你的第一个轻量级桌面应用(附完整项目结构解析)

从Electron到Tauri 2.0:用Rust重构现代桌面应用开发范式 当Electron应用体积膨胀到200MB起步时,我们不得不重新思考桌面开发的未来。Tauri 2.0的出现绝非偶然——这是前端开发者对性能与体验的集体觉醒。本文将带你深入这个基于Rust的轻量级框架&#xf…...

Zotero终极指南:高效文献管理的开源解决方案

Zotero终极指南:高效文献管理的开源解决方案 【免费下载链接】zotero Zotero is a free, easy-to-use tool to help you collect, organize, annotate, cite, and share your research sources. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero Zotero是…...

LangChain4j vs Spring AI:Java AI 框架技术选型深度对比与生产落地指南

LangChain4j vs Spring AI:Java AI 框架技术选型深度对比与生产落地指南 摘要:当 Java 团队建设 AI 应用时,真正困难的通常不是“能否调通模型”,而是“如何把 Prompt、RAG、工具调用、可观测性、限流熔断、灰度发布、权限隔离与业务系统稳定地耦合起来”。本文不再停留在 …...

OpenClaw+ollama-QwQ-32B内容处理:自动生成周报与会议纪要

OpenClawollama-QwQ-32B内容处理:自动生成周报与会议纪要 1. 为什么需要自动化内容处理工具 每周五下午三点,我的日历总会准时弹出"编写本周工作报告"的提醒。这个看似简单的任务,却常常让我陷入两难:要么花半小时手动…...

给汽车ECU做“体检报告”:手把手解读Basetech OCC计数器里的5个关键指标

给汽车ECU做“体检报告”:手把手解读Basetech OCC计数器里的5个关键指标 当一辆车亮起故障灯开进维修车间,维修技师的第一反应往往是连接诊断仪读取数据。但面对屏幕上密密麻麻的OCC计数器数值,很多新手会感到无从下手——这些数字到底在说什…...

AceCommon:Arduino嵌入式零堆分配轻量C++工具库

1. AceCommon 库概述:面向嵌入式 Arduino 的轻量级底层工具集AceCommon 是一个专为资源受限的微控制器平台(尤其是 Arduino 生态)设计的零依赖、低开销 C 工具库。其核心设计哲学是“小而精、无侵入、可复用”。与常见的功能臃肿、依赖繁杂的…...

LFM2.5-1.2B-Thinking-GGUF应用场景:智能硬件说明书问答机器人落地实践

LFM2.5-1.2B-Thinking-GGUF应用场景:智能硬件说明书问答机器人落地实践 1. 项目背景与需求 在智能硬件领域,产品说明书往往存在以下痛点: 内容专业术语多,普通用户难以理解纸质说明书查找信息效率低不同型号产品差异导致用户混…...

从零到精通:Human Resource Machine 全关卡高效解法与思维跃迁指南

1. 为什么《Human Resource Machine》是程序员的最佳思维训练场 第一次打开《Human Resource Machine》时,我以为这不过是个披着编程外衣的小游戏。但当我卡在"第三年"的关卡整整一个下午后,才意识到这可能是最接近真实编程思维的训练场。这款…...