redis | 十一、redis之Bitmaps
redis系列文章: https://liudongdong.top/categories/redis 本篇来源: https://liudongdong.top/archives/redisshi-yi-redis-zhi-bitmaps 公众号:雨中散步撒哈拉 备注:欢迎关注公众号,一起学习,共同进步!
一、Bitmaps(位图)
Bitmaps 并不是实际的数据类型,而是定义在String类型上的一个面向字节操作的集合。因为字符串是二进制安全的块,他们的最大长度是512M,最适合设置成2^32个不同字节。
Bitmaps 的最大优势之一在存储信息时极其节约空间。例如,在一个以增量用户ID来标识不同用户的系统中,记录用户的四十亿的一个单独bit信息(例如,要知道用户是否想要接收最新的来信)仅仅使用512M内存。
1. getbit key offset
获取位图指定索引的值
127.0.0.1:6379> set bitmap big
OK
127.0.0.1:6379> getbit bitmap 0
(integer) 0
127.0.0.1:6379> getbit bitmap 1
(integer) 1
127.0.0.1:6379> getbit bitmap 2
(integer) 1
127.0.0.1:6379>
image.png
2. setbit key offset value
给位图指定索引设置值,返回该索引位置的原始值
127.0.0.1:6379> setbit bitmap 7 1
(integer) 0
127.0.0.1:6379> get bitmap
"cig"
127.0.0.1:6379>
3. bitcount key [start end]
获取位图指定范围(start到end,单位为字节,如果不指定就是获取全部)位值为1的个数。
127.0.0.1:6379> bitcount bitmap
(integer) 13
127.0.0.1:6379> setbit bitmap 8 1
(integer) 0
127.0.0.1:6379> bitcount bitmap
(integer) 14
127.0.0.1:6379>
4. bitop and|or|not|xor destkey key [key…]
做多个bitmap的and(交集)、or(并集)、not(非)、xor(异或)操作并将结果保存到destkey中。
127.0.0.1:6379> set hello good
OK
127.0.0.1:6379> set world good
OK
127.0.0.1:6379> bitop and hello_world hello world
(integer) 4
127.0.0.1:6379> get hello_world
"good"
127.0.0.1:6379> bitop or hello_world hello world
(integer) 4
127.0.0.1:6379> get hello_world
"good"
127.0.0.1:6379> bitop not hello_world hello
(integer) 4
127.0.0.1:6379> get hello_world
"\x98\x90\x90\x9b"
127.0.0.1:6379> bitop xor hello_world hello world
(integer) 4
127.0.0.1:6379> get hello_world
"\x00\x00\x00\x00"
127.0.0.1:6379>
5. bitpos key targetBit [start] [end] (起始版本:2.8.7)
计算位图指定范围(start到end,单位为字节,如果不指定就是获取全部)第一个偏移量对应的值等于targetBit的位置。
127.0.0.1:6379> set hello big
OK
127.0.0.1:6379> bitpos hello 1
(integer) 1
127.0.0.1:6379> bitpos hello 0
(integer) 0
127.0.0.1:6379> bitpos hello 1 2 2
(integer) 17
127.0.0.1:6379> bitpos hello 1 2 3
(integer) 17
127.0.0.1:6379> bitpos hello 0 2 3
(integer) 16
127.0.0.1:6379> bitpos hello 0 0 3
(integer) 0
127.0.0.1:6379> bitpos hello 1 0 3
(integer) 1
实战应用
独立用户访问统计
- 使用 set 和 Bitmap (前提是用户的ID必须是整型)
- 1亿用户,五千万独立
数据类型 | 每个userId占用空间 | 需要存储的用户量 | 内存使用总量 |
---|---|---|---|
set | 32位(假设userId用的是integer) | 50,000,000 | 32位*50,000,000=200MB |
Bitmap | 1位 | 100,000,000 | 1位*100,000,000=12.5MB |
- 若只有10万独立用户
数据类型 | 每个userId占用空间 | 需要存储的用户量 | 内存使用总量 |
---|---|---|---|
set | 32位(假设userId用的是整型) | 100,000 | 32位*100,000=4MB |
Bitmap | 1位 | 100,000,000 | 1位*100,000,000=12.5MB |
相关文章
- 重新开启 Redis 订阅之旅(redis重新订阅)
- 掌握Redis之道:数据流管理(redis数据流)
- Redis:硬性限制数量(redis数量上限)
- Memcache与Redis:一窥两者的异同(memcache和redis区别)
- 优化应用性能:使用Redis实现高效数据存储和缓存(appredis)
- 解决Redis访问限制的技术方案(redis限制)
- 深入了解Redis的编码格式(查看redis编码格式)
- 搭建高可用高性能的分布式Redis集群(搭建分布式redis)
- 冲刺性能利用Redis开启分布式缓存服务(分布式缓存服务Redis)
- 使用Maven添加Redis依赖(如何添加redis依赖包)
- Redis默认密码设置与安全性(redis默认密码是什么)
- 破解Redis集群非主从架构的关键(redis集群 非主从)
- Redis集群面临灾难完全崩溃(redis集群全部挂掉)
- 利用Redis解决重复请求问题(redis 防止重复请求)
- Redis部署之路实现主从同步(redis部署主从)
- 利用Redis实现被动缓存提高访问性能(redis被动缓存)
- 问题时代Redis作为数据库能否行得通(redis能不能做数据库)
- 极速体验Redis缓存加速商城项目(redis缓存商城项目)