Redis教程04(String类型之BIT)

简介: 在上篇文章中介绍了String类型中常用的命令,但没有涉及到bit相关的命令,本文主要介绍下bit相关的操作命令。开发中有时这些命令的使用会更优效率。
+关注继续查看

在上篇文章中介绍了String类型中常用的命令,但没有涉及到bit相关的命令,本文主要介绍下bit相关的操作命令。开发中有时这些命令的使用会更优效率。

Redis中字符串的存储方式都是以二进制的方式存储的。

比如:

127.0.0.1:6379> set k1 a
OK

k1的值为a,对应的ascii码是97,转换为二进制就是01100001。BIT命令就是对这个二进制数据进行操作的。

命令说明
getbit获取二级制中对应偏移量的值
setbit设置对应二进制位的值
bitcount统计二进制中位中为1的个数
bitop对二进制数据做位元操作,与,或,非,异或操作
bitpos返回字符串里面第一个被设置为1或者0的bit位


GetBit命令

用于对 key 所储存的字符串值,获取指定偏移量上的位(bit)

127.0.0.1:6379> set k1 a
OK
127.0.0.1:6379> getbit k1 0
(integer) 0
127.0.0.1:6379> getbit k1 1
(integer) 1
127.0.0.1:6379> getbit k1 2
(integer) 1
127.0.0.1:6379> getbit k1 3
(integer) 0
127.0.0.1:6379> getbit k1 4
(integer) 0
127.0.0.1:6379> getbit k1 5
(integer) 0
127.0.0.1:6379> getbit k1 6
(integer) 0
127.0.0.1:6379> getbit k1 7
(integer) 1

当偏移量 OFFSET 比字符串值的长度大,或者 key 不存在时,返回 0 。

SetBit命令

用于对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit),返回的结果是该位上原来的bit值。比如我们设置 k1为a,k2为c,a对应的ASCII码为97(01100001),c对应的ASCII码为99(01100011),相差了一个1,如此我们就可以通过setbit来调整

127.0.0.1:6379> set k2 c
OK
127.0.0.1:6379> get k1
"a"
127.0.0.1:6379> get k2
"c"
127.0.0.1:6379> setbit k1 6 1
(integer) 0
127.0.0.1:6379> get k1
"c"

如此我们就将k1的值快速调整为了c。

BitCount命令

用来统计二进制中为1的个数,比如a(97 01100001)为3,c(99 01100011)为4.

127.0.0.1:6379> get k1
"a"
127.0.0.1:6379> get k2
"c"
127.0.0.1:6379> bitcount k1
(integer) 3
127.0.0.1:6379> bitcount k2
(integer) 4

实际使用官网给出了例子,统计在线人数。


假设现在我们希望记录自己网站上的用户的上线频率,比如说,计算用户 A 上线了多少天,用户 B 上线了多少天,诸如此类,以此作为数据,从而决定让哪些用户参加 beta 测试等活动 —— 这个模式可以使用 SETBIT 和 BITCOUNT 来实现。

比如说,每当用户在某一天上线的时候,我们就使用 SETBIT ,以用户名作为 key ,将那天所代表的网站的上线日作为 offset 参数,并将这个 offset 上的为设置为 1 。

举个例子,如果今天是网站上线的第 100 天,而用户 peter 在今天阅览过网站,那么执行命令 SETBIT peter 100 1 ;如果明天 peter 也继续阅览网站,那么执行命令 SETBIT peter 101 1 ,以此类推。

当要计算 peter 总共以来的上线次数时,就使用 BITCOUNT 命令:执行 BITCOUNT peter ,得出的结果就是 peter 上线的总天数。



性能

前面的上线次数统计例子,即使运行 10 年,占用的空间也只是每个用户 10*365 比特位(bit),也即是每个用户 456 字节。对于这种大小的数据来说, BITCOUNT 的处理速度就像 GET 和 INCR 这种 O(1) 复杂度的操作一样快。

BitOp命令

对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。BITOP 命令支持 AND(与) 、 OR(或) 、 NOT(非) 、 XOR(异或)运算。比如a 01100001和c 01100011进行相关运算

127.0.0.1:6379> get k1
"a"
127.0.0.1:6379> get k2
"c"
127.0.0.1:6379> bitop and k3 k1 k2
(integer) 1
127.0.0.1:6379> get k3
"a"
127.0.0.1:6379> bitop or k4 k1 k2
(integer) 1
127.0.0.1:6379> get k4
"c"
127.0.0.1:6379> bitop xor k5 k1 k2
(integer) 1
127.0.0.1:6379> get k5
"\x02"

not运算注意参数个数

127.0.0.1:6379> bitop not k6 k1
(integer) 1
127.0.0.1:6379> get k6
"\x9e"

BitPos命令

返回字符串里面第一个被设置为1或者0的bit位。

返回一个位置,把字符串当做一个从左到右的字节数组,第一个符合条件的在位置0,其次在位置8,等等。还是以a为例01100001

127.0.0.1:6379> bitpos k1 1
(integer) 1
127.0.0.1:6379> bitpos k1 0
(integer) 0

~好了本文到此为止

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
5天前
|
NoSQL Linux Redis
百度搜索:蓝易云【Centos8 stream系统编译安装Redis教程。】
以上是在CentOS 8 Stream系统上编译安装Redis的基本教程。请注意,具体的配置和参数可能因您的需求而有所不同,您可以根据自己的情况进行调整。同时,请确保在执行任何操作之前备份重要的文件和配置。
33 1
|
7天前
|
NoSQL Ubuntu Redis
百度搜索:蓝易云【Ubuntu 20.04系统编译安装Redis教程。】
请注意,以上是一个基本的编译安装Redis的示例,您可能需要根据您的特定需求进行进一步配置和调整。
105 0
|
10天前
|
NoSQL Redis 数据安全/隐私保护
百度搜索:蓝易云【Debian11系统编译安装Redis教程。】
以上是在Debian 11系统上编译安装Redis的基本步骤。请根据实际情况进行相应的调整和配置。
14 0
|
15天前
|
存储 NoSQL Linux
百度搜索:蓝易云【Linux系统安装redis教程。】
请注意,以上步骤提供了基本的Redis安装指南。 具体的安装过程可能因您使用的Linux发行版和Redis版本而有所不同。 如果需要更详细的指导或特定于您的环境的配置,请参考Redis官方文档或相关的社区资源。
35 0
|
20天前
|
NoSQL Java Redis
springboot高级教程基于 redis 通过注解实现限流
springboot高级教程基于 redis 通过注解实现限流
27 0
|
1月前
|
存储 监控 NoSQL
Redis超详细入门手册教程!还不快来看看?4
Redis超详细入门手册教程!还不快来看看?
54 0
|
1月前
|
存储 NoSQL Redis
Redis超详细入门手册教程!还不快来看看?3
Redis超详细入门手册教程!还不快来看看?
31 1
|
1月前
|
存储 JSON NoSQL
Redis超详细入门手册教程!还不快来看看?2
Redis超详细入门手册教程!还不快来看看?
34 0
|
1月前
|
存储 SQL JSON
Redis超详细入门手册教程!还不快来看看?1
Redis超详细入门手册教程!还不快来看看?
70 0
|
1月前
|
存储 缓存 NoSQL
Redis完全教程:全面学习指南(六)
Redis完全教程:全面学习指南(六)
29 0
推荐文章
更多