Redis位图bitmap操作

目录
  • 定义
  • 强势点
    • SETBIT 命令
    • GETBIT 命令
    • BITCOUNT 命令
  • 应用场景案例

定义

1、位图不是真正的数据类型,它是定义在字符串类型中
2、一个字符串类型的值最多能存储512M字节的内容,位上限:2^32

# 1MB = 1024KB
# 1KB = 1024Byte(字节)
# 1Byte = 8bit(位)

强势点

可以实时的进行统计,极其节省空间。官方在模拟1亿2千8百万用户的模拟环境下,在一台MacBookPro上,典型的统计如“日用户数”的时间消耗小于50ms, 占用16MB内存

SETBIT 命令

  • 说明:设置某位置上的二进制值
  • 语法:SETBIT key offset value
  • 参数:offset - 偏移量 从0开始

​ value - 0或者1

示例:

# 默认扩展位以0填充
127.0.0.1:6379> SET mykey ab
OK
127.0.0.1:6379> GET mykey
"ab"
127.0.0.1:6379> SETBIT mykey 0 1
(integer) 0
127.0.0.1:6379> GET mykey
"\xe1b"
127.0.0.1:6379>

GETBIT 命令

  • 说明:获取某一位上的值
  • 语法:GETBIT key offset

示例:

127.0.0.1:6379> GETBIT mykey 3
(integer) 0
127.0.0.1:6379> GETBIT mykey 0
(integer) 1
127.0.0.1:6379>

BITCOUNT 命令

  • 说明:统计键所对应的值中有多少个 1
  • 语法:BITCOUNT key start end
  • 参数:start/end 代表的是 字节索引

示例:

127.0.0.1:6379> SET mykey1 ab
OK
127.0.0.1:6379[4]> BITCOUNT mykey
(integer) 6
127.0.0.1:6379[4]> BITCOUNT mykey 0 0
(integer) 3

应用场景案例

# 网站用户的上线次数统计(寻找活跃用户)
    用户名为key,上线的天作为offset,上线设置为1
# 示例
    用户名为 user1:login 的用户,今年第1天上线,第30天上线
    SETBIT user1:login 0 1
    SETBIT user1:login 29 1
    BITCOUNT user1:login

到此这篇关于Redis位图bitmap操作的文章就介绍到这了,更多相关Redis位图操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅谈Redis位图(Bitmap)及Redis二进制中的问题

    Redis位图(Bitmap)及二进制的问题 SETBIT key offset value 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit).位的设置或清除取决于 value 参数,可以是 0 也可以是 1 .当 key 不存在时,自动生成一个新的字符串值.字符串会进行伸展(grown)以确保它可以将 value 保存在指定的偏移量上.当字符串值进行伸展时,空白位置以 0 填充.offset 参数必须大于或等于 0 ,小于 2^32 (bit 映射被限制在 512 MB 之内

  • 基于Redis位图实现用户签到功能

    场景需求 适用场景如签到送积分.签到领取奖励等,大致需求如下: 签到1天送1积分,连续签到2天送2积分,3天送3积分,3天以上均送3积分等. 如果连续签到中断,则重置计数,每月初重置计数. 当月签到满3天领取奖励1,满5天领取奖励2,满7天领取奖励3--等等. 显示用户某个月的签到次数和首次签到时间. 在日历控件上展示用户每月签到情况,可以切换年月显示--等等. 设计思路 对于用户签到数据,如果每条数据都用K/V的方式存储,当用户量大的时候内存开销是非常大的.而位图(BitMap)是由一组bit

  • 基于Redis位图实现系统用户登录统计

    项目需求,试着写了一个简单登录统计,基本功能都实现了,日志数据量小.具体性能没有进行测试~ 记录下开发过程与代码,留着以后改进! 1. 需求 实现记录用户哪天进行了登录,每天只记录是否登录过,重复登录状态算已登录.不需要记录用户的操作行为,不需要记录用户上次登录时间和IP地址(这部分以后需要可以单独拿出来存储) 区分用户类型 查询数据需要精确到天 2. 分析 考虑到只是简单的记录用户是否登录,记录数据比较单一,查询需要精确到天.以百万用户量为前提,前期考虑了几个方案 2.1 使用文件 使用单文件

  • Redis精确去重计数方法(咆哮位图)

    前言 如果要统计一篇文章的阅读量,可以直接使用 Redis 的 incr 指令来完成.如果要求阅读量必须按用户去重,那就可以使用 set 来记录阅读了这篇文章的所有用户 id,获取 set 集合的长度就是去重阅读量.但是如果爆款文章阅读量太大,set 会浪费太多存储空间.这时候我们就要使用 Redis 提供的 HyperLogLog 数据结构来代替 set,它只会占用最多 12k 的存储空间就可以完成海量的去重统计.但是它牺牲了准确度,它是模糊计数,误差率约为 0.81%. 那么有没有一种不怎么

  • Redis特殊数据类型bitmap位图

    目录 Redis数据类型bitmap位图 一.setbit 二.getbit 三.bitcount Redis数据类型bitmap位图 bitmap数据结构,是基于二进制位来进行操作记录的,只有0 和 1两个状态.可以想象成一个数组,里面只有0或者1. 能干嘛呢? 现实中会有这些场景,比如统计用户信息,活跃用户和非活跃用户.登录的.未登录的用户,打卡的.未打卡的,像这种只有2个状态,并且数据量非常大的,就适合使用bitmap. 网上找了一个对比,可以帮助记忆下bitmap的优点. 一.setbi

  • Redis位图bitmap操作

    目录 定义 强势点 SETBIT 命令 GETBIT 命令 BITCOUNT 命令 应用场景案例 定义 1.位图不是真正的数据类型,它是定义在字符串类型中2.一个字符串类型的值最多能存储512M字节的内容,位上限:2^32 # 1MB = 1024KB # 1KB = 1024Byte(字节) # 1Byte = 8bit(位) 强势点 可以实时的进行统计,极其节省空间.官方在模拟1亿2千8百万用户的模拟环境下,在一台MacBookPro上,典型的统计如“日用户数”的时间消耗小于50ms, 占用

  • PHP使用redis位图bitMap 实现签到功能

    一.需求 记录用户签到,查询用户签到 二.技术方案 1.使用mysql(max_time字段为连续签到天数) 思路: (1)用户签到,插入一条记录,根据create_time查询昨日是否签到,有签到则max_time在原基础+1,否则,max_time=0 (2)检测签到,根据user_id.create_time查询记录是否存在,不存在则表示未签到 2.使用redis位图功能 思路: (1)每个用户每个月单独一条redis记录,如00101010101010,从左往右代表01-31天(每月有几

  • Redis基于Bitmap实现用户签到功能

    目录 功能分析 更多应用场景 总结 参考资料 很多应用上都有用户签到的功能,尤其是配合积分系统一起使用.现在有以下需求: 签到1天得1积分,连续签到2天得2积分,3天得3积分,3天以上均得3积分等. 如果连续签到中断,则重置计数,每月重置计数. 显示用户某月的签到次数和首次签到时间. 在日历控件上展示用户每月签到,可以切换年月显示. ... 功能分析 对于用户签到数据,如果直接采用数据库存储,当出现高并发访问时,对数据库压力会很大,例如双十一签到活动.这时候应该采用缓存,以减轻数据库的压力,Re

  • Redis中Bitmap的使用示例

    目录 位图应用原理 位图常用命令 1) SETBIT命令 2) GETBIT命令 3) BITCOUNT命令 4)Redis Bitop 命令 场景 统计当日活跃用户 用户签到 在日常开发过程中,经常会有一些 bool 类型数据需要存取.比如记录用户一年内签到的次数,签了是 1,没签是 0.如果使用 key-value 来存储,那么每个用户都要记录 365 次,当用户成百上亿时,需要的存储空间将非常巨大.解决这个问题,可以使用redis中的位图. 位图(bitmap)同样属于 string 数据

  • 基于Redis分布式BitMap的应用分析

    目录 一.序言 二.BitMap结构 1.内存消耗分析 2.命令行操作BitMap 3.客户端操作BitMap 4.时间与空间复杂度 三.BitMap应用 1.回避缓存穿透 2.与布隆过滤器的区别 四.小结 一.序言 在实际开发中常常遇到如下需求:判断当前元素是否存在于已知的集合中,将已知集合中的元素维护一个HashSet,使用时只需耗时O(1)的时间复杂度便可判断出结果,Java内部或者Redis均提供相应的数据结构.使用此种方式除了占用内存空间外,几乎没有其它缺点. 当数据量达到亿级别时,内

  • Redis使用Bitmap的方法实现

    目录 1. Bitmap 是什么 2. 占用存储空间 3. 命令 3.1 SETBIT 3.2 GETBIT 3.3 BITCOUNT 3.4 BITOP 3.5 BITPOS 1. Bitmap 是什么 Bitmap(也称为位数组或者位向量等)是一种实现对位的操作的'数据结构',在数据结构加引号主要因为: Bitmap 本身不是一种数据结构,底层实际上是字符串,可以借助字符串进行位操作. Bitmap 单独提供了一套命令,所以与使用字符串的方法不太相同.可以把 Bitmaps 想象成一个以位为

  • springboot整合redis进行数据操作(推荐)

    redis是一种常见的nosql,日常开发中,我们使用它的频率比较高,因为它的多种数据接口,很多场景中我们都可以用到,并且redis对分布式这块做的非常好. springboot整合redis比较简单,并且使用redistemplate可以让我们更加方便的对数据进行操作. 1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starte

随机推荐