Redis:Bitmaps使用场景和常用命令

简介: Redis:Bitmaps使用场景和常用命令

Bitmaps介绍

    • Redis提供的Bitmaps这个“数据结构”可以实现对位的操作。Bitmaps本身不是一种数据结构,实际上就是字符串,但是它可以对字符串的位进行操作。
    • 可以把Bitmaps想象成一个以位为单位数组数组中的每个单元只能存0或者1数组的下标在bitmaps中叫做偏移量
    • 单个bitmaps的最大长度是512MB,即2^32个比特位。
    • bitmaps的最大优势是节省存储空间。例如,在一个以自增id代表不同用户的系统中,我们只需要512MB空间就可以记录40亿用户的某个单一信息(比如,用户是否希望接收新闻邮件)。
    • 有两种类型的位操作:一类是对特定bit位的操作,比如设置/获取某个特定比特位的值。另一类是批量bit位操作,例如在给定范围内统计为1的比特位个数。
    • Bitmap是一串连续的2进制数字(0或1),每一位所在的位置为偏移(offset),在bitmap上可执行AND,OR,XOR以及其它位操作。

    Bitmaps使用场景

      1. 各种实时分析(Real time analytics of all kinds)。
      2. 存储与对象ID关联的布尔信息,要求高效且高性能(Storing space efficient but high performance boolean information associated with object IDs.)。
        • 例如你想知道自己网站用户的最长连续访问天数。从0开始计数,每当有用户访问时,使用setbit设置一个bit位,bit位的index可以这样生成:(当前unix时间戳-计数开始时的时间戳)/(3600*24)。
        • 通过这种方法,你可以获取每个用户的每日来访记录。使用bitcount可以很容易的统计出某个特定用户的来访天数。使用几个bitpos命令,或者直接获取并分析对应的位图,就可以很容易的算出最长连续访问天数
        • bitmaps通常被分割成多个key,以免单个key中存放的数据过大。有一个分割key的小技巧:每个key存放M个bit位,key以”比特数(bit-number)/M”命名。第N个bit位,对应key中的位置用”比特数(bit-number)模M”获得。
        • 假设我们每个key只存储100位,现在有一个id为8303的用户来访问。那么这个用户对应的key应该是83(8303/100),在key:83中,与之对应的位置应该是3(8303 mod 100)。使用如下命令记录该用户访问:

           

        setbit 83 3 1

        image.gif

                             

        Bitmaps常用命令

        1.设置值

        命令:setbit key offset value

        image.gif

        setbit命令接收两个参数,

          • 第一个参数表示你要操作的是第几个bit位,第二个参数表示你要将这个位设为何值,可选值只有0,1两个。
          • 如果所操作的bit位超过了当前字串的长度,reids会自动增大字串长度。

          2 获取值

          命令:getbit key offset

          image.gif

          getbit只是返回特定bit位的值。如果试图获取的bit位在当前字串长度范围外,该命令返回0

          3 获取Bitmaps指定范围值为1的个数

          命令:bitcount key [start] [end]

          image.gif

          4 Bitmaps间的运算

            • bitop:对两个不同字串进行位运算。可进行的运算有AND, OR, XOR以及NOT

            4 .1 计算Bitmaps的交集的数量

            命令:bitop and destkey key[key…]

            返回:保存到 destkey 的字符串(1字符等于8位)的长度,和输入 key 中最长的字符串长度相等。

            4 .2 计算Bitmaps的并集的数量

            命令:bitop or destkey key[key…]

            返回:保存到 destkey 的字符串(1字符等于8位)的长度,和输入 key 中最长的字符串长度相等。

            4 .3  计算Bitmaps的非集的数量

            命令:bitop not destkey key

            返回:保存到 destkey 的字符串(1字符等于8位)的长度,和输入 key 中最长的字符串长度相等。

            4 .4  计算Bitmaps的异或集的数量

            命令:bitop xor destkey key[key..]

            返回:保存到 destkey 的字符串(1字符等于8位)的长度,和输入 key 中最长的字符串长度相等。

            5 计算Bitmaps中第一个值为targetBit的偏移量

              • bitpos: 查找第一个值为0/1的比特位的位置

              命令:bitpos key targetBit [start][end]

              返回:第一个值为的偏移量

              参考来源:https://redis.io/topics/data-types-intro#bitmaps

              相关文章
              |
              移动开发 NoSQL Redis
              阿里云Redis lua命令支持及相关限制说明
              介绍阿里云Redis对lua命令的支持
              12870 1
              |
              机器学习/深度学习 人工智能 算法
              深度强化学习中实验环境-开源平台框架汇总
              深度强化学习中实验环境-开源平台框架汇总
              1049 0
              |
              XML JSON API
              淘宝天猫API接入说明(淘宝天猫商品详情+关键词搜索商品列表)商品详情数据,商品sku数据,商品优惠券数据
              业务场景:作为全球最大的 B2C 电子商务平台之一,淘宝天猫平台提供了丰富的商品资源,吸引了大量的全球买家和卖家。为了方便开发者接入淘宝天猫平台,淘宝天猫平台提供了丰富的 API 接口,其中历史价格接口是非常重要的一部分。大家有探讨稳定采集淘宝(天猫)京东阿里拼多多等平台整站实时商品详情历史价格数据接口,通过该接口开发者可以更好地了解商品的情况,商品详情数据详细信息查询,数据参数包括:商品链接,商品列表主图、价格、标题,sku,库存,销量,店铺昵称,店铺等级,商品详情SKU属性,商品视频,商品优惠券,促销信息,详情属性描述,宝贝ID,区域ID,发货地,发货至,快递费用,物流费用等页面上有的数据
              |
              机器学习/深度学习 数据采集 边缘计算
              深度学习在智慧渔业中的应用:鱼类识别、计数与追踪的技术演进与挑战
              中国是全球最大水产品生产国,水产养殖产量连续32年居世界首位。传统鱼类监测方法效率低、主观性强,而深度学习凭借其强大的特征提取能力,正推动鱼类识别与行为分析技术革新,助力智慧渔业发展。
              1008 1
              |
              11月前
              |
              人工智能 监控 数据可视化
              提升团队复盘效率:年度复盘数据可视化工具的协作功能解析
              年度复盘是一项系统性总结工作,通过数据可视化呈现成果、分析趋势、发现问题。个人关注成长与技能提升,企业侧重绩效与战略达成。关键工具包括PowerBI、板栗看板等7款可视化软件,各有适用场景。数据清理、图表选择和AI辅助是提升复盘效率的重点。合理的复盘能指导未来决策,建议结合目标选择适合工具,用数据驱动新一年发展。
              614 0
              |
              NoSQL Redis 数据库
              Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
              通过本文的介绍,我们详细讲解了 Lua 脚本在 Redis 中的作用、`eval` 命令的使用方法以及 `redis.call` 和 `redis.pcall` 的区别和用法。通过合理使用 Lua 脚本,可以实现复杂的业务逻辑,确保操作的原子性,并减少网络开销,从而提高系统的性能和可靠性。
              1194 13
              |
              12月前
              |
              存储 JavaScript 区块链
              小试牛刀-walletconnect二维码及交互
              最近在使用walletconnect协议和typescript语言实现相关交互功能,在此对从walletconnet协议二维码生成、连接后发送交易事务、签名事务、签名任意信息的处理进行记录,加深对walletconnect的理解,熟悉对其组件的使用,同时希望帮助到有实现相关功能的朋友。
              459 1
              【Java集合类面试十一】、HashMap为什么用红黑树而不用B树?
              HashMap选择使用红黑树而非B树,是因为红黑树在内存中实现简单,节点更小,占用内存少,且在插入、删除和查找操作上提供更好的平衡性能。
              |
              传感器 存储 监控
              树莓派的应用场景有哪些
              树莓派是一种小型、低成本的计算机,广泛应用于教育、家庭自动化、媒体中心、游戏、机器人、物联网项目等领域,支持多种操作系统和编程语言。
              3149 8
              |
              物联网 C# C语言
              物联网开发中C、C++和C#哪个更好用
              在物联网(IoT)开发中,C、C++和C#各有优缺点,适用场景不同。C语言性能高、资源占用低,适合内存和计算能力有限的嵌入式系统,但开发复杂度高,易出错。C++支持面向对象编程,性能优秀,适用于复杂应用,但学习曲线陡峭,编译时间长。C#易于学习,与.NET框架结合紧密,适合快速开发Windows应用,但性能略低,平台支持有限。选择语言需根据具体项目需求、复杂性和团队技术栈综合考虑。
              1098 3