• 从今天开始看《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时使用位图能够大大节省空间开销。

  • 相关阅读:
    js键盘事件以及键盘事件拦截
    JavaScript 延迟加载
    二叉树深度优先 求二叉树最大深度
    css 小知识点:inline/inline-block/line-height
    es6 set
    CSS 水平垂直居中
    js 位运算符
    js 函数重载
    js之单例模式
    js 面向对象 ES5 AND ES6
  • 原文地址:https://www.cnblogs.com/slientbrain/p/13024159.html
Copyright © 2020-2023  润新知