本文介绍了REDIS的新数据类型之一:。它在当今的Internet环境中具有许多应用程序方案,例如Common Sign -in,喜欢,日常生活等。
我们都知道,BIT是计算机中最小的存储单元。8位形式一个字节,位只能存储两个值,0和1。
位图可以理解为由位存储组成的特定结构。多数位存储后,每个位置只能存储1和0。
那么使用位图有什么好处?
首先得出结论。
我们知道,在Java中,INT类型占4个字节,即4个字节。有三个数字:“ 1”,“ 3”和“ 5”。如果您存储在哈希姆普中,则需要3 4 8 = 96位空间存储。
如果将它们存储在位图中怎么办?
如上图所示,总共6位可以从0到5中存储一个整数。与Hashmap的存储方法相比,它减少了存储空间的16倍。
REDIS提供了数据类型的位图,从而使我们能够实现正确的操作。
位图实际上是一种redis字符串。它的外观只是我们可以根据位置操作字符串,Redis为其提供了一组单独的操作命令,这等同于稍微数组。每个位置只能存储0和1,并且其较低的出价从0对应于每个位。
在位图中设置值,指定偏移量,即竞标,从0开始。
格式,例如:
使用如下,记录学生的每日检查记录,标志-in为1,而标志-in为0:0:
结果如下。从0开始,您可以从左到右看到8,10,11,设置为1:
获取位图的值,指定偏移投标,返回1,返回0,然后返回为0,而无需投标。
格式,例如:
使用如下:
设置为1的位数可以指定采集范围。
格式是:
应该指出的是:启动和结束是基于字节。我们放在我们面前的8、10、11和三名学生的记录总共占据了16位数字,即两个字节,而最高的八个数字。
当我们测试它时,将会有以下现象:
当我们使用0?0的范围时,获得了第一个字节的实际统计数据,显然是0。
当我们使用0?1时,计算这两个字节的值,总共三个。
不要以为开始和结束是相应的位图出价
当我们使用0? -1时,这意味着第一个字节到最后一个字节
当我们使用0? -2时,这意味着第一个字节到倒数第二个字节。我们只有两个字节,因此相当于0?0,因此不是统计信息,如下所示:
关于BitCount,您需要了解它。如果您使用Java的Redis客户端(例如ReDistemplate等),则该层的原理被伪装成隐藏,因此我们不能直观地感受到字节和位之间的关系。
BITOP可以作为复合操作执行各种操作。它可以进行AD(交点)或(组合),而不是(非 - ),XOR(不同)和其他操作到多个位图,并将结果保存在目标命令中。
格式如下:有几种类型的操作。
使用如下,首先创建两个位图:
交叉点并存储在Destkey ::
结果如下,只有1和5排在线:
在Destkey中收集并存入::
结果如下:
关于不同的集合和不同或不同的集合,请勿进行单独的演示,使用方法是相同的。
应该注意的是,位图可以节省内存,但并不适用于所有情况。
假设该网站有1000万用户,但是只有100,000个活跃用户。这次,Bitmaps存储了绝大多数僵尸用户,但位的价值为0,这是无效的。仍然只浪费了利用率的百分之一。
而且,如果您使用地图或设置来存储这些100,000个用户,则可能不会使用太多的内存。
此外,还有另一种情况是以前的日常统计数据。如果用户的ID是这样的:1000001、1000002、1000003等,则先前存在的固定值为100,000,那么您需要拦截位图以避免引起内存浪费。
原始:https://juejin.cn/post/7102573743611838494