位图
节衣缩食一一位图
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 值。