Redis - Bitmap

这篇具有很好参考价值的文章主要介绍了Redis - Bitmap。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是Bitmap

操作String数据类型的key所存储的字符串指定偏移量上的位,返回原位置的值
优点:

  • 节省空间通过一个bit位来表示某个元素对应的值或者状态,其中key就是对应元素的值。实际上8个bit可以组成一个Byte,所以是及其节省空间的
  • 效率高setbit 和 getbit的时间复杂度都是O(1),其他位运算效率也高

缺点:

  • 不在意业务数据本质上位只有0和1的区别,所以用位做业务数据记录,就不需要在意value的值、

位图不是特殊的数据结构,它的内容其实就是普通字符串,也就是 byte 数组。我们可以使用普通的 get/set直接获取和设置整个位图的内容,也可以使用位图操作 getbit/setbit 等将 byte 数组看成 [位数组] 来处理。

用法

setbit

说明:给一个指定key的值第offset位赋值位value
参数:key offset value: bool or int(1 or 0)
返回值:LONG:0 or 1

127.0.0.1:6379> setbit bit 1 1
(integer) 0

getbit

说明:返回一个指定key的二进制信息
参数:key offset
返回值:LONG:0 or 1

127.0.0.1:6379> getbit bit 1
(integer) 1

bitcount

说明:返回一个指定key中位的值为1的个数
参数:key offset start end
返回值:LONG:0 or 1

127.0.0.1:6379> bitcount bit 0 -1
(integer) 2

bitfield

bitfield 有三个子指令,分别是get/set/incrby,它们都可以对指定位片段进行读写,但是最多只能处理64个连续对位,如果超过64位,就得使用多个子指令,bitfield 可以一次执行多个子指令

127.0.0.1:6379> set w hello
OK
127.0.0.1:6379> bitfield w get u4 0 # 从第一个位开始取 4 个位,结果是无符号数 (u)
(integer) 6
127.0.0.1:6379> bitfield w get u3 2 # 从第三个位开始取 3 个位,结果是无符号数 (u)
(integer) 5
127.0.0.1:6379> bitfield w get i4 0 # 从第一个位开始取 4 个位,结果是有符号数 (i)
1) (integer) 6
127.0.0.1:6379> bitfield w get i3 2 # 从第三个位开始取 3 个位,结果是有符号数 (i)
1) (integer) -3

执行多个子指令:

127.0.0.1:6379> bitfield w get u4 0 get u3 2 get i4 0 get i3 2
1) (integer) 6
2) (integer) 5
3) (integer) 6
4) (integer) -3

使用 incrby:

127.0.0.1:6379> set w hello
OK
127.0.0.1:6379> bitfield w incrby u4 2 1 # 从第三个位开始,对接下来的 4 位无符号数 +1
1) (integer) 11
127.0.0.1:6379> bitfield w incrby u4 2 1
1) (integer) 12
127.0.0.1:6379> bitfield w incrby u4 2 1
1) (integer) 13
127.0.0.1:6379> bitfield w incrby u4 2 1
1) (integer) 14
127.0.0.1:6379> bitfield w incrby u4 2 1
1) (integer) 15
127.0.0.1:6379> bitfield w incrby u4 2 1 # 溢出折返了
1) (integer) 0

饱和截断 SAT:

127.0.0.1:6379> set w hello
OK
127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1
1) (integer) 11
127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1
1) (integer) 12
127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1
1) (integer) 13
127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1
1) (intege) 14
127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1
1) (integer) 15
127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1 # 保持最大值
1) (integer) 15

失败不执行 FAIL:文章来源地址https://www.toymoban.com/news/detail-616806.html

127.0.0.1:6379> set w hello
OK
127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1
1) (integer) 11
127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1
1) (integer) 12
127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1
1) (integer) 13
127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1
1) (integer) 14
127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1
1) (integer) 15
127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1 # 不执行
1) (nil)

到了这里,关于Redis - Bitmap的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis的3大特殊数据类型(1)-BitMap

    BitMap(位图/位数组) 是Redis2.2.0版本中引入的一种新数据类型,该数据类型本质是一个 仅含0和1 的二进制字符串。因此可以把 Bitmap 想象成一个 以位为单位的数组 ,数组的每个单元 只能存储 0 和 1 ,数组的下标在 Bitmap 中叫做偏移量 offset,bitmap默认值都为0. BitMap底层实际上使

    2024年02月11日
    浏览(40)
  • 轻松打卡:使用Spring Boot和Redis Bitmap构建高效签到系统【redis实战 四】

    欢迎来到我的博客,代码的世界里,每一行都是一个故事 Redis List:打造高效消息队列的秘密武器【redis实战 一】 Redis Streams在Spring Boot中的应用:构建可靠的消息队列解决方案【redis实战 二】 Spring Boot和Redis Geo实现附近的人【redis实战 三】 在数字化时代,签到系统已成为许多

    2024年01月23日
    浏览(33)
  • Redis--Bitmap有序集合的语法和使用场景举例

    前言 Redis除了常见的五种数据类型之外,其实还有一些少见的数据结构,如Geo,HyperLogLog,Bitmap等。虽然它们少见,但是作用却不容小觑。本文将介绍Bitmap数据类型的语法和使用场景。 下文将介绍bitmap的使用指令,以及其应用场景。 Bitmap概述 在开发中,我们常常需要存放一

    2024年01月24日
    浏览(90)
  • Redis 实战篇:巧用 Bitmap 实现亿级海量数据统计

    在移动应用的业务场景中,我们需要保存这样的信息:一个 key 关联了一个数据集合。 常见的场景如下: 给一个 userId ,判断用户登陆状态; 显示用户某个月的签到次数和首次签到时间; 两亿用户最近 7 天的签到情况,统计 7 天内连续签到的用户总数; 通常情况下,我们面

    2024年02月02日
    浏览(48)
  • 深入学习 redis - Stream、Geospatial、HyperLogLog、Bitmap、Bitfields 类型扩展

    目录 前言 Stream geospatial HyperLogLog Bitmaps Bitfields redis 中最关键的五个数据类型 String、List、Hash、Set、Zset 应用最广泛,同时 redis 也推出了额外的 5 个数据类型,他们分别是针对特殊场景才进行的应用的. Ps:这几种类型的具体使用不用记,记你也记不住,因为不常用,因此我们

    2024年02月15日
    浏览(54)
  • 微服务—Redis实用篇-黑马头条项目用户签到功能(使用bitmap实现)与UV统计

    1.1、用户签到-BitMap功能演示 我们针对签到功能完全可以通过mysql来完成,比如说以下这张表 用户一次签到,就是一条记录,假如有1000万用户,平均每人每年签到次数为10次,则这张表一年的数据量为 1亿条 每签到一次需要使用(8 + 8 + 1 + 1 + 3 + 1)共22 字节的内存,一个月则

    2024年02月05日
    浏览(31)
  • redis7高级篇3 数据量亿级别的统计分析(hyperloglog,bitmap,geo)

    1.聚合统计:统计多个集合聚合的结果,也就是多个集合之间交并差的统计。 2.排序统计:在需要展示最新列表,排行榜等场景时,如果数据更新频繁或者需要分页时,建议使用zset127.0.0.1:6379 zadd pl  111222 beijing 111223 tianjing 111333 shanghai (integer) 3 127.0.0.1:6379 zrange pl 0 1 1) \\\"beijin

    2024年02月11日
    浏览(35)
  • 【Redis】多级缓存(nginx缓存、redis缓存及tomcat缓存)

    传统的缓存策略一般是请求到达 tomcat 后,先查询redis,如果未命中则查询数据库。这种方式存在以下两个问题: 请求要经过 tomcat 处理, tomcat 的性能成为整个系统的瓶颈。 redis缓存失效时,会对数据库产生冲击。 多级缓存 就是充分利用请求处理的每个环节,分别添加缓存

    2023年04月21日
    浏览(31)
  • 【Redis】封装Redis缓存工具解决缓存穿透与缓存击穿问题

    基于StringRedisTemplate封装一个缓存工具,主要有一下几个方法 方法1:将任意Java对象序列化为json并存储在String的指定key中且设置TTL 方法2:将任意Java对象序列化为json并存储在String的指定key中,并可以设置逻辑过期时间,用户处理缓存击穿问题 方法3:根据指定的key进行查询缓

    2024年02月06日
    浏览(41)
  • Redis学习(三)分布式缓存、多级缓存、Redis实战经验、Redis底层原理

    单节点Redis存在着: 数据丢失问题:单节点宕机,数据就丢失了。 并发能力和存储能力问题:单节点能够满足的并发量、能够存储的数据量有限。 故障恢复问题:如果Redis宕机,服务不可用,需要一种自动的故障恢复手段。 RDB持久化 RDB(Redis database backup file,Redis数据库备份

    2024年02月16日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包