Redis的3大特殊数据类型(1)-BitMap

news2024/9/28 11:13:07

BitMap(位图/位数组)是Redis2.2.0版本中引入的一种新数据类型,该数据类型本质是一个仅含0和1的二进制字符串。因此可以把 Bitmap 想象成一个以位为单位的数组,数组的每个单元只能存储 0 和 1,数组的下标在 Bitmap 中叫做偏移量 offset,bitmap默认值都为0.
在这里插入图片描述
BitMap底层实际上使用字符串来存储,由于 Redis 中字符串的最大长度是 512 MB字节,所以 BitMap 的偏移量 offset 值也是有上限的,其最大值是:8 * 1024 * 1024 * 512 = 2^32(4G)。
由于 Redis中字符串的末尾都要存储一位分隔符,所以实际上 BitMap 的偏移量 offset 值上限是:2^32-1。

1.SETBIT key offset value

SETBIT 用来设置 key 对应第 offset 位的值(offset 从 0 开始算),可以设置为 0 或者 1。当指定的 KEY 不存在时,会自动生成一个新的字符串值。

127.0.0.1:6379> setbit isSign 0 0
(integer) 0
127.0.0.1:6379> setbit isSign 1 0
(integer) 0
127.0.0.1:6379> setbit isSign 2 1
(integer) 0
127.0.0.1:6379> setbit isSign 3 0
(integer) 0
127.0.0.1:6379> setbit isSign 4 0
(integer) 0
127.0.0.1:6379> setbit isSign 5 0
(integer) 0
127.0.0.1:6379> setbit isSign 6 1
(integer) 0
127.0.0.1:6379> setbit isSign 7 0

在这里插入图片描述

2.getbit key offset

获取 key 对应第 offset 位的值(offset 从 0 开始算)

127.0.0.1:6379> getbit isSign 0
(integer) 0
127.0.0.1:6379> getbit isSign 3
(integer) 0
127.0.0.1:6379> getbit isSign 6
(integer) 1

在这里插入图片描述

3.BITCOUNT key [ start end [ BYTE | BIT]]

用来计算指定 key 对应字符串中,被设置为 1 的 bit 位的数量。一般情况下,字符串中所有 bit 位都会参与计数,我们可以通过 start 或 end 参数来指定一定范围内被设置为 1 的 bit 位的数量。start 和 end 参数的设置和 GETRANGE 命令类似,都可以使用负数:比如 -1 表示最后一个位,而 -2 表示倒数第二个位等。
从 Redis 7.0.0 开始支持 BYTE 或者 BIT 选项

127.0.0.1:6379> bitcount isSign
(integer) 2
127.0.0.1:6379> bitcount isSign 0 -1
(integer) 2
127.0.0.1:6379> bitcount isSign 0 3
(integer) 2

在这里插入图片描述

4.BITOP operation destkey key [key …]

BITOP 是一个复合操作,支持在多个 key 之间执行按位运算并将结果存储在 destkey 指定的 key 中。BITOP 命令支持四种按位运算:AND(交集)、OR(并集)、XOR(异或) 和 NOT(非):

  • and: 与运算符(&) 两个同时为1,结果为1,否则为0
  • or: 或运算(|) 一个为1,其值为1
  • not: 取反(0110 0001 NOT: 1001 1110)
  • xor: 异或运算,值不同为1,否则为0
 127.0.0.1:6379> bitop and myop sign isSign
(integer) 1
127.0.0.1:6379> getbit myop 0
(integer) 0
127.0.0.1:6379> getbit myop 2
(integer) 1
127.0.0.1:6379> getbit myop 7
(integer) 0
127.0.0.1:6379> bitop or myop sign isSign
(integer) 1
127.0.0.1:6379> getbit myop 6
(integer) 1

在这里插入图片描述

5.BITPOS key bit [ start [ end [ BYTE | BIT]]]

用来计算指定 key 对应字符串中,第一位为 1 或者 0 的 offset 位置。除此之外,BITPOS 也有两个选项 start 和 end,跟 BITCOUNT 一样。
BYTE、BIT 这两个选项从 7.0.0 版本开始才能使用。

127.0.0.1:6379> bitpos isSign 1
(integer) 2
127.0.0.1:6379> getbit isSign 2
(integer) 1
127.0.0.1:6379> bitpos isSign 1 0 -1
(integer) 2
127.0.0.1:6379> getbit isSign 6
(integer) 1
127.0.0.1:6379> bitpos isSign 1 2
(integer) -1
127.0.0.1:6379> bitpos isSign 0
(integer) 0
127.0.0.1:6379> getbit isSign 0
(integer) 0

在这里插入图片描述

6.总结

BitMap常用来进行大数据量的二值统计,如疫情期间的感染情况(阳/阴),员工的考勤打卡签到(已打卡/未打卡),图像的二值化(黑/白),用户的活跃情况(活跃/不活跃),总统竞选投票支持情况(支持/不支持)…

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

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

相关文章

volatile关键字和ThreadLocal

作用: 1.线程的可见性:当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。 2. 顺序一致性:禁止指令重排序。 线程之间的共享变量存储在主内存中(Main Memory)中,每个线程都一个都…

StarRocks Friends 上海站活动回顾(含 PPT 下载链接)

6月17日, StarRocks & Friends 上海站活动如期而至,近百位社区小伙伴参与交流活动;针对 StarRocks 存算分离、StarRocks 在业界的应用实践、以及 StarRocks 与 BI 结合、湖仓一体规划等话题展开激烈的交流互动。 本文总结了技术交流活动…

未来的彩电,彩电的未来

疫情后的首个线上大促已经结束,“史上投入最大618”也没能抵住彩电市场整体的需求疲软。 根据奥维云网线上推总数据,2023年618期间,中国彩电线上市场零售量规模为249.9万台,同比下降12.9%;零售额规模为79.7亿元&#…

配电柜(箱)使用防雷浪涌保护器的作用和方案

配电箱是电力系统中的重要组成部分,负责将电力从供电系统输送到各个电器设备。然而,由于天气状况和其他因素的影响,电力系统可能会受到雷击引起的浪涌电压的威胁。为了保护配电箱和其中的设备免受浪涌电压的破坏,我们需要在配电箱…

Redis中3大特殊数据结构(2)-HyperLogLog

HyperLogLog算法是法国人Philippe Flajolet 教授发明的一种基数计数概率算法,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。HyperLogLog 适用于大数据量的去重统计,HyperLogLog 提供不精确的去重计数方案…

基于Java+Swing实现餐厅点餐系统

基于JavaSwing实现餐厅点餐系统 一、系统介绍二、系统展示1.主页2.点菜3.下单4.结算5.销售情况(管理员) 三、系统实现四、其他系统五、获取源码 一、系统介绍 该系统针对两个方面的用户,一个是用餐客户,另一个是餐厅管理员。将功…

iOS 17 beta 2有哪些BUG?iOS 17 beta 2推荐升级吗?

虽然iOS 17 beta 2 带来了大量的功能更新,但毕竟是测试版,海量的适配BUG也一同随之而来。 想升级iOS 17 beta 2的用户不妨先查看下目前存在的问题汇总! 一:存储空间更小了 升级beta1后存储空间缩小了大概3G左右,bet…

k8s网络通信

详解Kubernetes网络模型 Kubernetes 是为运行分布式集群而建立的,分布式系统的本质使得网络成为 Kubernetes 的核心和必要组成部分,了解 Kubernetes 网络模型可以使你能够正确运行、监控和排查应用程序故障。 网络所涉及的内容很多,拥有许多…

人人都能生成火爆全网的最不像二维码的二维码!

Sealos 公众号已接入了 GPT-4,完全免费!欢迎前来调戏👇 最近有人展示了使用 Stable Diffusion 创建的艺术二维码。这些二维码是使用定制训练的 ControlNet模型生成的。 但是操作门槛有点高。 你需要 GPU,还需要学习如何使用 Stabl…

diffusion model(二)—— DDIM技术小结

论文地址:Denoising Diffusion Implicit Models github地址:https://github.com/ermongroup/ddim 背景 去噪扩散概率模型 (DDPM1) 在没有对抗训练的情况下实现了高质量的图像生成,但其采样过程依赖马尔可夫假设,需要较多的时间…

SoapUI实践:自动化测试、压力测试、持续集成

因为项目的原因,前段时间研究并使用了 SoapUI 测试工具进行自测开发的 api。下面将研究的成果展示给大家,希望对需要的人有所帮助。 如果你想学习自动化测试,我这边给你推荐一套视频,这个视频可以说是B站播放全网第一的自动化测试…

Android View的渲染过程

原文链接 Android View的渲染过程 对于安卓开发猿来说,每天都会跟布局打交道,那么从我们写的一个布局文件,到运行后可视化的视图页面,这么长的时间内到底 发生了啥呢?今天我们就一起来探询这一旅程。 View tree的创建…

A Survey on In-context Learning

这是LLM系列相关综述文章的第二篇,针对《A Survey on In-context Learning》的翻译。 上下文学习综述 摘要1 引言2 概述3 定义和公式4 模型预热4.1 监督上下文训练4.2 半监督上下文训练 5 示例设计5.1 示例组织5.1.1 示例选择5.1.2 示例排序 5.2 示例形式化5.2.1 指…

Segment Anything Model Geospatial (SAM-Geo) 创建交互式地图

SAM-Geo是一个用于地理空间数据的Python 包,可在 PyPI 和 conda-forge 上使用。本节教程是SAM-Geo官网的一个教程,根据输入提示范围创建mask遮罩。后面还有一种基于提示词创建的方式,如只输出房屋、道路、树木等,下一期我们专门写…

IEEE Transactions的模板中,出现subfig包和fontenc包冲突的问题,怎么解决?

IEEE Transactions的模板中,出现subfig包和fontenc包冲突的问题,怎么解决? 本文章记录如何在IEEE Transactions的模板中,出现了subfig包和fontenc包冲突的问题,该怎么解决。 目录 IEEE Transactions的模板中&#xff…

ubuntu系统解压.rar文件问题与解决办法

ubuntu20.04解压rar文件 问题解决办法 问题 在ubuntu系统中,直接解压rar文件可能会报错,或者一直在提取文件中,无法结束。 例如直接右件该rar文件,将文件提取到此处 一直显示这个,无法结束 解决办法 需要安装一些软…

架构师进阶之路 - 架构优化为什么难

目录 业务迭代和技术优化难以兼顾 缺少“上帝”视角思维 系统架构腐化 缺少架构师视角 系统迭代机制 设计规范把控 最近在组织团队内的系统架构优化,总而言之就是难,至于为什么难我这边总结了以下六个方面,记录一下自己的架构师进阶之路吧。&…

css基础知识九:说说flexbox(弹性盒布局模型),以及适用场景?

一、是什么 Flexible Box 简称 flex,意为”弹性布局”,可以简便、完整、响应式地实现各种页面布局 采用Flex布局的元素,称为flex容器container 它的所有子元素自动成为容器成员,称为flex项目item 容器中默认存在两条轴&#xf…

微服务04 分布式搜索引擎 elasticsearch DSL数据聚合 自动补全 数据同步 集群

微服务03 分布式搜索引擎 elasticsearch ELK kibana RestAPI 索引库 DSL查询 RestClient 黑马旅游 分布式搜索引擎03 1.数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎&#x…

【Redis】Redis cluster 集群原理

前言 介绍优点: redis cluster集群模式,既拥有哨兵模式高可用、自动主从切换、高性能的特点,又解决了其只有单主结点承载数据量小的缺点。集群模式可以有多主结点,数据分散到多个主节点上,可以动态扩容。 槽分区的特点…