【redis6】第六章(新数据类型)

news2024/11/23 12:06:13

Bitmaps

简介

现代计算机用二进制(位)作为信息的基础单位, 1个字节等于8位, 例如“abc”字符串是由3个字节组成, 但实际在计算机存储时将其用二进制表示, “abc”分别对应的ASCII码分别是97、 98、 99, 对应的二进制分别是01100001、 01100010和01100011,如下图
在这里插入图片描述

合理地使用操作位能够有效地提高内存使用率和开发效率。

Redis提供了Bitmaps这个“数据类型”可以实现对位的操作:

  • Bitmaps本身不是一种数据类型, 实际上它就是字符串(key-value) , 但是它可以对字符串的位进行操作。

  • Bitmaps单独提供了一套命令, 所以在Redis中使用Bitmaps和使用字符串的方法不太相同。
    可以把Bitmaps想象成一个以位为单位的数组, 数组的每个单元只能存储0和1, 数组的下标在Bitmaps中叫做偏移量。

在这里插入图片描述

命令

  • setbit
    (1)格式

    setbit<key><offset><value>设置Bitmaps中某个偏移量的值(0或1)
    *offset:偏移量从0开始
    

    (2)实例
    每个独立用户是否访问过网站存放在Bitmaps中, 将访问的用户记做1, 没有访问的用户记做0, 用偏移量作为用户的id。
    设置键的第offset个位的值(从0算起) , 假设现在有20个用户,userid=1, 6, 11, 15, 19 的用户对网站进行了访问, 那么当前Bitmaps初始化结果如下图:

    在这里插入图片描述

    users:20210101 代表2021-01-01这天的独立访问用户的Bitmaps

    127.0.0.1:6379> setbit users:20210101 1 1
    (integer) 0
    127.0.0.1:6379> setbit users:20210101 6 1
    (integer) 0
    127.0.0.1:6379> setbit users:20210101 11 1
    (integer) 0
    127.0.0.1:6379> setbit users:20210101 15 1
    (integer) 0
    127.0.0.1:6379> setbit users:20210101 19 1
    (integer) 0
    
    

    注:
    很多应用的用户id以一个指定数字(例如10000) 开头, 直接将用户id和Bitmaps的偏移量对应势必会造成一定的浪费, 通常的做法是每次做setbit操作时将用户id减去这个指定数字。
    在第一次初始化Bitmaps时, 假如偏移量非常大, 那么整个初始化过程执行会比较慢, 可能会造成Redis的阻塞。

  • getbit
    (1)格式

    getbit<key><offset>获取Bitmaps中某个偏移量的值
    获取键的第offset位的值(从0开始算)
    

    (2)实例
    获取id=1的用户是否在2021-01-01这天是否访问过, 返回0说明没有访问过:

    127.0.0.1:6379> getbit users:20210101 0
    (integer) 0
    127.0.0.1:6379> getbit users:20210101 1
    (integer) 1
    127.0.0.1:6379> getbit users:20210101 8
    (integer) 0
    127.0.0.1:6379> getbit users:20210101 19
    (integer) 1
    127.0.0.1:6379> getbit users:20210101 100
    (integer) 0
    

    注:因为100根本不存在,所以也是返回0

  • bitcount

    统计字符串被设置为1的bit数。一般情况下,给定的整个字符串都会被进行计数,通过指定额外的 start 或 end 参数,可以让计数只在特定的位上进行。start 和 end 参数的设置,都可以使用负数值:比如 -1 表示最后一个位,而 -2 表示倒数第二个位,start、end 是指bit组的字节的下标数,二者皆包含。

    (1)格式

    bitcount<key>[start end] 统计字符串从start字节到end字节比特值为1的数量
    

    (2)实例
    计算2021-01-01这天的独立访问用户数量

    127.0.0.1:6379> bitcount users:20210101
    (integer) 5
    

    start和end代表起始和结束字节数, 下面操作计算用户id在第1个字节到第3个字节之间的独立访问用户数, 对应的用户id是11, 15, 19。

    127.0.0.1:6379> bitcount users:20210101 1 3
    (integer) 3
    

举例: K1 【01000001 01000000 00000000 00100001】,对应【0,1,2,3】

bitcount K1 1 2 : 统计下标1、2字节组中bit=1的个数,即01000000 00000000
–》bitcount K1 1 2   --》1

bitcount K1 1 3 : 统计下标1、2字节组中bit=1的个数,即01000000 00000000 00100001
–》bitcount K1 1 3  --》3

bitcount K1 0 -2 : 统计下标0到下标倒数第2,字节组中bit=1的个数,即01000001 01000000 00000000
–》bitcount K1 0 -2  --》3

注意:redis的setbit设置或清除的是bit位置,而bitcount计算的是byte位置。

  • bitop

    (1)格式
    bitop是一个复合操作, 它可以做多个Bitmaps的and(交集) 、 or(并集) 、 not(非) 、 xor(异或) 操作并将结果保存在destkey中。

    # bitop operation destkey key [key ...]
    bitop  and(or/not/xor) <destkey> [key…]
    

    (2)实例

    2022-01-02 日访问网站的userid=1,2,5,9。
    127.0.0.1:6379> setbit users:20220102 1 1
    127.0.0.1:6379> setbit users:20220102 2 1
    127.0.0.1:6379> setbit users:20220102 5 1
    127.0.0.1:6379> setbit users:20220102 9 1
    
    2022-01-03 日访问网站的userid=0,1,4,9。
    127.0.0.1:6379> setbit users:20220103 0 1
    127.0.0.1:6379> setbit users:20220103 1 1
    127.0.0.1:6379> setbit users:20220103 4 1
    127.0.0.1:6379> setbit users:20220103 9 1
    
    计算出两天都访问过网站的用户数量
    127.0.0.1:6379> bitop and users:and:20220102_03 users:20220102 users:20220103
    (integer) 2
    127.0.0.1:6379> bitcount users:and:20220102_03
    (integer) 2
    

    在这里插入图片描述

    计算出任意一天都访问过网站的用户数量(例如月活跃就是类似这种) , 可以使用or求并集
    127.0.0.1:6379> bitop or users:or:20220102_03 users:20220102 users:20220103
    (integer) 2
    127.0.0.1:6379> bitcount users:or:20220102_03
    (integer) 6
    

Bitmaps与set对比

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

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

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

相关文章

SEO优化收徒站外引蜘蛛软件方法

SEO优化收徒站外引蜘蛛软件方法 今天我们讲解站外引蜘蛛的方法&#xff0c;站外引蜘蛛的方法无非就是五个大点。 第一个是搜索引擎的提交&#xff0c;我们通过是百度资源站展或者 360 或者神马头条&#xff0c;搜狗 bin 等等这样的一个搜索引擎去提交我们的链接。 里面主要是…

【css】结构选择器

结构选择器&#xff0c;也称之为组合器选择器&#xff0c;根据它们之间的特定关系来选取元素。CSS 中有四种不同的组合器&#xff1a;后代选择器 (空格)子选择器 (>)相邻兄弟选择器 ()通用兄弟选择器 (~)选择器示例描述element elementdiv p选择 div 元素内部的所有 p 元素e…

仗剑走天涯是梦想,仗键走天涯是坚持

在这信息化、数字化浪潮发展中&#xff0c;人们办公、娱乐、学习、生活都离不开了手机电脑平板等一系列电子设备&#xff0c;互联网行业工作者更是不可避免的需要频繁接触到电脑、键盘、鼠标等设备&#xff0c;今天给大家推荐一款性价比极高的键盘Keychron K3 Pro 一、keychron…

小程序API Promise化

一、 应用场景 小程序页面初始化时&#xff0c;需要去服务端获取token&#xff0c;所带参数在另外两个接口请求中&#xff0c;所写代码可能是这样子的&#xff1a; onLoad(options) {this.getToken() }, getToken() {wx.request({url: 后端API地址1,success: (res) > {//…

_Linux多线程-线程互斥篇

文章目录1. 进程线程间的互斥相关背景概念2. 互斥量mutex3. 互斥量的接口初始化互斥量销毁互斥量互斥量加锁和解锁4. 互斥量---锁静态分配&#xff08;初始化&#xff09;动态分配&#xff08;初始化&#xff09;5. 互斥量实现原理探究6. 总结&#xff1a;1. 进程线程间的互斥相…

【随即森林模型】

随机森林模型的基本原理和代码实现 集成模型简介 集成学习模型是机器学习非常重要的一部分。 集成学习是使用一系列的弱学习器&#xff08;或称之为基础模型&#xff09;进行学习&#xff0c;并将各个弱学习器的结果进行整合从而获得比单个学习器更好的学习效果的一种机器学习…

嵌入式设备中可以使用SQLite3吗?

摘要&#xff1a;数据库是用来存储和管理数据的专用软件&#xff0c;使得管理数据更加安全&#xff0c;方便和高效。数据库对数据的管理的基本单位是表(table)&#xff0c;在嵌入式linux中有时候它也需要用到数据库&#xff0c;听起来好难&#xff0c;其实就是几个函数&#xf…

论文精读:Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields ∗

姿态估计openpose系列算法解读 姿态估计任务 姿态估计任务首先需要检测出人体的各个关键点,将人体关键点进行拼接。 任务的困难有,首先,对于关键点检测任务,需要处理遮挡的问题,在拼接的过程中,需要处理多人的情况,即不能将不同人的关键点进行拼接。 标注数据信息 COCO…

linux系统中利用QT实现音乐播放器的功能

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何使用QT中的音乐播放器的功能与方法。 目录 第一&#xff1a;音乐播放器基本简介 第二&#xff1a;应用具体代码实现 第三&#xff1a;在源代码mainwindow.cpp中的实现 第四&#xff1a;程序运行效果 第一&#xff…

1.1计算机工作过程(超详细)

文章目录一、计算机组成框图二、思维导图三、部件剖析&#xff08;1&#xff09;存储器&#xff08;2&#xff09;运算器&#xff08;3&#xff09;控制器四、案例剖析&#xff08;重点&#xff09;&#xff08;1&#xff09;a2&#xff08;2&#xff09;a*b&#xff08;3&…

关于 国产麒麟系统上长时间运行Qt程序.xsession-erros文件占满磁盘导致无法写入 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/128660728 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

[强网杯 2019]随便注

目录 信息收集 方法一&#xff1a;堆叠注入 方法二&#xff1a;MySQL预处理 语法 payload 方法三&#xff1a;handler 知识点 语法 payload 信息收集 1 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version f…

开发中常用的Spring注解

一.IOC容器 Configuration ConpoentScan CompoentScans Bean Import DependsOn Lazy Compoent Repository Service Controller Autowired Qualifier 二.AOP切面 Aspect Pointcut Before After AfterReturning AfterThrowing Around 三.事务声明 Transac…

nacos一:服务注册

为什么用nacos: Eureka需要自己搭建项目&#xff0c;nacos下载后&#xff0c;就可以直接访问web界面,自带负载均衡 Nacos可以 1替代eureka做服务注册中心 2替代Config做服务配置中心 使用 一&#xff1a; 1 下载nacos,在bin目录下打开cmd窗口&#xff0c;输入startup.cmd -m s…

100 亿美元!微软豪赌 AI,OpenAI 渗透 GitHub、Office、Bing

OpenAI 这把 ChatGPT 的火还在持续地燃烧&#xff01;作者 | 唐小引出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;今天&#xff0c;据路透社援引 Semafor 消息报道&#xff0c;微软正在计划向 OpenAI 再次投资 100 亿美元&#xff0c;如果合作达成&#xff0c;微…

【STM32学习】SysTick定时器(嘀嗒定时器)

SysTick定时器一、参考资料二、时钟源选择与定时时间计算1、时钟源选择2、定时时间计算三、SysTick_Handler中断服务函数一、参考资料 嘀嗒定时器&#xff1a;时钟源、寄存器 二、时钟源选择与定时时间计算 结合正点原子的代码进行说明&#xff1a; 1、时钟源选择 从上图可以发…

通讯录的实现(详解)(后附完整源代码)

通讯录的实现一.所需要的功能二.大致菜单三.创建通讯录四.增加联系人五.显示联系人六.查找联系人七.删除联系人八.修改联系人一.所需要的功能 对于通讯录来说&#xff0c;我们需要它实现以下几个功能。 1.人的信息&#xff1a;姓名年龄性别电话地址。 2.可以存放100个人的信息…

VMware Workstation Pro 16安装Windows 11

1&#xff1a;首先在机器中安装VMware Workstation Pro。 2&#xff1a;准备Windows 11的安装镜像。 3&#xff1a;安装Windows 11的系统要求&#xff0c;这个很关键不满足条件无法安装&#xff0c;其中我们只需要注意系统固件和TPM这两项就行。 4&#xff1a;运行VMware Wor…

使用SQL4Automation让CodeSYS连接数据库

使用SQL4Automation让CodeSYS连接数据库 摘要&#xff1a;本文旨在说明面向CodeSYS的数据库连接方案SQL4Automation的使用方法。 1.SQL4Automation简介 1.1.什么是SQL4Automation SQL4Automation是一套工业用途的软件解决方案&#xff0c;它主要的功能就是为PLC和机器人控制提…

王道操作系统笔记(一)———— 计算机系统概述

文章目录一、操作系统基本概念1.1 基本概念1.2 四大特征1.3 目标和功能二、操作系统的分类与发展三、操作系统的运行环境3.1 运行机制3.2 中断和异常3.3 系统调用四、操作系统的体系结构4.1 宏内核与微内核4.2 分层结构4.3 模块化4.4 外核五、操作系统引导六、虚拟机一、操作系…