从今天开始看《Redis深度历险》--位图

Posted 血音乐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从今天开始看《Redis深度历险》--位图相关的知识,希望对你有一定的参考价值。

网页版redis并不支持bitfield这个指令

位图这一概念让我想起来一个算法问题,在N亿个数字中判断某个数是否存在,感兴趣的可以去看一下。

看过上面的问题之后我相信对书中的零存整取、整存零取概念就会理解了,书中的例子是将hello字符串转换为ASCII码进行零存整取整存零取

 

相关指令

  setbit key value 按位存

  getbit key 按位取

  set key value 整存

  get key 整取

统计和查找

  bitcount key [start end] 查找key内指定范围中的1的个数,值得注意的是start和end由于内存的物理结构限制,只能使8的整数倍。

  bitpos key 0/1 [start end] 在key的指定范围内查找第一个0/1的位置

  文中作者举例是用于统计用户在某个时间段内的签到次数。

  bitfield 这个指令的也是非常复杂,但是避免了在需要对位图多次get/set操作时必须使用管道的问题,建议查看官方文档(所以我上次蹩脚英语翻译是为了啥呢)简而言之,该指令可以在一行中执行多次get、set、incrby以及在对incrby溢出时的操作。其中的几个我觉得值得注意的点包括:

    type:u8、i16分别指的是8位无符号整型(unsigned int简写u),16位有符号整型(int间写i)

    get:使用get指令对超出字符串长度(或者key不存在)的位进行寻址时,会自动为缺失的位赋值为0;用SETINCRBY指令对超出当前字符串长度的位(含key不存在的情况)进行寻址,将会扩展字符串并对扩展部分进行补0,扩展方式包括:按需扩展、按最小长度扩展和按最大寻址能力扩展。

    offset:偏移量前加上 # ,表示偏移量需要乘以type的位数

 

该种应用的关键点就在于对位图的理解和bitfield这个指令的使用。


最后才关注到这一章的名字叫做节衣缩食,不得不说,很贴切,在存储只有两种状况的key时使用位图能够大大节省空间开销。

以上是关于从今天开始看《Redis深度历险》--位图的主要内容,如果未能解决你的问题,请参考以下文章

从今天开始看《Redis深度历险》-- SCAN

从今天开始看《Redis深度历险》-- SCAN

Redis深度历险:核心原理和技术实现(基础及应用篇)

Redis深度历险:核心原理和技术实现(基础及应用篇)

Redis深度历险

分布式Redis深度历险-复制