Redis扩展类型-位图
位图
- 什么时候需要用到位图?
- 平时开发中有一些bool型数据需要存储,比如用户一年的签到记录。为了解决存储空间,Redis提供了位图数据结构,这样365天就是365位,46个字节。
- 位图是什么?
- 其实就是普通的字符串,也就是byte数组。
- 怎么使用位图?
- 可以使用普通的get/set直接获取和设置整个位图的内容,也可以使用位图操作getbit/setbit等将byte数组看成”位数组”来处理。
基本用法
Redis的位数组是自动扩展的,如果设置了某个偏移位置超出了现有的内容范围,就会自动将位数组进行零扩充。
零存整取
- h的ASCII码:0b1101000
e的ASCII码:0b1100101script 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16127.0.0.1:6379> setbit s 1 1
(integer) 0
127.0.0.1:6379> setbit s 2 1
(integer) 0
127.0.0.1:6379> setbit s 4 1
(integer) 0
127.0.0.1:6379> setbit s 9 1
(integer) 0
127.0.0.1:6379> setbit s 10 1
(integer) 0
127.0.0.1:6379> setbit s 13 1
(integer) 0
127.0.0.1:6379> setbit s 15 1
(integer) 0
127.0.0.1:6379> get s
"he"
- h的ASCII码:0b1101000
整存零取
- h的ASCII码:0b1101000
script 1
2
3
4
5
6127.0.0.1:6379> set w h
(integer) 0
127.0.0.1:6379> getbit w 1
(integer) 1
127.0.0.1:6379> getbit w 2
(integer) 1
- h的ASCII码:0b1101000
如果对应位的字节是不可打印字符,redis-cli会显示该字符的十六进制形式
Redis提供了位图统计指令bitcount和位图查找指令bitpos
- bitcount: 用来统计指定位置范围内的1的个数。
- 统计用户一共签到多少天
- bitpos: 用来查找指定范围内出现的第一个0或1。
- 查找用户从哪一天开始第一次签到。
- 如果指定范围参数[start,end],就可以统计在某个时间范围内用户签到了多少天,用户自某天以后哪天开始签到
- 但start和end是字节索引,所以指定的位范围必须是8的倍数
- bitcount: 用来统计指定位置范围内的1的个数。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 yanglau0527@gmail.com
文章标题:Redis扩展类型-位图
文章字数:501
本文作者:Cynaith
发布时间:2020-05-02, 02:20:35
最后更新:2020-05-02, 02:22:57
原始链接:https://cynaith.github.io/2020/05/02/Redis%E6%89%A9%E5%B1%95%E7%B1%BB%E5%9E%8B-%E4%BD%8D%E5%9B%BE/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。