深入浅析Redis中的位图(bitmap)


本篇文章带大家了解一下redis中的位图(bitmap),希望对大家有所帮助!

深入浅析Redis中的位图(bitmap)

Redis 的位图(bitmap)是由多个二进制位组成的数组,数组中的每个二进制位都有与之对应的偏移量(从 0 开始),通过这些偏移量可以对位图中指定的一个或多个二进制位进行操作。【相关推荐:Redis视频教程】

实际上,位图并不是 Redis 提供的一种新的数据类型,它是字符串类型的扩展。所以位图的命令可以直接使用在字符串类型的键上,位图命令操作的键也可以被字符串类型命令操作。

比如,现有一个字符串键 foo:

redis> set foo bar

1 个字节由 8 个二进制位组成,所以 foo 键的二进制形式就是:

1.png

SETBIT

通过 SETBIT 命令,可以为位图指定偏移量上的二进制位设置值,offset 必须大于等于 0,value 只能是 0 或 1。此命令的时间复杂度是 O(1)。

SETBIT key offset value

SETBIT 命令在对二进制位进行设置之后,将返回二进制位被设置之前的旧值作为结果。

假设现在想把 bar 变为 aar,只需如下两步操作:

redis> setbit foo 6 0
(integer) 1
redis> setbit foo 7 1
(integer) 0
redis> get foo"aar"

当执行 SETBIT 命令尝试对一个位图进行设置的时候,如果位图不存在,或者位图当前的大小无法满足,Redis 将对被设置的位图进行扩展,并将所有未被设置的二进制位的值初始化为 0。比如:

redis> setbit far 10 1

由于 far 并不存在,所以 Redis 会将 0~9 的二进制位设置为 0,因为 Redis 对位图的扩展操作是以字节为单位进行的,所以实际上 far 一共有 16 个二进制位,并不是 10 个,且 11~15 的二进制位也是 0。

基于这种情况,当指定的二进制位偏移量过大时,Redis 需要一次性分配完所有内存,这可能会造成 Redis 服务器阻塞。比如存储用户的性别,1 代表男性,0 代表女性,使用 ID 作为二进制偏移量,如果 ID 从 10000000001 开始的,就需要将用户 ID 减去 10000000000 再进行存储,否则会造成内存浪费。

GETBIT

使用 GETBIT 命令可以获取位图指定偏移量上的二进制位的值。此命令的时间复杂度是 O(1)。

GETBIT key offset

如果输入的偏移量超过了位图目前拥有的最大偏移量,将返回 0 作为结果。

BITCOUNT

通过 BITCOUNT 命令可以统计位图中值为 1 的二进制位数量。此命令的时间复杂度是 O(n)。

BITCOUNT key [start end]

SONIFY.io SONIFY.io

设计和开发音频优先的产品和数据驱动的解决方案

SONIFY.io 83 查看详情 SONIFY.io

在默认情况下,BITCOUNT 命令对位图包含的所有字节中的二进制位进行统计,也可以通过可选的 start 参数和 end 参数,让 BITCOUNT 只对指定字节范围内的二进制位进行统计(不是二进制偏移量)。比如,希望统计 ar 两个字节中值为 1 的二进制数量:

redis> bitcount foo 1 2
(integer) 7

start 和 end 参数也支持使用负数索引,下方的用法与上方的等效:

redis> bitcount foo -2 -1
(integer) 7

BITPOS

通过执行 BITPOS 命令,在位图中查找第一个被设置为指定值的二进制位,并返回这个二进制位的偏移量。

BITPOS key value [start end]

BITPOS 也接受可选的 start 参数和 end 参数,让 BITPOS 命令只在指定字节范围内的二进制位中进行查找。

redis> get foo"aar"redis> bitpos foo 1
(integer) 1
redis> bitpos foo 0
(integer) 0
redis> bitpos foo 0 1 2
(integer) 8
redis> bitpos foo 1 1 2
(integer) 9
redis> bitpos foo 1 -1 -1
(integer) 17

针对边界的处理:

  • 当尝试对一个不存在的位图或者一个所有位都被设置成了 0 的位图中查找值为 1 的二进制位时,BITPOS 命令将返回 -1 作为结果。
  • 如果在一个所有位都被设置成 1 的位图中查找值为 0 的二进制位,那么 BITPOS 命令将返回位图最大偏移量加上 1 作为结果

BITOP

通过 BITOP 命令,对一个或多个位图执行指定的二进制位运算,并将运算结果存储到指定的键中。

BITOP operation destkey key [key ...]

operation 参数的值可以是 AND、OR、XOR、NOT 中的任意一个,这 4 个值分别对应逻辑并、逻辑或、逻辑异或和逻辑非 4 种运算,其中 AND、OR、XOR 这 3 种运算允许用户使用任意数量的位图作为输入,而 NOT 运算只允许使用一个位图作为输入。BITOP 命令在将计算结果存储到指定键中之后,会返回被存储位图的字节长度。

当 BITOP 命令在对两个长度不同的位图执行运算时,会将长度较短的那个位图中不存在的二进制位的值看作 0。

redis> set foo1 bar
OK
redis> set foo2 aar
OK
redis> bitop or res foo1 foo2
(integer) 3
redis> get res"car"

2.png

注意:BITOP 可能是一个缓慢的命令,它的时间复杂度是 O(N),在处理长字符串时应注意一下效率问题。

应用场景

用户行为记录器

用用户 ID 作为偏移量,若用户做了某种行为则通过 SETBIT 将二进制位设置为 1,通过 GETBIT 判断用户是否做了某种行为,通过 BITCOUNT 可以知道有多少用户执行了行为。

用户上线统计

可以使用 SETBIT 和 BITCOUNT 来实现,以用户 ID 作为 key ,假设今天是上线统计功能开放的第一天,ID 为 1 的用户上线后就通过 SETBIT 1 0 1。当要计算此用户的总共以来的上线次数时,使用 BITCOUNT 命令就可以得出的结果。

使用这种方式存储数据,即使 10 年后,1个用户就只占用几百字节的内存,它的处理速度依然很快。如果 bitmap 数据比较大,建议将 bitmap 拆分成多个小的 bitmap 分别进行处理。

更多编程相关知识,请访问:编程入门!!

以上就是深入浅析Redis中的位图(bitmap)的详细内容,更多请关注其它相关文章!


# 会将  # 小公司seo  # 嘉兴网站推广威欣hfqjwl下拉  # 三明推广营销公司  # seo找27火星软件  # 营销推广语美食广告图片  # 郑州软件营销推广公司  # 沈阳seo服务排名前十  # 南平抖音seo搜索  # 昌图县关键词seo排名优化  # 校花评选 微博营销推广  # Redis  # 在对  # 可选  # 不存在  # 并将  # 设置为  # 值为  # 图中  # 多个  # 偏移量  # 位图 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 解决CSS容器溢出问题:使用calc()实现精确布局与边距控制  CodeIgniter 3 中基于 MySQL 数据高效生成动态图表教程  Python csv 模块处理非字符串数据:列表写入 CSV 文件的机制解析  Dash应用中自定义HTML页面标题与网站图标(F*icon)的实用指南  Lar*el 中高效执行多列更新:单次查询实现  海棠阅读登录教程_详细讲解海棠登录操作  苹果17 Pro如何启用分屏浏览_iPhone 17 Pro分屏浏览设置步骤  《环球网校》设置报考省市方法  悟空浏览器如何恢复关闭的标签页 悟空浏览器撤销关闭网页快捷键设置  vivo浏览器怎么离线保存网页 vivo浏览器下载完整页面以便无网络时阅读  J*aScript二进制处理_ArrayBuffer与Blob  惠普电脑BIOS界面看不懂怎么办_HP电脑BIOS功能选项解读与设置  Python高效统计字典嵌套列表值在目标列表中的出现次数  有道AI翻译入口 智能写作官方网站入口  猫眼app抢票快还是小程序快  J*a列表元素格式化输出教程  《随手记》关闭首页消息推送方法  外卖小程序对接第三方配送  J*aScript桌面应用_Electron多进程架构实战  C++如何实现单例模式_C++线程安全的单例模式写法  sublime如何处理超大文件不卡顿 _sublime打开大日志文件技巧  作业帮网页版不用下载入口 在线问老师快速答疑  汽水音乐网页端访问 汽水音乐官方网页直达  rabbitmq 持久化有什么缺点?  构建可配置的J*aScript加权点击计数器与共享总计功能  mysql通配符能用于日志查询吗_mysql通配符在系统日志查询中的实际使用方法  快手网页版官方访问 快手网页版页面在线打开  免费占卜在线神算_免费占卜手机神算  三星A55应用闪退排查步骤_Samsung A55稳定性优化技巧  Python对象引用与属性赋值:理解链表中的行为  利用Flexbox实现图片元素的二维布局:2x2网格排列指南  qq邮箱怎么注册_QQ邮箱注册步骤与注意事项  一加 Ace 6V 快充无法启用_一加 Ace 6V 充电优化  《桃源记2》资源采集攻略  Excel宏怎么删除_Excel中删除宏的详细操作流程  C++ switch case字符串_C++如何实现字符串switch匹配  邦丰播放器频道搜索设置  解决Windows上Composer PATH变量冲突导致的命令无法识别问题  Win10如何关闭操作中心通知 Win10免打扰设置全攻略【清爽】  《三角洲行动》战斗步枪与机枪类改装代码分享  tiktok国际版入口_tiktok官网网页版链接  Sublime怎么快速复制文件路径_Sublime右键菜单增强技巧  动漫岛汉化官网网 动漫岛官方动漫汉化地址  无人机考证官网 中国民航无人机考证官网登录入口  XPath动态元素定位:如何精准选择文本内容变化的元素  抖音猜你想搜能说明对方搜过吗  Sublime Text怎么关闭自动完成_Sublime禁用Auto Complete设置  Sublime怎么格式化HTML代码_Sublime前端代码美化插件使用指南  广州地铁app准妈咪徽章领取方法  Python模块化编程:避免循环导入与共享函数的最佳实践 

 2021-12-02

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.