- 2023-04-05 09:59:18
- 6469 热度
- 0 评论
上篇文章我们对 STRING 数据类型中一些基本的命令进行了介绍,但是没有涉及到 BIT 相关的命令,本文我们就来看看几个和 BIT 相关的命令。
本文是 Redis 系列的第四篇文章,了解前面的文章有助于更好的理解本文:
1.Linux 上安装 Redis
2.Redis 中的五种数据类型简介
3.Redis 字符串 (STRING) 介绍
BIT 相关的命令是指 BITCOUNT/BITFIELD/BITOP/BITPOS/SETBIT/GETBIT 几个命令,灵活使用这几个命令,可以给我们的项目带来很多惊喜。
准备知识
在学习这几个命令之前,我们得先了解下 redis 中字符串的存储方式,redis 中的字符串都是以二进制的方式进行存储的,比如说我执行如下命令:
1 |
127.0.0.1:6379> SET k1 a |
a 对应的 ASCII 码是 97 ,转换为二进制数据是 01100001 ,我们 BIT 相关命令都是对这个二进制数据进行操作。请继续往下看。
GETBIT
GETBIT 命令可以返回 key 对应的 value 在 offset 处的 bit 值,以上文提到的 k1 为例, a 对应的二进制数据是 01100001 ,所以当 offset 为 0 时,对应的 bit 值为 0 ; offset 为 1 时,对应的 bit 值为 1 ; offset 为 2 时,对应的 bit 值为 1 ;offset 为 3 时,对应的 bit 值为 0,依此类推….,如下:
1 |
127.0.0.1:6379> GETBIT k1 0 |
SETBIT
SETBIT 可以用来修改二进制数据,比如 a 对应的 ASCII 码为 97,c 对应的 ASCII 码为 99,97 转为二进制是 01100001 ,99 转为二进制是 01100011 ,两个的差异在于第六位一个是 0 一个是 1 ,通过 SETBIT 命令,我们可以将 k1 的第六位的 0 改为 1 (第六位是从 0 开始算),如下:
1 |
127.0.0.1:6379> SETBIT k1 6 1 |
此时,k1 中存储的字符也就变为了 c。SETBIT 在执行时所返回的数字,表示该位上原本的 bit 值。
BITCOUNT
BITCOUNT 可以用来统计这个二进制数据中 1 的个数,如下:
1 |
127.0.0.1:6379> BITCOUNT k1 |
关于 BITCOUNT,redis 官网上有一个非常有意思的案例:用户上线次数统计。节选部分原文如下:
举个例子,如果今天是网站上线的第 100 天,而用户 peter 在今天阅览过网站,那么执行命令 SETBIT peter 100 1 ;如果明天 peter 也继续阅览网站,那么执行命令 SETBIT peter 101 1 ,以此类推。当要计算 peter 总共以来的上线次数时,就使用 BITCOUNT 命令:执行 BITCOUNT peter ,得出的结果就是 peter 上线的总天数。
这种统计方式最大的好处就是节省空间并且运算速度快。每天占用一个 bit,一年也就 365 个 bit,10 年也就 10*365 个 bit ,也就是 456 个字节,对于这么大的数据,bit 的操作速度非常快。
BITOP
BITOP 可以对一个或者多个二进制位串执行并 (AND)、或 (OR)、异或 (XOR) 以及非 (NOT) 运算,如下:a 对应的 ASCII 码转为二进制是 01100001 ,c 对应的二进制位串是 01100011 。对这两个二进制位串分别执行 AND\OR\XOR 的结果如下:
1 |
127.0.0.1:6379> set k1 a |
另外,BITOP 也可以执行 NOT 运算,但是注意参数个数,如下:
1 |
127.0.0.1:6379> BITOP not k3 k4 |
这里会对 k4 的二进制位串取反,将取反结果交给 k3 。
BITPOS
BITPOS 用来获取二进制位串中第一个 1 或者 0 的位置,如下:
1 |
127.0.0.1:6379> set k1 a |
也可以在后面设置一个范围,不过后面的范围是字节的范围,而不是二进制位串的范围。
OK,STRING 中 BIT 相关的命令我们就介绍这么多,更多命令小伙伴们可以参考官方文档。小伙伴在看官方文档时,有什么问题欢迎留言讨论。
- Spring(403)
- Boot(208)
- Spring Boot(187)
- Java(82)
- Cloud(82)
- Spring Cloud(82)
- Security(60)
- Spring Security(54)
- Boot2(51)
- Spring Boot2(51)
- Redis(31)
- SQL(29)
- Mysql(25)
- IDE(24)
- Dalston(24)
- mongoDB(22)
- MVC(22)
- JDBC(22)
- IDEA(22)
- Web(21)
- CLI(20)
- Alibaba(19)
- SpringMVC(19)
- SpringBoot(17)
- Docker(17)
- Vue(16)
- Git(16)
- Eclipse(16)
- JPA(15)
- Apache(15)
- ORA(15)
- jdk(14)
- Tomcat(14)
- Linux(14)
- HTTP(14)
- Mybatis(14)
- Oracle(14)
- XML(13)
- JdbcTemplate(13)
- OAuth(13)
- Nacos(13)
- Pro(13)
- JSON(12)
- OAuth2(12)
- Data(12)
- int(11)
- Myeclipse(11)
- stream(11)
- not(10)
- Bug(10)
- maven(9)
- Map(9)
- Hystrix(9)
- ast(9)
- session(8)
- Window(8)
- Swagger(8)
- APP(8)
- Bit(8)
- API(8)
- Cache(7)
- File(7)
- mail(7)
- IntelliJ(7)
- windows(7)
- too(7)
- HTML(7)
- Github(7)
- JavaMail(7)
- apt(6)
- read(6)
- Freemarker(6)
- WebFlux(6)
- JSP(6)
- Bean(6)
- error(6)
- nginx(6)
- Server(6)
- jar(6)
- ueditor(6)
- ehcache(6)
- UDP(6)
- RabbitMQ(6)
- and(6)
- star(6)
- Excel(6)
- Log4J(6)
- pushlet(6)
- string(5)
- Syntaxhighlighter(5)
- script(5)
- Tool(5)
- Controller(5)
- swagger2(5)
- ldquo(5)
- input(5)
- Servlet(5)
- Config(5)
- Emlog(5)
- discuz(5)