1.bitmap介绍

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

位上限:2^(9(512)+10(1024)+10(1024)+3(8b=1B))=2^32b

2.setbit设置某一位上的值

语法:SETBIT key offset value (offset位偏移量,从0开始)

geekmooc:6379> flushall

OK

geekmooc:6379> setbit k1 1 1

0

geekmooc:6379> get k1

@

geekmooc:6379> setbit k1 7 1

0

geekmooc:6379> get k1

A

geekmooc:6379> setbit k1 7 2

ERR bit is not an integer or out of range

geekmooc:6379> setbit k1 9 1

0

geekmooc:6379> get k1

A@

3.getbit 获取某一位上的值

语法:GETBIT key offset

geekmooc:6379> getbit k1 7

1

geekmooc:6379> getbit k1 8

0

geekmooc:6379> getbit k1 1

1

4.bitpos返回指定值0或者1在指定区间上首次出现的下标

语法:BITPOS key bit [start] [end](字节索引,0表示第一个字节)summary: Find first bit set or clear in a string

since: 2.8.7

group: string

不指定查找范围,表示从全部内容中查找:BITPOS key bit

geekmooc:6379> keys *

k1

geekmooc:6379> bitpos k1 1

1

geekmooc:6379> setbit k1 1 0

1

geekmooc:6379> bitpos k1 1

7

geekmooc:6379> setbit k1 7 0

1

geekmooc:6379> bitpos k1 1

9

指定查找范围:BITPOS key bit start :从start+1个字节开始查找,直到尾部

BITPOS key bit start end:从start+1字节开始到end+1字节之间查找

然后将数据还原:

geekmooc:6379> setbit k1 1 1

0

geekmooc:6379> setbit k1 7 1

0

查找演示:

geekmooc:6379> bitpos k1 1 0 0

1 #在第一个字节中查找1首次出现的下标

geekmooc:6379> bitpos k1 1 0

1 #从第一个字节到值得最后一个字节查找1首次出现的下标

geekmooc:6379> setbit k1 1 0

1 #将指定下标的值改为0

geekmooc:6379> bitpos k1 1 0 0

7 #

geekmooc:6379> bitpos k1 1 0

7

geekmooc:6379> setbit k1 7 0

1

geekmooc:6379> bitpos k1 1 0 0

-1 #在第一个字节中没有找到1,则返回-1

geekmooc:6379> bitpos k1 1 0

9 #从第一个字节到值得最后一个字节查找

geekmooc:6379> bitpos k1 1 0 1

9 #在第1和第2个字节总找1首次出现的位置

geekmooc:6379> bitpos k1 1 0 2

9 #在第1到第3个字节查找1首次出现的位置,但数据总共2(小于end对应的3)个字节,不会抛错。

5.bitop位操作

语法:BITOP operation destkey key [key ...]summary: Perform bitwise operations between strings

since: 2.6.0

group: string

对一个或多个保存二进制位的字符串 key 进行位操作,并将结果保存到 destkey 上。operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种

BITOP AND destkey key [key ...] ,对一个或多个 key 求逻与,并将结果保存到 destkey

BITOP OR destkey key [key ...] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey

BITOP XOR destkey key [key ...] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey

BITOP NOT destkey key ,对给定 key 求逻辑非,并将结果保存到 destkey

除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入,当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0,空的 key 也被看作是包含 0 的字符串序列

BITOP AND destkey key [key ...]演示:

geekmooc:6379> flushall

OK

geekmooc:6379> keys *

(empty list or set)

geekmooc:6379> setbit k1 1 1

(integer) 0

geekmooc:6379> setbit k2 7 1

(integer) 0

geekmooc:6379> bitop and k3 k1 k2

(integer) 1

geekmooc:6379> get k3

"\x00"全1为1,不全1为0

BITOP OR destkey key [key ...]演示

geekmooc:6379> bitop or k4 k1 k2

(integer) 1

geekmooc:6379> get k4

"A"

全0为0,不全0为1

BITOP XOR destkey key [key ...]

geekmooc:6379> bitop xor k5 k1 k2

(integer) 1

geekmooc:6379> get k5

"A"不同为1,相同为0

geekmooc:6379> bitop not k6 k1

(integer) 1

geekmooc:6379> get k6

"\xbf"按位取反

6.bitcount

统计指定位区间上值为1的个数BITCOUNT key [start] [end] start end 字节的索引 正方向

从左向右从0开始,注意官方start、end是位,测试后是字节

geekmooc:6379> get k1

"@"

geekmooc:6379> bitcount k1

(integer) 1

geekmooc:6379> setbit k1 7 1

(integer) 0

geekmooc:6379> bitcount k1

(integer) 2

geekmooc:6379> setbit k1 9 1

(integer) 0

geekmooc:6379> bitcount k1

(integer) 3 #统计全部的1的总数

geekmooc:6379> bitcount k1 0 0

(integer) 2 #统计第一个字节中1出现的总数

geekmooc:6379> bitcount k1 0 1

(integer) 3 #统计第0+1到第1+1字节中1出现的总数BITCOUNT key [start] [end] start end 字节的索引 负方向

从右向左从-1开始,注意官方start、end是位,测试后是字节

geekmooc:6379>BITCOUNT k1 0 -1 #等同于BITCOUNT k1

(integer) 3

最常用的就是 BITCOUNT k1

7.Redis的二进制位

geekmooc:6379> set k7 ab

OK

geekmooc:6379> get k7

"ab"

geekmooc:6379> bitcount k7

(integer) 6

geekmooc:6379> bitcount k7 0 0

(integer) 3

geekmooc:6379> bitcount k7 1 1

(integer) 3

geekmooc:6379> set k8 中

OK

geekmooc:6379> bitcount k8

(integer) 13

geekmooc:6379> get k8

"\xe4\xb8\xad"如果是GBK环境下,如下图

8.Bitmap应用场景

网站用户签到的天数统计

用户ID为key,天作为offset,上线置为1 366> 000000000000000

366 /8=46Byte ID为18的用户,今年的第1天签到、第30天签到

geekmooc:6379[2]> setbit u18 1 1

(integer) 0

geekmooc:6379[2]> setbit u18 30 1

(integer) 0

geekmooc:6379[2]> bitcount u18 #统计id为18的用户签到总次数

(integer) 2

geekmooc:6379[2]> keys u*

1) "u18"

按天统计网站活跃用户

天作为key,用户ID为offset,上线置为1

求一段时间内活跃用户数 5000 0000 / 8*366= 6.3MB=*366 (五千万活跃用户1年才产生2GB左右的数据)

geekmooc:6379>SETBIT 20190601 5 1 #0000 0100

geekmooc:6379>SETBIT 20190602 7 1 #0000 0001

geekmooc:6379>SETBIT 20190603 7 1 #0000 0001

求6月1日到6月10日的活跃用户数

geekmooc:6379>BITOP OR users 20190601 20190602 20190603 ... 20190610

geekmooc:6379>BITCOUNT users #目标key为users

结果为2

用户在线状态、在线人数统计

geekmooc:6379> SETBIT online 5 1 #0000 0100 上线为1

(integer) 0

geekmooc:6379> SETBIT online 7 1 #0000 0101

(integer) 0

geekmooc:6379> bitcount online #当前在线人数

(integer) 2

geekmooc:6379> SETBIT online 7 0

(integer) 1

geekmooc:6379> bitcount online #当前在线人数

(integer) 1Redis bitmap 位图 从入门到精通 基础 实战 妙用​www.geekmooc.cn

redis 中一个字段 修改map_Redis bitmap 位图 从入门到精通 基础 实战 妙用相关推荐

  1. redis 中一个字段 修改map_Redis中bitmap的妙用

    在Redis中我们经常用到set,get等命令,细心的你有没有发现,还有几个相似的命令叫setbit,getbit,它们是用来干嘛的? BitMap是什么 就是通过一个bit位来表示某个元素对应的值或 ...

  2. redis 中一个字段 修改map_Redis 几种数据类型及应用场景

    Redis支持5种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合).何时使用Redis呢? 先通过一张图了解下Redis ...

  3. redis 中一个字段 修改map_CTO 指名点姓让我带头冲锋,熬了一个通宵,终于把Redis中7千万个Key删完了...

    由于有一条业务线不理想,高层决定下架业务.对于我们技术团队而言,其对应的所有服务器资源和其他相关资源都要释放. 释放了 8 台应用服务器:1 台 ES 服务器:删除分布式定时任务中心相关的业务任务:备 ...

  4. mysql复制一个字段值到另一个字段,MySQL怎么把表中一个字段数据复制到另外一个表的某个字段下...

    点击查看MySQL怎么把表中一个字段数据复制到另外一个表的某个字段下具体信息 答:update b set tel =(select mobile from a where a.id=b.aid) 注 ...

  5. Redis中存字段key出现 \xef \xbb \xbf

    环境: java向redis中存数据用于重复判断,结果有一条记录居然去不了重复,用Redis DeskTop Manager 查看发现,有一个 key 中居然是这样的: 20190324157:\xE ...

  6. python一个月能掌握吗_Python 从入门到精通:一个月足够了!

    毫无疑问,Python 是当下最火的编程语言之一.对于许多未曾涉足计算机编程的领域「小白」来说,深入地掌握 Python 看似是一件十分困难的事.其实,只要掌握了科学的学习方法并制定了合理的学习计划, ...

  7. python金融实务从入门到精通_免费下载中-华尔街学堂:python金融实务从入门到精通,数据实战分析视频教程下载 价值599元...

    华尔街学堂:python金融实务从入门到精通 [4.5G] ┣━━第0章 课时 1 学员须知 [145.5M] ┃ ┗━━课时 2 课程讲义及学习资料 [145.5M] ┃ ┣━━data [92.3 ...

  8. oracle表中一个字段内容导出到磁盘上

    有没有遇到过这样的问题, 系统设计的时候,会把一些内容比较大的文本内容存入到表中(oracle longe类型最大可以存放2G的文本) 刚开始也许不会有什么问题,但是时间长了,数据量大了,经常频繁的i ...

  9. java json相加_JAVA,当某个json数据中一个字段与另一个json数据中的字段值相同时,对两个json进行合并且相加,...

    展开全部 要判断json数据的字段62616964757a686964616fe78988e69d8331333365636634与其他数据是否相同,那么肯定是要先解析json数据.解析json数据的 ...

最新文章

  1. golang 可变参 不定参 函数 简介
  2. 并发编程-24 高并发处理手段之扩容思路 + 缓存思路
  3. python自动化测试脚本后端_基于 python 的接口自动化测试
  4. JSON数据格式以及与后台交互数据转换实例
  5. Oracle11g新特性:在线操作功能增强-Oracle11g新增的不可见索引 (转载)
  6. druid mysql 配置优化_数据库连接池优化配置(druid,dbcp,c3p0)
  7. 在新美大“创业”:KTV预定业务演进之路
  8. poj 2263 Heavy Cargo floyd基础,就是输入的时候处理字符串纠结一点!!!!
  9. Linux中shell脚本获取当前工作目录
  10. paip.常用android手机软件----语音篇
  11. html iframe 设置半透明_HTML基础教程:框架实例大合集
  12. 在EXCEL中进行趋势拟合与预测的方法
  13. win7计算机资源管理器卡住,win7系统资源管理器出现卡死现象的解决方法
  14. 未转变者服务器简单,未转变者服务器搭建教程详细讲解
  15. 还在熬夜干论文——Python带你一键起飞!【内附演示视频】
  16. APP下载链接在微信被屏蔽了 无法打开的解决方案
  17. 数论学习之(一):一元线性同余方程和二元一次不等式
  18. 多分类问题OVR和OVO----机器学习
  19. python坐标网matplotlib_使用matplotlib画双纵轴坐标
  20. 基于python-opencv的HOG特征提取和使用cv2.HOGDescriptor()

热门文章

  1. 音频降噪处理+java_适当的音频捕获和降噪
  2. go 用 mysql web开发环境_简单讲解Go程序中使用MySQL的方法
  3. 基本的JVM内存分配过程案例
  4. Redis 一些高级用法
  5. Shell编程—【05】Linux的find命令详解
  6. 分发器上的会话代理进程控制脚本使用说明
  7. 《Spring_four》团队作业4—基于原型的团队项目需求调研与分析
  8. 数据驱动业务——梦想成真,只差一步
  9. 《Objective-c》-(内存管理之三:@property的内存管理)
  10. win8.1注册表-修改资源管理器的默认路径regedit