zoukankan      html  css  js  c++  java
  • Redis位图(Bitmap)及Redis二进制中的问题

    SETBIT key offset value

    对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。位的设置或清除取决于 value 参数,可以是 0 也可以是 1 。当 key 不存在时,自动生成一个新的字符串值。字符串会进行伸展(grown)以确保它可以将 value 保存在指定的偏移量上。当字符串值进行伸展时,空白位置以 0 填充。offset 参数必须大于或等于 0 ,小于 2^32 (bit 映射被限制在 512 MB 之内)。返回值是指定偏移量原来存储的位

    对使用大的 offset 的 SETBIT 操作来说,内存分配可能造成 Redis 服务器被阻塞。具体参考 SETRANGE 命令,warning(警告)部分。

    127.0.0.1:6379> setbit bit 3 1
    (integer) 0
    127.0.0.1:6379> getbit bit 0
    (integer) 0
    127.0.0.1:6379> getbit bit 1
    (integer) 0
    127.0.0.1:6379> getbit bit 2
    (integer) 0
    127.0.0.1:6379> getbit bit 3
    (integer) 1
    127.0.0.1:6379> setbit bit 3 0
    (integer) 1

    GETBIT key offset

    返回key对应的string在offset处的bit值,当offset超出了字符串长度的时候,这个字符串就被假定为由0比特填充的连续空间。当key不存在的时候,它就认为是一个空字符串,所以offset总是超出范围,然后value也被认为是由0比特填充的连续空间。到内存分配。

    127.0.0.1:6379> getbit yhq 5
    (integer) 0
    127.0.0.1:6379> getbit bit 10
    (integer) 0
    127.0.0.1:6379> getbit bit 3
    (integer) 1

    BITCOUNT key [start] [end]

    计算给定字符串中,被设置为 1 的比特位的数量。一般情况下,给定的整个字符串都会被进行计数,通过指定额外的 start 或 end 参数,可以让计数只在特定的位上进行*start和end的单元是字节而不是bit*start 和 end 参数的设置和 GETRANGE 命令类似,都可以使用负数值:比如 -1 表示最后一个位,而 -2 表示倒数第二个位,以此类推。不存在的 key 被当成是空字符串来处理,因此对一个不存在的 key 进行 BITCOUNT 操作,结果为 0 。

    127.0.0.1:6379> set mykey foobar
    OK
    127.0.0.1:6379> bitcount youkey
    (integer) 0
    127.0.0.1:6379> bitcount mykey
    (integer) 26
    127.0.0.1:6379> bitcount mykey 0 0   # "f" 0110 0110
    (integer) 4
    127.0.0.1:6379> bitcount mykey 1 1   # "o" 0110 1111
    (integer) 6

    BITOP operation destkey key [key ...]

    对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。

    operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种:

    • BITOP AND destkey key [key ...] ,对一个或多个 key 求逻辑与,并将结果保存到 destkey 。
    • BITOP OR destkey key [key ...] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey 。
    • BITOP XOR destkey key [key ...] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey 。
    • BITOP NOT destkey key ,对给定 key 求逻辑非,并将结果保存到 destkey 。

    除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入。

    处理不同长度的字符串,当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0 。空的 key 也被看作是包含 0 的字符串序列

    127.0.0.1:6379> setbit bit1 0 1
    (integer) 0
    127.0.0.1:6379> setbit bit1 3 1
    (integer) 0
    127.0.0.1:6379> setbit bit2 0 1
    (integer) 0
    127.0.0.1:6379> setbit bit2 1 1
    (integer) 0
    127.0.0.1:6379> setbit bit2 3 1
    (integer) 0
    127.0.0.1:6379> bitop and andbit bit1 bit2
    (integer) 1
    127.0.0.1:6379> getbit andbit 0
    (integer) 1
    127.0.0.1:6379> getbit andbit 1
    (integer) 0
    127.0.0.1:6379> getbit andbit 2
    (integer) 0
    127.0.0.1:6379> getbit andbit 3
    (integer) 1

    BITPOS key bit [start] [end]

    返回字符串里面第一个被设置为1或者0的bit位。如果我们在空字符串或者0字节的字符串里面查找bit为1的内容,那么结果将返回-1。

    如果我们在字符串里面查找bit为0而且字符串只包含1的值时,将返回字符串最右边的第一个空位。如果有一个字符串是三个字节的值为0xff的字符串,那么命令BITPOS key 0将会返回24,因为0-23位都是1。基本上,我们可以把字符串看成右边有无数个0。然而,如果你用指定start和end范围进行查找指定值时,如果该范围内没有对应值,结果将返回-1。

    127.0.0.1:6379> getbit num 0
    (integer) 0
    127.0.0.1:6379> getbit num 1
    (integer) 0
    127.0.0.1:6379> getbit num 2
    (integer) 1
    127.0.0.1:6379> getbit num 3
    (integer) 1
    127.0.0.1:6379> getbit num 4
    (integer) 0
    127.0.0.1:6379> getbit num 5
    (integer) 0
    127.0.0.1:6379> getbit num 6
    (integer) 1
    127.0.0.1:6379> getbit num 7
    (integer) 0
    127.0.0.1:6379> getbit num 8
    (integer) 0
    127.0.0.1:6379> bitpos num 1
    (integer) 2
    127.0.0.1:6379> bitpos yhqqhh 1
    (integer) -1
    127.0.0.1:6379> bitpos yhqqhh 0
    (integer) 0

    Redis二进制中的问题1 : 数字全部是char类型表示

    127.0.0.1:6379> set num 2
    OK
    127.0.0.1:6379> bitcount num
    (integer) 3

    Redis中,数字类型其实是以ASCII形式展现的,即 2=>50,正常2的(一个字节8个二进制位)表示为 00000010,bitcount为1。而Redis数字是字符的"2",所以 "2"[50] 的表示为 00110010,bitcount为3。

    Redis中二进制从左到右(正常从右到左)

    "2"的二进制为 00110010 

    127.0.0.1:6379> getbit num 0
    (integer) 0
    127.0.0.1:6379> getbit num 1
    (integer) 0
    127.0.0.1:6379> getbit num 2
    (integer) 1
    127.0.0.1:6379> getbit num 3
    (integer) 1
    127.0.0.1:6379> getbit num 4
    (integer) 0
    127.0.0.1:6379> getbit num 5
    (integer) 0
    127.0.0.1:6379> getbit num 6
    (integer) 1
    127.0.0.1:6379> getbit num 7
    (integer) 0
  • 相关阅读:
    uva 1391(2-SAT)
    uva 1146(2-SAT+二分判断)
    uva 12167(强连通分支)
    uva 11324(强连通分支+DAG)
    Codeforces Round #227 (Div. 2) 解题报告
    uva 10319(2-SAT)
    uva 610(割边)
    uva 11504(强连通分支)
    测试:网页测试,入门面试题
    测试:安装包的测试
  • 原文地址:https://www.cnblogs.com/yhq-qhh/p/10077823.html
Copyright © 2011-2022 走看看