Redis--Bitmap有序集合的语法和使用场景举例

news2024/12/24 9:25:13

文章目录

      • 前言
      • Bitmap概述
      • Bitmap命令介绍
      • 使用场景
      • 结尾

前言

  • Redis除了常见的五种数据类型之外,其实还有一些少见的数据结构,如Geo,HyperLogLog,Bitmap等。虽然它们少见,但是作用却不容小觑。本文将介绍Bitmap数据类型的语法和使用场景。
  • 下文将介绍bitmap的使用指令,以及其应用场景。

Bitmap概述

  • 在开发中,我们常常需要存放一些布尔类型的数据,比如我们的上班打卡记录,游戏签到记录等等。假设一个公司工作签到打卡的场景,一个员工今年第1,2,3天都工作了,需要对1,2,3做记录,如果对这三个整型数使用unsigned int来记录的话,那么需要3*4=12个字节,也就是96个bit的存储空间。而一个员工要这样记录一整年的数据,公司又不止一个员工,那么这个打卡功能就将耗费大量空间。
  • 为了节省空间,Redis提供了Bitmap,也就是位图这种数据结构。所谓位图,其实就是一个bit数组,对于一年上班打卡的记录,只需要提供一个365位的bit数组,如果第一天工作了,那就将第一位bit的0改为1即可。这样一来,一个人一年的打卡记录,只需要365bit位就可以记录完成了。位图按位来存储,大大节约了空间,其存储上限为2^32。

Bitmap命令介绍

  • bitmap设置某一位的值: SETBIT key offset value

    # 字母a的ASCII码是97,二进制就是01100001,一个字节 八个比特
    # 字母b的ASCII码是98,二进制就是01100010
    # 所以存入a只需要将0,6,7位设为1即可
    # 接着存入b就需要将10,14,15位设为1。
    setbit word 0 1
    setbit word 6 1
    setbit word 7 1
    setbit word 10 1
    setbit word 14 1
    setbit word 15 1
    
    # 除此之外,可以之间用字符串填充位的值
    set word ab 
    # 这个指令等价于上面的setbit
    
  • 获取bitmap中的数据,使用单个位操作获取位的值: getbit key offset

    getbit word 0 1
    getbit word 1 1
    
  • 统计bitmap指定位区间上,值为 1 的个数: bitcount key [start end]

    bitcount word    # 统计key为word的位图中有多少个1
    bitcount word 0 1 # 前两个字符中有几个1 
    
  • 返回bitmap中第一个值为bit的二进制位的位置,可以指定范围: bitpos key bit [start end]

    bitpos word 1  # 返回第一个为1的位
    bitpos word 0 0 1  # 返回前两个字符中第一个为0的位
    
  • 对一个或多个保存二进制位的字符串 key 进行位元操作(and,or,not,xor),并将结果保存到 destkey 上: BITOP operation destkey key [key …]

    bitop not new_word word # 对key为word的位图取反后存入new_word之中
    

在这里插入图片描述

使用场景

  • 需求:40亿个QQ号,限制1G的内存,如何对这些QQ号进行去重。
  • 实现方案:通过分析需求,有1G内存的限制,所以可以使用位图来节省空间。使用位图的话,一个qq号,即一个数字只需要占用一个bit(将这个bit设置为1),那么40亿个数字也就只需要400000000/8/1024/1024=476M,满足要求。
  • 代码实现:
    public class RedisBitmap {
      
       private static final String QQ_NUMBER = "QQ";
    
       /**
        * 将qq号码存入位图中
        * 即将位图对应qq号码的bit设为1
        * @param key
        * @param qq_number
        * @param jedis
        */
       public static void saveQQNumber(String key, long qq_number, Jedis jedis){
           jedis.setbit(key,qq_number,true);
       }
    
       /**
        * 获取bitmap中1的数量即可得到去重后的qq号数量
        * @param key
        * @param jedis
        */
       public static Long getCount(String key,  Jedis jedis){
           return jedis.bitcount(key);
       }
    
    }
    

结尾

  • bitmap常用于上面提及的去重,上班打卡,签到记录功能,使用bitmap可以减少很多不必要的存储空间。所以当出现类似的场景时,就好好使用它吧。

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

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

相关文章

c语言-柔性数组

文章目录 前言一、柔性数组的介绍1.1 柔性数组的定义 二、柔性数组的使用2.1 使用说明2.2 结构体中的成员只包含一个柔性数组成员2.3 结构体中的成员包含其他成员和一个柔性数组成员 三、模拟柔性数组总结 前言 本篇文章介绍c语言中的柔性数组。 一、柔性数组的介绍 1.1 柔性…

【动态规划】【字符串】【C++算法】940. 不同的子序列 II

作者推荐 【动态规划】【广度优先搜索】【状态压缩】847 访问所有节点的最短路径 本文涉及知识点 动态规划汇总 LeetCode940. 不同的子序列 II 给定一个字符串 s,计算 s 的 不同非空子序列 的个数。因为结果可能很大,所以返回答案需要对 10^9 7 取…

MySQL之数据库DDL

文章目录 MySQL数据库基本操作数据定义DDL对数据库的常用操作创建表修改表格式结构 MySQL数据库基本操作 首先我们先了解SQL的语言组成,他分为四个部分 数据定义语言(DDL)数据操纵语言(DML)数据控制语言(…

网络安全---防御保护--子接口小实验

子接口小实验: 环境准备: 防火墙区域配置为trust: PC设置其ip为同一个网段: 此时尝试ping无法ping通的原因是没有打开防火墙允许ping,我们在图形化界面允许ping即可 最终结果: .com域名服务器: …

机器视觉系统选型-参数-镜头各个参数之间相互关系

焦距越小,景深越大;焦距越小,畸变越大; 光圈越大,图像亮度越高;光圈越大,景深越小; 光圈越大,分辨率越高; 一般像场中心较边缘分辨率高,像场中心较…

K8S四层代理Service-02

Service的四种类型使用 ClusterIP使用示例Pod里使用service的服务名访问应用 NodePort使用示例 ExternalName使用示例 LoadBalancer K8S支持以下4种Service类型:ClusterIP、NodePort、ExternalName、LoadBalancer 以下是使用4种类型进行Service创建,应对…

网络协议与攻击模拟_06攻击模拟SYN Flood

一、SYN Flood原理 在TCP三次握手过程中, 客户端发送一个SYN包给服务器服务端接收到SYN包后,会回复SYNACK包给客户端,然后等待客户端回复ACK包。但此时客户端并不会回复ACK包,所以服务端就只能一直等待直到超时。服务端超时后会…

.NET国产化改造探索(七)、更改大金仓数据库认证方式

随着时代的发展以及近年来信创工作和…废话就不多说了,这个系列就是为.NET遇到国产化需求的一个闭坑系列。接下来,看操作。 之前安装人大金仓数据库的时候,连接数据库所使用的加密方式选择的是scram-sm3,权限管理框架的ORM使用的…

机器学习实验2——线性回归求解加州房价问题

文章目录 🧡🧡实验内容🧡🧡🧡🧡数据预处理🧡🧡代码缺失值处理特征探索相关性分析文本数据标签编码数值型数据标准化划分数据集 🧡🧡线性回归🧡&am…

router4j--SpringCloud动态路由利器

前言 本文介绍Java的动态路由中间件:router4j。router4j用于SpringCloud项目,它可以将某个url请求路由到指定的机器上,也可以将所有请求强制转到指定机器。 问题描述 Java后端在开发SpringCloud项目时如果同一个应用起了多个实例&#xff…

汽车网络架构与常用总线汇总

汽车CAN总线简述 CAN 是控制器局域网Controller Area Network 的缩写,1986年,由德国Bosch公司为汽车开发的网络技术,主要用于汽车的监测与控制,目的为适应汽车“减少线束的数量”“通过多个网络进行大量数据的高速传输”的需求。…

php中laravel项目开发技巧与避坑

公司开发新业务,涉及到地址引用和循环遍历,结果测试人员说部分数据对不上,经排查,ID无值,name却有值,断点定位后,发现是地址引用的问题引起的 问题原因 数据库查询也确实是0 解决方案 注意事项…

理想架构的非对称高回退Doherty功率放大器理论与仿真

Doherty理论—理想架构的非对称高回退Doherty功率放大器理论与仿真 参考: 三路Doherty设计 01 射频基础知识–基础概念 Switchmode RF and Microwave Power Amplifiers、 理想架构的Doherty功率放大器(等分经典款)的理论与ADS电流源仿真参考…

什么是ORM思想?

1. ORM概念 ORM(Object Relational Mapping)对象关系映射模式,是一种技术,解决了面向对象与关系型数据库存互不匹配的现象。 ORM在业务逻辑层和数据库层之间充当了桥梁的作用。 2. ORM由来 在软件开发的过程中,通常…

UE5.2、CesiumForUnreal实现加载GeoJson绘制单面

文章目录 前言一、实现目标二、实现过程1.实现原理2.数据读取3.三角剖分3.具体代码 4.蓝图测试 前言 UE5、CesiumForUnreal实现加载GeoJson绘制单面(Polygon)功能(StaticMesh方式) 一、实现目标 通过读取本地的Geojson数据&…

【Go学习】Ginkgo测试框架学习实践 + 问题记录 + 怎么解决(0)

1、ginkgo测试框架介绍:https://onsi.github.io/ginkgo/ 2、重点是学习实践 问题记录 怎么解决 3、送福利:国内好用的ChatGpt有很多,比如:天工、文心一言、讯飞星火、通义万相等 1. 安装 xxxmacdeMacBook-Pro-3  /Volumes/mac…

关于网络模型的笔记

1. OSI 七层参考模型: 简介: 七层模型,亦称 OSI(Open System Interconnection)参考模型,即开放式系统互联。参考模型 是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联…

mc我的世界服务器多少钱一个月?

我的世界服务器多少钱一个月?低至7元一个月,阿里云和腾讯云均可以选择mc服务器,阿里云2核2G3M轻量服务器87元一年、腾讯云轻量2核2G3M服务器88元一年,阿里云ECS云服务器2核2G3M带宽99元一年,腾讯云2核4G5M带宽轻量应用…

IPoE技术汇总

在国内并没有遇到这么多的IPoE(IP over Ethernet)技术,可能也是因为我来日本多年了,没有接触国内的IPv4 over IPv6的技术,感觉国内IPv4地址紧张,用的传统NAT和PPPoE非常多,大多数设备还是建立在…

docker - compose 部署 Tomcat

目录 下面用 docker-compose 方法部署 Tomcat 1、准备工作 2、部署容器 启动容器 查看新启动的容器 3、总结 下面用 docker-compose 方法部署 Tomcat 1、准备工作 先在主机创建工作文件夹,为了放置 Tomcat 的配置文件等。创建文件夹的方法,自己搞…