Redis--Bitmap有序集合的语法和使用场景举例

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

前言

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

Bitmap概述

  • 在开发中,我们常常需要存放一些布尔类型的数据,比如我们的上班打卡记录,游戏签到记录等等。假设一个公司工作签到打卡的场景,一个员工今年第1,2,3天都工作了,需要对1,2,3做记录,如果对这三个整型数使用unsigned int来记录的话,那么需要3*4=12个字节,也就是96个bit的存储空间。而一个员工要这样记录一整年的数据,公司又不止一个员工,那么这个打卡功能就将耗费大量空间。
  • 为了节省空间,Redis提供了Bitmap,也就是位图这种数据结构。所谓位图,其实就是一个bit数组,对于一年上班打卡的记录,只需要提供一个365位的bit数组,如果第一天工作了,那就将第一位bit的0改为1即可。这样一来,一个人一年的打卡记录,只需要365bit位就可以记录完成了。位图按位来存储,大大节约了空间,其存储上限为2^32。

Bitmap命令介绍

  • bitmap设置某一位的值: SETBIT key offset value

    # 字母a的ASCII码是97,二进制就是01100001,一个字节 八个比特
    # 字母b的ASCII码是98,二进制就是01100010
    # 所以存入a只需要将0,6,7位设为1即可
    # 接着存入b就需要将10,14,15位设为1。
    setbit word 0 1
    setbit word 6 1
    setbit word 7 1
    setbit word 10 1
    setbit word 14 1
    setbit word 15 1
    
    # 除此之外,可以之间用字符串填充位的值
    set word ab 
    # 这个指令等价于上面的setbit
    
  • 获取bitmap中的数据,使用单个位操作获取位的值: getbit key offset

    getbit word 0 1
    getbit word 1 1
    
  • 统计bitmap指定位区间上,值为 1 的个数: bitcount key [start end]

    bitcount word    # 统计key为word的位图中有多少个1
    bitcount word 0 1 # 前两个字符中有几个1 
    
  • 返回bitmap中第一个值为bit的二进制位的位置,可以指定范围: bitpos key bit [start end]

    bitpos word 1  # 返回第一个为1的位
    bitpos word 0 0 1  # 返回前两个字符中第一个为0的位
    
  • 对一个或多个保存二进制位的字符串 key 进行位元操作(and,or,not,xor),并将结果保存到 destkey 上: BITOP operation destkey key [key …]

    bitop not new_word word # 对key为word的位图取反后存入new_word之中
    

Redis--Bitmap有序集合的语法和使用场景举例,Redis,redis,数据库,后端,java文章来源地址https://www.toymoban.com/news/detail-820071.html

使用场景

  • 需求:40亿个QQ号,限制1G的内存,如何对这些QQ号进行去重。
  • 实现方案:通过分析需求,有1G内存的限制,所以可以使用位图来节省空间。使用位图的话,一个qq号,即一个数字只需要占用一个bit(将这个bit设置为1),那么40亿个数字也就只需要400000000/8/1024/1024=476M,满足要求。
  • 代码实现:
    public class RedisBitmap {
      
       private static final String QQ_NUMBER = "QQ";
    
       /**
        * 将qq号码存入位图中
        * 即将位图对应qq号码的bit设为1
        * @param key
        * @param qq_number
        * @param jedis
        */
       public static void saveQQNumber(String key, long qq_number, Jedis jedis){
           jedis.setbit(key,qq_number,true);
       }
    
       /**
        * 获取bitmap中1的数量即可得到去重后的qq号数量
        * @param key
        * @param jedis
        */
       public static Long getCount(String key,  Jedis jedis){
           return jedis.bitcount(key);
       }
    
    }
    

结尾

  • bitmap常用于上面提及的去重,上班打卡,签到记录功能,使用bitmap可以减少很多不必要的存储空间。所以当出现类似的场景时,就好好使用它吧。

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

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

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

相关文章

  • 在Spring Boot微服务使用ZSetOperations操作Redis集群Zset(有序集合)

    记录 :447 场景 :在Spring Boot微服务使用RedisTemplate的ZSetOperations操作Redis集群的Zset(有序集合)数据类型。 版本 :JDK 1.8,Spring Boot 2.6.3,redis-6.2.5。 1.微服务中 配置Redis信息 1.1在pom.xml添加依赖 pom.xml文件: 解析:spring-boot-starter-data-redis和spring-boot版本保持一致。 1.2在application.ym

    2024年02月08日
    浏览(34)
  • Redis有序集合-Zset

    简介 Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合 不同之处是有序集合的每个成员都关联了一个****评分(score)****,这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 因为元素

    2024年02月02日
    浏览(27)
  • Redis的BitMap使用

    Redis 为我们提供了位图这一数据结构,每个用户每天的登录记录只占据一位,365天就是365位,仅仅需要46字节就可存储,极大地节约了存储空间。 位图不是实际的数据类型,而是一组面向位的操作 在被视为位向量的字符串类型上定义。 由于字符串是二进制安全 blob,其最大长

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

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

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

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

    2024年02月05日
    浏览(31)
  • 使用Spring Boot操作Redis、ES、MongoDB举例

    在Spring Boot应用程序中操作Redis通常涉及到使用Spring Data Redis,这是一个提供简便方法来操作Redis的库。以下是一个基本示例,演示如何在Spring Boot应用程序中集成和使用Redis: 步骤 1: 添加依赖项 首先,在你的 pom.xml 文件中添加Spring Data Redis的依赖项。 步骤 2: 配置Redis 在你的

    2024年01月25日
    浏览(32)
  • Redis教程——Redis bitmap位图操作(图解)

    在平时开发过程中,经常会有一些 bool 类型数据需要存取。比如记录用户一年内签到的次数,签了是 1,没签是 0。如果使用 key-value 来存储,那么每个用户都要记录 365 次,当用户成百上亿时,需要的存储空间将非常巨大。为了解决这个问题,Redis 提供了位图结构。 位图(

    2024年01月21日
    浏览(31)
  • Redis - Bitmap

    操作String数据类型的key所存储的字符串指定偏移量上的位,返回原位置的值 优点: 节省空间通过一个bit位来表示某个元素对应的值或者状态,其中key就是对应元素的值。实际上8个bit可以组成一个Byte,所以是及其节省空间的 效率高setbit 和 getbit的时间复杂度都是O(1),其他位运

    2024年02月15日
    浏览(44)
  • redis之Bitmap

    位图数据结构其实并不是一个全新的玩意,我们可以简单的认为就是个数组,只是里面的内容只能为0或1而已(二进制位数组)。 GETBIT 用于返回位数组在偏移量上的二进制位的值。 值得我们注意的是, GETBIT 的时间复杂度是 O(1) 。 GETBIT 命令的执行过程如下: 计算 (即 3 ),by

    2024年02月15日
    浏览(25)
  • SQL的五大约束作用、语法、应用场景及举例

    SQL的五大约束包括 主键约束(PRIMARY KEY)、唯一性约束(UNIQUE)、外键约束(FOREIGN KEY)、非空约束(NOT NULL)和默认约束(DEFAULT) 。 sql约束的作用:主要是 保证数据的完整性、准确性和一致性 ,从而 确保 数据库中存储的 数据质量 。 温馨提示:以下举例为mysql版本,若您

    2024年01月21日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包