从零开始Redis(十)

121 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情

🍊作者简介:少年不想说话,努力长大

🍊往期回顾:从零开始Redis(九)

🍊近期目标:写完基础源码,点赞👍🏼、收藏⭐、留言📩

redis的基础部分几个结构已经说完了,今天我们开始说说它的不常用场景的几个结构;

数据结构BitMap

bitmap是啥,说它是数据结构也不对,因为它实际上是String类型的,它是String类型的位操作,通过位图形式的0或1来表示对应元素的状态,所以一个字符串有多大,bitMap所能对应的位数就有多大,也正因为用位数来表示,所以非常节省内存,所以所能表达的名义上的数据量也足够大,因此不少我们可以看到网上对bitmap的应用场景说了,统计用户登录状态、签到打卡啥的;我们下面来看看bitmap的一些常用命令,加深下了解,先看命令

SETBIT key offset value,表示设置对应偏移量位置的位数值,其中的offset表示偏移量即位置,value就是0、1啦;

GETBIT key offset,这个表示获取对应偏移量位置的位数值;

127.0.0.1:6379> SETBIT mybit 2 1
(integer) 0
127.0.0.1:6379> GETBIT mybit 2
(integer) 1

这里我们还可以看下存储对应值表示的位数,前面我们说了bitmap其实就是String,所以这里我们给String赋值,然后我们用getbit来取对应的位数看看,看用例

127.0.0.1:6379> set myStr "2" #这个代表0000 0010
OK
127.0.0.1:6379> getbit myStr 0
(integer) 0
127.0.0.1:6379> GETBIT myStr 1
(integer) 0
127.0.0.1:6379> GETBIT myStr 2
(integer) 1
127.0.0.1:6379> GETBIT myStr 3
(integer) 1
127.0.0.1:6379> GETBIT myStr 4
(integer) 0
127.0.0.1:6379> GETBIT myStr 5
(integer) 0
127.0.0.1:6379> GETBIT myStr 6
(integer) 1127.0.0.1:6379> GETBIT myStr 7
(integer) 0

看到这可能会问了,我又不知道有多少个1,我也不知道应该遍历到哪里呀,咋办,请看

BITCOUNT key [start end], 统计比特值为1的数量,默认情况会统计整个字符串,指定 start和end 是限定范围的,当key不存在时返回0;对照上例看用例

127.0.0.1:6379> BITCOUNT myStr 
(integer) 3
127.0.0.1:6379> BITCOUNT myStr 0 -1
(integer) 3

还有bitop的命令,用来操作不同key组成的与、或操作按照网上的用例就是每天都有一个key用来统计不同用户的登录情况,用bitop就可以统计出每日之间登录的各种情况了;我这里就不举例了,简单说下命令BITOP operation destkey key [key ...],operation表示操作用and或or表示;destkey表示返回的目的key,key表示我们要统计的每日的key;

说到这了,那用bitmap有啥注意点呢?如网上一些文章说的那样,对于要存储的value值如果大部分都是0的,那大数据量的情况下倒不如直接set,没必要使用bitmap,毕竟bitmap位数过多依然占据内存很大;如果偏移量过大的话会造成redis产生一定的拥塞,redis初始化过程会比较缓慢;好啦🥗🥗🥗;

结束结束,那就🛴🛴🛴

如果对你有所帮助

点个赞呗