redis 中一个字段 修改map_Redis bitmap 位图 从入门到精通 基础 实战 妙用
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 位图 从入门到精通 基础 实战 妙用相关推荐
- redis 中一个字段 修改map_Redis中bitmap的妙用
在Redis中我们经常用到set,get等命令,细心的你有没有发现,还有几个相似的命令叫setbit,getbit,它们是用来干嘛的? BitMap是什么 就是通过一个bit位来表示某个元素对应的值或 ...
- redis 中一个字段 修改map_Redis 几种数据类型及应用场景
Redis支持5种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合).何时使用Redis呢? 先通过一张图了解下Redis ...
- redis 中一个字段 修改map_CTO 指名点姓让我带头冲锋,熬了一个通宵,终于把Redis中7千万个Key删完了...
由于有一条业务线不理想,高层决定下架业务.对于我们技术团队而言,其对应的所有服务器资源和其他相关资源都要释放. 释放了 8 台应用服务器:1 台 ES 服务器:删除分布式定时任务中心相关的业务任务:备 ...
- mysql复制一个字段值到另一个字段,MySQL怎么把表中一个字段数据复制到另外一个表的某个字段下...
点击查看MySQL怎么把表中一个字段数据复制到另外一个表的某个字段下具体信息 答:update b set tel =(select mobile from a where a.id=b.aid) 注 ...
- Redis中存字段key出现 \xef \xbb \xbf
环境: java向redis中存数据用于重复判断,结果有一条记录居然去不了重复,用Redis DeskTop Manager 查看发现,有一个 key 中居然是这样的: 20190324157:\xE ...
- python一个月能掌握吗_Python 从入门到精通:一个月足够了!
毫无疑问,Python 是当下最火的编程语言之一.对于许多未曾涉足计算机编程的领域「小白」来说,深入地掌握 Python 看似是一件十分困难的事.其实,只要掌握了科学的学习方法并制定了合理的学习计划, ...
- python金融实务从入门到精通_免费下载中-华尔街学堂:python金融实务从入门到精通,数据实战分析视频教程下载 价值599元...
华尔街学堂:python金融实务从入门到精通 [4.5G] ┣━━第0章 课时 1 学员须知 [145.5M] ┃ ┗━━课时 2 课程讲义及学习资料 [145.5M] ┃ ┣━━data [92.3 ...
- oracle表中一个字段内容导出到磁盘上
有没有遇到过这样的问题, 系统设计的时候,会把一些内容比较大的文本内容存入到表中(oracle longe类型最大可以存放2G的文本) 刚开始也许不会有什么问题,但是时间长了,数据量大了,经常频繁的i ...
- java json相加_JAVA,当某个json数据中一个字段与另一个json数据中的字段值相同时,对两个json进行合并且相加,...
展开全部 要判断json数据的字段62616964757a686964616fe78988e69d8331333365636634与其他数据是否相同,那么肯定是要先解析json数据.解析json数据的 ...
最新文章
- golang 可变参 不定参 函数 简介
- 并发编程-24 高并发处理手段之扩容思路 + 缓存思路
- python自动化测试脚本后端_基于 python 的接口自动化测试
- JSON数据格式以及与后台交互数据转换实例
- Oracle11g新特性:在线操作功能增强-Oracle11g新增的不可见索引 (转载)
- druid mysql 配置优化_数据库连接池优化配置(druid,dbcp,c3p0)
- 在新美大“创业”:KTV预定业务演进之路
- poj 2263 Heavy Cargo floyd基础,就是输入的时候处理字符串纠结一点!!!!
- Linux中shell脚本获取当前工作目录
- paip.常用android手机软件----语音篇
- html iframe 设置半透明_HTML基础教程:框架实例大合集
- 在EXCEL中进行趋势拟合与预测的方法
- win7计算机资源管理器卡住,win7系统资源管理器出现卡死现象的解决方法
- 未转变者服务器简单,未转变者服务器搭建教程详细讲解
- 还在熬夜干论文——Python带你一键起飞!【内附演示视频】
- APP下载链接在微信被屏蔽了 无法打开的解决方案
- 数论学习之(一):一元线性同余方程和二元一次不等式
- 多分类问题OVR和OVO----机器学习
- python坐标网matplotlib_使用matplotlib画双纵轴坐标
- 基于python-opencv的HOG特征提取和使用cv2.HOGDescriptor()
热门文章
- 音频降噪处理+java_适当的音频捕获和降噪
- go 用 mysql web开发环境_简单讲解Go程序中使用MySQL的方法
- 基本的JVM内存分配过程案例
- Redis 一些高级用法
- Shell编程—【05】Linux的find命令详解
- 分发器上的会话代理进程控制脚本使用说明
- 《Spring_four》团队作业4—基于原型的团队项目需求调研与分析
- 数据驱动业务——梦想成真,只差一步
- 《Objective-c》-(内存管理之三:@property的内存管理)
- win8.1注册表-修改资源管理器的默认路径regedit