[Redis6]新数据类型_Bitmaps

Bitmaps

简介

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

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

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

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

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

在这里插入图片描述

命令

setbit

(1)格式

setbit[key][offset][value]设置Bitmaps中某个偏移量的值(0或1)

(2)实例

每个独立用户是否访问过网站存放在Bitmaps中, 将访问的用户记做1, 没有访问的用户记做0, 用偏移量作为用户的id。

设置键的第offset个位的值(从0算起) , 假设现在有20个用户,userid=1, 6, 11, 15, 19的用户对网站进行了访问, 那么当前Bitmaps初始化结果如图

在这里插入图片描述

在这里插入图片描述

注:

很多应用的用户id以一个指定数字(例如10000) 开头, 直接将用户id和Bitmaps的偏移量对应势必会造成一定的浪费, 通常的做法是每次做setbit操作时将用户id减去这个指定数字。

在第一次初始化Bitmaps时, 假如偏移量非常大, 那么整个初始化过程执行会比较慢, 可能会造成Redis的阻塞。

getbit

(1)格式

getbit[key][offset]获取Bitmaps中某个偏移量的值

在这里插入图片描述

获取键的第offset位的值(从0开始算)

bitcount

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

(1)格式
bitcount[key][start end] 统计字符串从start字节到end字节比特值为1的数量

在这里插入图片描述

在这里插入图片描述
举例: 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 and(or/not/xor) [destkey] [key…]

在这里插入图片描述

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

(2)实例

2020-11-04 日访问网站的userid=1,2,5,9。
setbit unique:users:20201104 1 1
setbit unique:users:20201104 2 1
setbit unique:users:20201104 5 1
setbit unique:users:20201104 9 1

2020-11-03 日访问网站的userid=0,1,4,9。
setbit unique:users:20201103 0 1
setbit unique:users:20201103 1 1
setbit unique:users:20201103 4 1
setbit unique:users:20201103 9 1

计算出两天都访问过网站的用户数量
bitop and unique:users:and:20201104_03
unique:users:20201103 unique:users:20201104

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

计算出任意一天都访问过网站的用户数量(例如月活跃就是类似这种) , 可以使用or求并集

在这里插入图片描述

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

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

相关文章

mysql qps如何查看_一款查看mysql QPS的脚本

本脚本黏贴就可以使用绝对不坑人!!!(此脚本来源如一位大神网友)执行效果:脚本:#!/bin/bashPWEqipay20150504mysqladmin -P3306 -uroot -p$PW -r -i 1 ext |\awk -F"|" \"BEGIN{ count0; }"\{ if($…

.Net Core 自定义配置源从配置中心读取配置

配置,几乎所有的应用程序都离不开它。.Net Framework时代我们使用App.config、Web.config,到了.Net Core的时代我们使用appsettings.json,这些我们再熟悉不过了。然而到了容器化、微服务的时代,这些本地文件配置有的时候就不太合适…

[Redis6]Bitmaps与set对比

Bitmaps与set对比 但Bitmaps并不是万金油, 假如该网站每天的独立访问用户很少, 例如只有10万(大量的僵尸用户) , 那么两者的对比如下表所示, 很显然, 这时候使用Bitmaps就不太合适了&#xff0c…

MySQL分布式ID_分布式唯一ID系列(3)——数据库自增ID机制适合做分布式ID吗

数据库自增ID机制原理介绍在分布式里面,数据库的自增ID机制的主要原理是:数据库自增ID和mysql数据库的replace_into()函数实现的。这里的replace数据库自增ID和mysql数据库的replace_into()函数实现的。这里的replace into跟insert功能类似,不…

7-15 QQ帐户的申请与登陆 (25 分)(map做法+思路分析)

一:题目 实现QQ新帐户申请和老帐户登陆的简化版功能。最大挑战是:据说现在的QQ号码已经有10位数了。 输入格式: 输入首先给出一个正整数N(≤10 ​5 ​​ ),随后给出N行指令。每行指令的格式为:“命令符&a…

[Redis6]新数据类型_HyperLogLog

HyperLogLog 简介 在工作当中,我们经常会遇到与统计相关的功能需求,比如统计网站PV(PageView页面访问量),可以使用Redis的incr、incrby轻松实现。 但像UV(UniqueVisitor,独立访客)、独立IP数…

每天都在支付,你真的了解信息流和资金流?

作为一个财务类的产品经理,除了每天被财务“虐待”千百遍,还需要对整个资金流向很清楚:钱给谁,怎么给,怎么做逆向流程,谁参与容错等。财务很在意资金的流转安全,但又极不愿意花时间关注它。诸如…

mysql改表字段类型导致数据丢失_故障分析 | 记一次 MySQL 主从双写导致的数据丢失问题【转】...

一、问题起源不久前用户反馈部门的 MySQL 数据库发生了数据更新丢失。为了解决这个问题,当时对用户使用的场景进行了分析。发现可能是因为用户在两台互为主从的机器上都进行了写入导致的数据丢失。如图所示,是正常和异常情况下应用写入数据库的示例。随后…

[Redis6]新数据类型_Geospatial

Geospatial 简介 Redis 3.2 中增加了对GEO类型的支持。GEO,Geographic,地理信息的缩写。该类型,就是元素的2维坐标,在地图上就是经纬度。redis基于该类型,提供了经纬度设置,查询,范围查询&…

《Apache SkyWalking实战》送书活动结果公布

截至2020.07.31 本次送书活动 这么多Apache顶级项目,SkyWalking为何一枝独秀?,本次很多同学在看到活动的书,自行就到网上购买了书。下面把Top 8的留言截图给大家回顾一下。以下8位同学将获赠书籍一本:landon、田晓青、…

7-16 一元多项式求导 (20 分)(详解+题目分析)

7-16 一元多项式求导 (20 分) 1:题目 设计函数求一元多项式的导数。 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 以与输入相同的格式输出导数多项式非零项的系数和…

[MyBatisPlus]通用枚举

通用枚举 数据库表添加字段sex 创建通用枚举类型 package com.xxxx.mybatisplus.enums;import com.baomidou.mybatisplus.annotation.EnumValue; import lombok.Getter;Getter public enum SexEnum {MALE(1,"男"),FEMALE(2,"女");EnumValue // 将注解所标…

信创产业发展应不忘初心牢记使命

受国际大环境影响,信创市场国产化替代步伐已然加速。由于其中存在巨大的商机,信创市场中已然出现一些乱象。有的厂商拿洋技术标榜和宣传自主;有的厂商全国各地跑马圈地建产业园,进而向当地政府要政策要市场;有的厂商恶…

mysql采用 级触发_Mysql高级之触发器(trigger)

触发器是一类特殊的事务 ,可以监视某种数据操作(insert/update/delete),并触发相关操作(insert/update/delete)。看以下事件:完成下单与减少库存的逻辑Insert into o (gid,num) values (2,3); // 插入语句Update g set goods_num goods_num - 3 where id 2;// 更新…

[MyBatisPlus]代码生成器

代码生成器 引入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.1</version></dependency><dependency><groupId>org.freemarker</groupId…

飞机游戏项目完整代码(详解JAVA300集)

一&#xff1a;简介 这是一个可以通过键盘移动飞机位置 然后可以躲避 炮弹的打击 &#xff0c;游戏结束为 当炮弹与飞机发生碰撞 则 最后显示出飞机存活的时长 代表游戏结束 二&#xff1a;上码 1&#xff1a;运行游戏的类 package src.src.cn.wyj.飞机;import java.awt.Co…

[MyBatisPlus]模拟多数据源环境及测试

模拟多数据源环境 多数据源 适用于多种场景&#xff1a;纯粹多库、 读写分离、 一主多从、 混合模式等 目前我们就来模拟一个纯粹多库的一个场景&#xff0c;其他场景类似 场景说明&#xff1a; 我们创建两个库&#xff0c;分别为&#xff1a;mybatis_plus&#xff08;以前…

生活有哪些残忍的真相?

1.很多人拼尽全力&#xff0c;只是为了艰难的生存。2.大多数人一点也不喜欢读书&#xff0c;只是喜欢被别人贴上“爱读书”的标签罢了。3.你越没能力&#xff0c;社交圈质量就越低&#xff0c;碰到的傻逼就越多。4.职场绝不能追求快乐&#xff0c;只能追求痛苦的成长。5.抬起头…

7-17 汉诺塔的非递归实现 (25 分)(思路分析)

一&#xff1a;题目 借助堆栈以非递归&#xff08;循环&#xff09;方式求解汉诺塔的问题&#xff08;n, a, b, c&#xff09;&#xff0c;即将N个盘子从起始柱&#xff08;标记为“a”&#xff09;通过借助柱&#xff08;标记为“b”&#xff09;移动到目标柱&#xff08;标记…

[MyBatisPlus]MyBatisX插件

MyBatisX插件 MyBatis-Plus为我们提供了强大的mapper和service模板&#xff0c;能够大大的提高开发效率 但是在真正开发过程中&#xff0c;MyBatis-Plus并不能为我们解决所有问题&#xff0c;例如一些复杂的SQL&#xff0c;多表联查&#xff0c;我们就需要自己去编写代码和SQ…