【Redis】Redis位图(bitmap)介绍和在签到场景的应用

news2024/10/6 16:18:17

文章目录

  • 一、前言
  • 二、redis位图相关指令
    • setbit命令
    • getbit命令
    • bitcount命令
    • bitfield命令
    • bitpos命令
    • bitop命令
  • 三、应用场景
    • 累计签到应用场景
    • 连续签到应用场景
    • 日期签到场景
    • 应用详情

一、前言

基本原理:

《Redis设计与实现》中对位图的实现描述是:Redis使用字符串对象来表示位数组,因为字符串对象使用的SDS数据结构是二进制安全的,所以程序可以直接使用SDS结构来保存位数组,并使用SDS结构的操作函数来处理为数组。

所以位图本质上结构就是redis的字符串类型SDS(simple dynamic string)。
在这里插入图片描述

计算机的存储,都是以二进制0和1存储的数据,位图就是直接对数据的比特位进行读取、赋值等操作。

二、redis位图相关指令

setbit命令

  • 指令: SETBIT key offset value
  • 复杂度: O(1)
  • 含义:设置或者清空key的value(字符串)在offset处的bit值(只能只0或者1)。offset位负数或者浮点数,执行报错。(set the original bit value stored at offset)getbit命令

getbit命令

  • 指令: getbit key offset
  • 复杂度: O(1)
  • 含义:获取key的value(字符串)在offset处的bit值(只能只0或者1)。(get the bit value stored at offset.)

bitcount命令

  • 指令: bitcount key
  • 复杂度: O(N)
  • 含义:获取key的value(字符串)所有比特位设置位1的总个数(The number of bits set to 1)。

bitfield命令

  • 指令: bitfield key [option1] [option2] …
  • 复杂度: O(1) * 每个指定的子命令
  • 含义: 操作多字节位域,它会执行一系列操作,并返回一个响应数组,在参数列表中每个响应数组匹配相应的操作。
  • 官方文档: http://www.redis.cn/commands/bitfield.html

bitpos命令

  • 指令: bitpos key 0|1
  • 复杂度: O(N)
  • 含义: 命令返回字符串里面第一个被设置为1或者0的bit位。(后面还可以接start end两个参数,但是偏移量的单位是字节,不是比特位,几乎没用)

bitop命令

  • 指令:BITOP [AND|OR|NOT|XOR ]destkey key1 key2
  • 复杂度: O(N)
  • 含义: 对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。
  • 官方文档: http://www.redis.cn/commands/bitop.html

空间占用&第一次分配空间需要的时间
空间占用量随着偏移量的增大而增大,在redis4.0版本可使用memory usage [key] 查看key的空间占用情况。
在这里插入图片描述

官方文档数据
offset为2^32-1(分配512MB)需要~300ms
offset为2^30-1(分配128MB)需要~80ms
offset为2^28-1(分配32MB)需要~30ms
offset为2^26-1(分配8MB)需要8ms
大概的空间占用计算公式是:($offset/8/1024/1024)MB

三、应用场景

  • 签到是一个很典型的位图使用场景
  • 指令应用简介
  • getbit 查看签到状态
  • setbit 标记签到
  • bitcount 累计签到次数
  • bitfield 批量查询签到标记

下面是签到应用场景演示,如果签到后还需要有一些用户奖励领取的逻辑,当然还可能涉及到补签等用户行为,则可以利用两个比特位来实现逻辑。

累计签到应用场景

在这里插入图片描述
在这里插入图片描述

连续签到应用场景

在这里插入图片描述
在这里插入图片描述

日期签到场景

在这里插入图片描述

在这里插入图片描述

应用详情

getbit查看第n比特位值----“第N个比特位”标识“第几天的签到状态”
指令示例截图:
在这里插入图片描述

含义:
查看key为 Test4SignMzy 的value值,第一位比特位是0
需求运用:
key可以作为签到活动的某个周期, “第N个比特位”标识“第几天的签到状态”。
setbit将第n比特位标记成0或1----用户“第n天签到”就将“第n个比特位”标记为1
指令示例截图:
在这里插入图片描述

含义:

将key为 Test4SignMzy 的value值,第一位比特位赋值为1,然后查看到比特位以改变为1。

需求运用:
key可以作为签到活动的某个周期,用户“第n天签到”就将这个redis key对应value值的“第n个比特位”标记为1。
bitcount统计所有比特位中为1的个数----用户“累计签到N次”用该值查询
指令示例截图:

含义:

key为 Test4SignMzy 的value值,所占用的所有比特位中,比特位值为1的总数是4个。

需求运用:
key可以作为签到活动的某个周期,用户“累计签到N次”,就可以用value值一共有多少个比特位为1得知。
bitfield 命令可以在一次调用中同时对多个位范围进行操作
指令示例截图:
在这里插入图片描述

含义:

第一个执行“bitfield Test4SignMzy get u1 1 get u1 2 get u1 3 get u1 4 get u1 8 get u1 9 get u1 10 get u1 99”,意思就是查看Test4SignMzy对应的value的第1、2、3、4、8、9、10、99比特位的值,得到的值当作无符号1位整数返回。加入原本不存在第99位,返回0代替。 

第二个执行“bitfield Test4SignMzy get u1 #1 get u1 #2 get u1 #3 get u1 #4 get u1 #8 get u1 #9 get u1 #10 get u1 #99”,意思和第一个执行含义一样,只不过“get u1 N”中第三个参数“N”表示从这个key的value值的第0位开始,往后偏移N位比特位;而“get u1 #N”中第三个参数“#N”表示从这个key的value值的第0位开始,往后偏移“N乘1(第二个参数表示的长度)”位比特位。 

需求运用:
可以查看一个用户连续几天,或者一个周期内所有天的签到状态,由此可以得到连续目前连续签到多少天,周期内最大连续签到多少天。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

做软件测试我该如何快速摸清一家公司的基本情况?

当你准备进入一家新的公司作为软件测试人员时,了解公司的基本情况对于你快速适应新环境和工作非常重要。下面是几个方面可以帮助你快速摸清一家公司的基本情况: 如果你想学习软件测试,我这边给你推荐一套视频,这个视频可以说是B站…

8. 高性能业务表结构设计和索引知识深化

MySQL性能调优 1. 数据库表设计1.1 范式化设计1.1.1 什么是范式?1.1.2 第一范式(1NF)1.1.2 第二范式(2NF)1.1.3 第三范式(3NF) 1.2 反范式设计1.2.1 什么叫反范式化设计 1.3 范式化和反范式总结…

分析SpringBoot 底层机制【Tomcat 启动分析+Spring 容器初始化+Tomcat 如何关联Spring 容器之源码分析

目录 分析SpringBoot 底层机制【Tomcat 启动分析Spring 容器初始化Tomcat 如何关联Spring 容器之源码分析 搭建SpringBoot 底层机制开发环境 创建Maven 项目wyx-springboot 修改pom.xml , 导入相关依赖 创建MainApp.java 启动项目ok, 大家注意Tomcat 也启动了[这里思考, …

机器学习期末复习 BP神经网络的推导,4X4X3,激活函数变为Logistic函数,其他不变

刚写完了bp神经网络的实验课代码,对这个比较熟悉(后面给出实现代码) Logistic函数也就是sigmod函数,表达式是这样的: def sigmod(x):return 1/(1math.exp(-x)) sigmod函数是隐层和输出层的激活函数(sigmo…

如何本地搭建Plex私人影音云盘教程,实现Plex家庭影音中心,打造超级多媒体中心

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 转发自CSDN远程穿透的文章:免费搭建Plex家庭影音中心 - 打造超级多媒体中心【公网远程访问…

WEBPACK、VITE 常用配置(对照)及迁移指南

文中 Webpack 版本为 5.x,Vite 版本为 4.3.x webpack 是新一代构建工具里面的老大哥了,从 2013 年发布已经持续升级 10 年,形成完备的生态环境。vite 则是下一代前端开发与构建工具,2019年发布,最新发布版本 4.3.3&…

文件操作安全之-文件上传告警运营篇

本文从文件上传的定义,文件上传的IDS规则,文件上传的示例,文件上传的告警研判,文件上传的处置建议等几个方面阐述如何通过文件上传类型的告警的线索,开展日常安全运营工作,从而挖掘有意义的安全事件。 文件…

rtl仿真器-iverilog icarus安装和测试

Icarus Verilog是一个轻量、免费、开源的Verilog编译器,基于C实现,开发者是 Stephen Williams ,遵循 GNU GPL license 许可证,安装文件中已经包含 GTKWave支持Verilog/VHDL文件的编译和仿真,命令行操作方式&#xff0c…

C语言函数大全-- _w 开头的函数(1)

C语言函数大全 本篇介绍C语言函数大全-- _w 开头的函数 1. _waccess 1.1 函数说明 函数声明函数功能int _waccess(const wchar_t* path, int mode);用于测试文件或目录是否存在,并检查程序是否具有对它们的访问权限 参数: path : 待测试的…

Elasticsearch(三)

Elasticsearch(三) 数据聚合 聚合的分类 文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html 聚合可以实现对文档数据的统计、分析、运算。聚合常见的有三类: 桶聚合:用来对文档做分组 Te…

【P22】JMeter 调试后置处理程序(Debug PostProcessor)

&#xff08;1&#xff09;、测试计划右键 <<< 添加 <<< 线程&#xff08;用户&#xff09;<<< 线程组 默认参数即可 &#xff08;2&#xff09;、线程组右键 <<< 添加 <<< 取样器 <<< 调试取样器 默认参数即可 &…

SQL复习(一)——安装

1 mysql卸载 reference&#xff1a;https://blog.csdn.net/m0_67392273/article/details/126066580 Step1:停止MySql服务 在卸载之前&#xff0c;先停止MySQL8.0的服务 搜索“服务”&#xff0c;找到“MySQL”&#xff0c;右键点击选择“停止” Step2&#xff1a;软件的卸…

Unittest自动化测试之unittestunittest_生成测试报告

unittest_生成测试报告 测试报告为测试结果的统计即展示&#xff0c;是自动化测试不可或缺的一部分&#xff0c;利用unittest 可以生成测试报告 方式一、使用第三方 HTMLTestRunner 执行测试用例集&#xff0c;生成网页版测试报告&#xff08;推荐&#xff09; HTMLTestRunn…

5年软测经验去面试25k测试岗,看到这样的面试题我还是心虚了....

我是着急忙慌的准备简历——5年软件测试经验&#xff0c;可独立测试大型产品项目&#xff0c;熟悉项目测试流程...薪资要求&#xff1f;5年测试经验起码能要个25K吧 我加班肝了一页半简历&#xff0c;投出去一周&#xff0c;面试电话倒是不少&#xff0c;自信满满去面试&#…

系统掌握入河排污口设置论证技术、方法及报告编制框架

在短时间内较系统的掌握入河排污口设置论证技术、方法及报告编制框架&#xff0c;学习内容以城镇生活污水厂、造纸项目、石化项目、制药项目案例为线索&#xff0c;系统讲解入河排污口设置论证报告书编制过程&#xff0c;并以水质模型为手段&#xff0c;讲解水质影响预测模型的…

Voice Control for ChatGPT 沉浸式的与ChatGPT进行交流学习。

Voice Control for ChatGPT 日常生活中&#xff0c;我们与亲人朋友沟通交流一般都是喜欢语音的形式来完成的&#xff0c;毕竟相对于文字来说语音就不会显的那么的苍白无力&#xff0c;同时最大的好处就是能解放我们的双手吧&#xff0c;能更快实现两者间的对话&#xff0c;沟通…

华为OD机试真题 Java 实现【简单的自动曝光】【2023Q1 100分】

一、题目描述 一个图像有 n 个像素点&#xff0c;存储在一个长度为 n 的数组 img 里&#xff0c;每个像素点的取值范围[0,255]的正整数。 请你给图像每个像素点值加上一个整k(可以是负数)&#xff0c;得到新图 newlmg&#xff0c;使得新图 newlmg 的所有像素平均值最接近中位…

响应式设计和移动端优化:如何实现页面在不同设备上的适配和优化

章节一&#xff1a;介绍响应式设计和移动端优化 响应式设计是一种使网页能够自适应不同设备和屏幕尺寸的设计方法。它通过使用流式网格布局、媒体查询和弹性图片等技术&#xff0c;使得网页能够在不同分辨率和设备上呈现出最佳的布局和用户体验。 移动端优化则是针对移动设备…

青训营 x 训练营结营测试题目(前端方向)

文章目录 &#x1f4cb;前言&#x1f3af;选择题&#xff08;含多选&#xff09;&#x1f4dd;最后 &#x1f4cb;前言 这篇文章的内容是23年6月青训营 x 训练营结营题目&#xff0c;题目一共有25题&#xff0c;题目类型为选择题&#xff0c;包括了单选题和多选题&#xff0c;…