Redis --- 位图

目录

背景

结构

存取方式

统计和查找


背景

开发过程中,会有布尔类型的存储,比如记录一个用户一年365天的签到情况,如果每天都要有一个布尔变量,多个用户,亦或者使用k-v形式,上亿用户的话这个存储量是惊人的。所以Redis的位图应运而生。

一个值占一个位,365天也就是365位,46个字符,也就是一个长点的字符串,大大节省了内存空间。

结构

它并不是一种类似于队列等的特殊的数据结构,内容其实就是普通的字符串,按二进制位数来说,也是就byte数组,可以使用,get,set索引来直接获取或者设置整个位图的内容。

Redis的为数组是自动扩展的,如果偏移位置超出了反胃,会自动扩容。

直接把字符串设置为“hello”,

hello的ASCⅡ码 :
>>> bin(ord(' h '))
'0b1101000'
# 高位 -> 低位
>>> bin(ord(' e '))
'0b1100101'
>>> bin(ord(' l '))
'0b1101100'
>>> bin(ord(' l '))
'0b1101100'
>>> bin(ord(' o '))
'0b1101111'

 注意都是八位。

设置一下一个字符串的位,只需要设置值为1 的位即可

127.0.0.1:6379> setbit s 1 1
(integer) 0
127.0.0.1:6379> setbit s 2 1
(integer) 0
127.0.0.1:6379> setbit s 4 1
(integer) 0
127.0.0.1:6379> setbit s 9 1
(integer) 0
127.0.0.1:6379> setbit s 10 1
(integer) 0
127.0.0.1:6379> setbit s 13 1
(integer) 0
127.0.0.1:6379> setbit s 15 1
(integer) 0
127.0.0.1:6379> get s
"he"

 h 只有 1 2 4位是1,e是 9 10 13 15位是1 (两个字符,16位 )直接得到便是一个“he”的字符串

存取方式

以上的例子可以理解为零存整取,还有零存零取,整存零取,零存就是向上面那样一位一位对位置进行设置。整存就是把字符串一次性填充所有位数组,覆盖旧值。

看完位图的结构和存储之后,我们存下来是为了获得统计数量,完成我们所需要的需求。

统计和查找

Redis提供了位图指令:bitcount 和 bitpos,

bitcount用来统计指定位置范围内1的个数,

bitpos 用来查找指定范围内出现的第一个0 或 1 

后面参数[start, end] 但是这两个参数都是以8字节位单位的,也就是说,0, 1是指第一个开始第二个字节结束,范围实际上是前十六位。

127.0.0.1:6379> set w hello
OK
127.0.0.1:6379> bitcount w
(integer) 21
127.0.0.1:6379> bitcount w 0 0 # 第一个字符中 1 的位数
(integer) 3
127.0.0.1:6379> bitcount w 0 1 # 前两个字符中 1 的位数
(integer) 7
   
127.0.0.1:6379> bitpos w 0 # 第一个 0 位
(integer) 0
127.0.0.1:6379> bitpos w 1 # 第一个 1 位
(integer) 1
127.0.0.1:6379> bitpos w 1 1 1 # 从第二个字符算起,第一个 1 位
(integer) 9
127.0.0.1:6379> bitpos w 1 2 2 # 从第三个字符算起,第一个 1 位
(integer) 17

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

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

相关文章

react-native init 初始化项目报错 TypeError: cli.init is not a function

问题 $ react-native init AwesomeProject ... /usr/local/lib/node_modules/react-native-cli/index.js:302cli.init(root, projectName);^TypeError: cli.init is not a functionat run (/usr/local/lib/node_modules/react-native-cli/index.js:302:7)at createProject (/u…

使用Zabbix监控日志文件 - 以Nginx Error日志为例

引言 Zabbix是一个功能强大的开源监控系统,可用于监控各种系统和服务。其中,监控日志文件是一项关键任务,因为日志文件记录了系统运行和应用程序状态的关键信息。在本文中,我们将介绍如何使用Zabbix来监控日志文件,以及如何通过自定义脚本采集和监控Nginx的error日志,以…

postgis数据库从一张表中过滤出一部分数据到新表中

你可以使用以下步骤在PostGIS数据库中过滤objectid<100的数据&#xff0c;并将其创建为新表&#xff1a;打开PostGIS数据库的终端或客户端工具&#xff08;如Psql&#xff09;。 选择你要过滤数据的表。假设表名为"original_table"&#xff0c;该表包含一个名为&q…

【C++】函数参数扩展 ② ( 占位参数 | 占位参数规则 - 必须为占位参数传入实参 | 默认参数与占位参数结合使用 )

文章目录 一、占位参数1、占位参数简介2、占位参数规则 - 必须为占位参数传入实参 二、默认参数与占位参数结合使用1、结合用法2、代码示例 - 占位参数与默认参数结合用法 博客总结 : 默认参数 : 在 声明 函数时 , 为 函数参数 定义一个默认值 ;默认参数规则 : " 默认参数…

时序预测 | MATLAB实现TCN-GRU时间卷积门控循环单元时间序列预测

时序预测 | MATLAB实现TCN-GRU时间卷积门控循环单元时间序列预测 目录 时序预测 | MATLAB实现TCN-GRU时间卷积门控循环单元时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现TCN-GRU时间卷积门控循环单元时间序列预测&#xff1b; 2.运行环…

【工程实践】使用git clone 批量下载huggingface模型文件

前言 经常需要下载模型到服务器&#xff0c;使用git clone方法可以快速实现模型下载。 1.选定要下载的模型 以下载moka-ai/m3e-base为例&#xff0c;切换到Files and versions。 2.更改下载网页的url 如上图所示&#xff0c;当前要下载模型网页的url为&#xff1a; https://hu…

解决:sh: vite: command not found

文章目录 问题描述原因分析解决方案 问题描述 第一次pull项目&#xff0c;运行npm run dev时报错&#xff1a;sh: vite: command not found 原因分析 查看了package.json&#xff0c;发现是有vite的。 没有安装依赖导致的&#xff1b; 解决方案 执行npm i重新安装依赖&#…

SpringMVC使用

文章目录 一.MVC基础概念1.MVC定义2.SpringMVC和MVC的关系 二.SpringMVC的使用1.RequestMapping2.获取参数1.获取单个参数2.传递对象3.后端参数重命名&#xff08;后端参数映射&#xff09;4.获取URL中参数PathVariable5.上传文件RequestPart6.获取Cookie/Session/header 3.返回…

高防服务器面对DDOS攻击的威胁有何必要性

高防服务器面对DDOS攻击的威胁有何必要性&#xff1f;分布式拒绝服务&#xff08;DDoS&#xff09;攻击是一种常见而危险的网络攻击形式&#xff0c;它可以使目标网络服务器过载&#xff0c;导致服务不可用。本文将深入探讨DDoS攻击的威胁&#xff0c;以及高防服务器在抵御这种…

数据可视化工具中的显眼包:奥威BI自带方案上阵

根据经验来看&#xff0c;BI数据可视化分析项目是由BI数据可视化工具和数据分析方案两大部分共同组成&#xff0c;且大多数时候方案都需从零开始&#xff0c;反复调整&#xff0c;会耗费大量时间精力成本。而奥威BI数据可视化工具别具匠心&#xff0c;将17年经验凝聚成标准化、…

算法训练 第一周

一、合并两个有序数组 本题给出了两个整数数组nums1和nums2&#xff0c;这两个数组均是非递减排列&#xff0c;要求我们将这两个数组合并成一个非递减排列的数组。题目中还要求我们把合并完的数组存储在nums1中&#xff0c;并且为了存储两个数组中全部的数据&#xff0c;nums1中…

Linux内核学习(十三)—— 设备与模块(基于Linux 2.6内核)

目录 一、设备类型 二、模块 构建模块 安装模块 载入模块 一、设备类型 在 Linux 以及 Unix 系统中&#xff0c;设备被分为以下三种类型&#xff1a; 块设备&#xff08;blkdev&#xff09;&#xff1a;以块为寻址单位&#xff0c;块的大小随设备的不同而变化&#xff1…

golang channel

channel是不同协程之间异步通信的数据结构。 基本用法 1 构造 ch:make(chan int)//无缓冲 ch:make(chan int,10)//有缓冲2 读操作 val:<-ch <-ch val,ok:<-ch3 写 var data int ch<-data4 关闭 close(ch)5 多路复用 select{ case <-parent.Done():child.…

VLAN间路由:单臂路由与三层交换

文章目录 一、定义二、实现方式单臂路由三层交换 三、单臂路由与三层路由优缺点对比四、常用命令 首先可以看下思维导图&#xff0c;以便更好的理解接下来的内容。 一、定义 VLAN间路由是一种网络配置方法&#xff0c;旨在实现不同虚拟局域网&#xff08;VLAN&#xff09;之…

数学建模--线性规划方法的Python实现

目录 1.算法求解问题 2.算法求解思路 3.算法求解代码 4.算法求解结果 1.算法求解问题 求min z2x13x2x3 s.t:x14x22x3>83x12x2>6x1,x2,x3>02.算法求解思路 关键函数解释如下: #利用linprogl函数来解决def linprog(c, A_ubNone, b_ubNone, A_eqNone, b_eqNone,boundsN…

Python入门教程 - 基本函数(四)

目录 一、什么是函数 二、自定义函数并使用它 一、什么是函数 前面我们学习了像input()、print()、type()等等&#xff0c;他们都是函数。这些其实是由Python内部帮我们定义好的。我们直接用就可以了。 关于函数&#xff0c;除了用内部定义好的&#xff0c;我们也可以自己定…

[Android 四大组件] --- Service

1 service是什么 Service是Android系统中的四大组件之一&#xff0c;它是一种长生命周期的&#xff0c;没有可视化界面&#xff0c;运行于后台的一种服务程序。 2 service分类 3 service启动方式 3.1 startService显示启动 // AndroidManifest.xml<?xml version"1…

Redis-数据结构及常用命令

字符串(String)数据结构常用命令&#xff1a; SET key value&#xff1a;设置指定 key 的值&#xff1b; GET key&#xff1a;获取指定 key 的值&#xff1b; DEL key&#xff1a;删除指定 key&#xff1b; INCR key&#xff1a;将指定 key 的值增加 1&#xff1b; DECR key&a…

【git】git commit、push之前自动执行脚本

可以使用 Git 的钩子&#xff08;hooks&#xff09;功能。Git 钩子是在特定事件发生时执行自定义脚本的方式。 下面是一个使用 pre-commit 钩子的例子&#xff0c;用于在执行 git commit 之前自动执行脚本&#xff1a; 进入你的 Git 仓库的根目录。进入 .git/hooks 目录&…

NPM 常用命令(二)

目录 1、npm bugs 1.1 配置 browser registry 2、npm cache 2.1 概要 2.2 详情 2.3 关于缓存设计的说明 2.4 配置 cache 3、 npm ci 3.1 描述 3.2 配置 install-strategy legacy-bundling global-style omit strict-peer-deps foreground-scripts ignore-s…