zoukankan      html  css  js  c++  java
  • 位图

    节衣缩食一一位图

    Redis 提供了位图数据结构,位图的最小单位是比特(bit ),每个 bit 的取值只能是0 或 1,可以使用普通的 get/ set 直接获取和设置整个位图的内容,也可以使用位图操作 getbit/setbit 等将 byte 数组看成“位数组”来处理。

    setbit key offset value get key getbit key offset

    基本用法

    位数组的顺序和字符的位顺序是相反的

    零存整取:“零存”就是使用 setbit 对位值进行逐个设置, “整存”就是使用字符串 一次性填充所有位数组,覆盖掉旧值。

    零存零取: 使用单个位操作设置位值, 使用单个位操作获取具体位值。

    整存零取:使用字符串操作批量设置位值,使用单个位操作获取具体位值。(如果对应位的字节是不可打印字符, redis cli 会显示该字符的十六进制形式。)

    统计和查找

    位图统计指令 bitcount 和位图查找指令 bitpos。bitcount 用来统计指定位置范围内 1 的个数, bitpos 用来查找指定范围内出现的第一个 0 或 1.

    bitcount key [start end] bitpos key bit start end

    魔术指令 bitfield

    bitfield可以一次进行多个位的操作。bitfield 有三个子指令,分别是 get set incrby, 它们都可以对指定位片段进行读写,但是最多只能处理 64 个连续的位,如果超过 64 位,就得使用多个子指令, bitfield 可以一次执行多个子指令。

    bitfield key get type offset bitfield key get type offset get type offset 。。。

    bitfield key incrby type bit count

    有符号数是指获取的位数组中第一个位是符号位,剩下的才是值。如果第 一位是 1,那就是负数。无符号数表示非负数,没有符号位,获取的位数组全部都是值。有符号数最多可以获取 64 位,无符号数只能获取 63 位。如果超出位数限制, Redis 会告诉你参数错误。

    incrby ,它用来对指定范围的位进行自增操作,可能会出现溢出操作,Redis 默认的处理是折返。

    饱和截断( sat)

    超过了范围就停留在最大或最小值。 overflow 指令只影响接下来的第一条指令,这条指令执行完后溢出策略会变成默认值折返( wrap )。

    bitfield key overflow sat incrby type bit count

    失败不执行( fail)

    bitfield key overflow fail incrby type bit count

    四两拨千斤——HyperLogLog

    HyperLogLog 提供不精确的去重计数方案,标准误差是 0.81%。

    使用方法

    提供了两个指令 pfadd(增加计数) 和pfcount(获取计数),与set集合里面的sadd和scard的用法是一样的。

    pfmerge 适合的场合

    用于将多个 pf 计数值累加在一起形成一个新的 pf 值。

  • 相关阅读:
    BZOJ 1036:树的统计Count(树链剖分)
    HDU 5950:Recursive sequence(矩阵快速幂)
    POJ 2763:Housewife Wind(树链剖分)
    HDU 2222:Keywords Search(AC自动机模板)
    HDU 3966:Aragorn's Story(树链剖分)
    矩阵乘法
    HDU 4635:Strongly connected(强连通)
    HDU 3078:Network(LCA之tarjan)
    HDU 2767:Proving Equivalences(强连通)
    HDU 1827:Summer Holiday(强连通)
  • 原文地址:https://www.cnblogs.com/zzy8080/p/14017991.html
Copyright © 2011-2022 走看看