• Bit命令


    命令简介:
    1)setbit:设置字符串指定偏移量bit
    2)getbit:获取字符串指定偏移量bit
    3)bitcount:获取字符串位中为1的数量
    4)bitpos:获取指定范围的位图中第一个值为bit的二进制位的位置
    5)bitop:对一个或者多个保存二进制位的字符串key进行位元操作,并且将结果保存到destkey上
    6)bitfield

    命令详解:
    1.setbit
    可用版本: >=2.2.0
    时间复杂度: O(1)
    命令格式: setbit key offset value
    作用:
    对key存储的字符串值,设置或者清除指定偏移量上的位Bit。
    返回值:
    指定偏移量原本存储的位。
    注意:
    位的设置或者清除取决于value参数,可以是0与1。
    当key不存在时,会自动生成。
    字符串会自动进行伸缩以确保它可以将value保存在指定的偏移量上。当字符串进行伸缩时,空白位置以0填充。
    offset参数必须大于等于0,小于2^32。

    2.getbit
    可用版本: >=2.2.0
    时间复杂度: O(1)
    命令格式: getbit key offset
    作用:
    获取key存储字符串值,指定偏移量上的位。
    返回值:
    指定偏移量原本存储的位。
    注意:
    当offset大于字符串长度,或者key不存在时返回0。

    3.bitcount
    可用版本: >=2.6.0
    时间复杂度: O(N)
    命令格式: bitcount key [start] [end]
    作用:
    获取key存储字符串值,一定范围内,位值为1的数量。
    返回值:
    位值为1的数量。
    注意:
    start与end可以是负数。
    不存在的key当作空字符串处理,返回0。

    4.bitpos
    可用版本: >=2.8.7
    时间复杂度: O(N)
    命令格式: bitpos key bit [start] [end]
    作用:
    获取指定范围的位图中第一个值为bit的二进制位的位置。
    返回值:
    整数位置。
    注意:
    默认情况下,检测整个位图。也可以使用start end参数,指定检测的范围。

    5.bitop
    可用版本: >=2.6.0
    时间复杂度: O(N)
    命令格式: bitop operation destkey key [key...]
    作用:
    对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。
    返回值:
    保存到 destkey 的字符串的长度,和输入 key 中最长的字符串长度相等。
    注意:
    operation之内是以下几个选项:
    1)AND-对一个或者多个key求逻辑并,并将结果保存到destkey上。
    2)OR-对一个或者多个key求逻辑或,并将结果保存到destkey上。
    3)XOR-对一个或者多个key求逻辑异或,并将结果保存到destkey上。
    4)NOT-对一个或者多个key求逻辑非,并将结果保存到destkey上,not只支持一个key。
    字符串长度不一时,短的字符串将会使用0自动填充。

    6.bitfield
    可用版本: >=3.2.0
    时间复杂度: O(1)
    命令格式: bitfield key [GET type offset] [set type offset value] [incrby type offset increment] [overflow wrap|sat|fail]
    作用:
    bitfield命令将一个redis字符串看作是一个由二进制位组成的数组,并对这个数组中存储的长度不同的整数进行访问。
    bitfield命令可以在一次调用中同时对多个位范围进行操作,它接受一系列待执行的操作作为参数,并返回一个数组作为回复,数组中每一个元素就是对应操作的执行结果。
    BITFIELD 命令的作用在于它能够将很多小的整数储存到一个长度较大的位图中, 又或者将一个非常庞大的键分割为多个较小的键来进行储存, 从而非常高效地使用内存, 使得 Redis 能够得到更多不同的应用 —— 特别是在实时分析领域: BITFIELD 能够以指定的方式对计算溢出进行控制的能力, 使得它可以被应用于这一领域。
    返回值:
    BITFIELD 命令的返回值是一个数组, 数组中的每个元素对应一个被执行的子命令。 需要注意的是, OVERFLOW 子命令本身并不产生任何回复。
    注意:
    使用 GET 子命令对超出字符串当前范围的二进制位进行访问(包括键不存在的情况), 超出部分的二进制位的值将被当做是 0 。
    使用 SET 子命令或者 INCRBY 子命令对超出字符串当前范围的二进制位进行访问将导致字符串被扩大, 被扩大的部分会使用值为 0 的二进制位进行填充。 在对字符串进行扩展时, 命令会根据字符串目前已有的最远端二进制位, 计算出执行操作所需的最小长度。
    子命令支持:
    GET —— 返回指定的二进制位范围。
    SET —— 对指定的二进制位范围进行设置,并返回它的旧值。
    INCRBY —— 对指定的二进制位范围执行加法操作,并返回它的旧值。用户可以通过向 increment 参数传入负值来实现相应的减法操作。
    OVERFLOW [WRAP|SAT|FAIL]——改变之后执行的 INCRBY 子命令在发生溢出情况时的行为。
    偏移量:
    在二进制位范围命令中, 用户有两种方法来设置偏移量:
    如果用户给定的是一个没有任何前缀的数字, 那么这个数字指示的就是字符串以零为开始(zero-base)的偏移量。
    另一方面, 如果用户给定的是一个带有 # 前缀的偏移量, 那么命令将使用这个偏移量与被设置的数字类型的位长度相乘, 从而计算出真正的偏移量。
    比如说, 对于以下这个命令来说:
    BITFIELD mystring SET i8 #0 100 i8 #1 200

    命令会把 mystring 键里面, 第一个 i8 长度的二进制位的值设置为 100 , 并把第二个 i8 长度的二进制位的值设置为 200 。 当我们把一个字符串键当成数组来使用, 并且数组中储存的都是同等长度的整数时, 使用 # 前缀可以让我们免去手动计算被设置二进制位所在位置的麻烦。
    溢出控制:
    用户可以通过 OVERFLOW 命令以及以下展示的三个参数, 指定 BITFIELD 命令在执行自增或者自减操作时, 碰上向上溢出(overflow)或者向下溢出(underflow)情况时的行为:
    WRAP : 使用回绕(wrap around)方法处理有符号整数和无符号整数的溢出情况。 对于无符号整数来说, 回绕就像使用数值本身与能够被储存的最大无符号整数执行取模计算, 这也是 C 语言的标准行为。 对于有符号整数来说, 上溢将导致数字重新从最小的负数开始计算, 而下溢将导致数字重新从最大的正数开始计算。 比如说, 如果我们对一个值为 127 的 i8 整数执行加一操作, 那么将得到结果 -128 。
    SAT : 使用饱和计算(saturation arithmetic)方法处理溢出, 也即是说, 下溢计算的结果为最小的整数值, 而上溢计算的结果为最大的整数值。 举个例子, 如果我们对一个值为 120 的 i8 整数执行加 10 计算, 那么命令的结果将为 i8 类型所能储存的最大整数值 127 。 与此相反, 如果一个针对 i8 值的计算造成了下溢, 那么这个 i8 值将被设置为 -127 。
    FAIL : 在这一模式下, 命令将拒绝执行那些会导致上溢或者下溢情况出现的计算, 并向用户返回空值表示计算未被执行。
    需要注意的是, OVERFLOW 子命令只会对紧随着它之后被执行的 INCRBY 命令产生效果, 这一效果将一直持续到与它一同被执行的下一个 OVERFLOW 命令为止。 在默认情况下, INCRBY 命令使用 WRAP 方式来处理溢出计算。
    以下是一个使用 OVERFLOW 子命令来控制溢出行为的例子:

    > BITFIELD mykey incrby u2 100 1 OVERFLOW SAT incrby u2 102 1
    1) (integer) 1
    2) (integer) 1
    
    > BITFIELD mykey incrby u2 100 1 OVERFLOW SAT incrby u2 102 1
    1) (integer) 2
    2) (integer) 2
    
    > BITFIELD mykey incrby u2 100 1 OVERFLOW SAT incrby u2 102 1
    1) (integer) 3
    2) (integer) 3
    
    > BITFIELD mykey incrby u2 100 1 OVERFLOW SAT incrby u2 102 1
    1) (integer) 0  -- 使用默认的 WRAP 方式处理溢出
    2) (integer) 3  -- 使用 SAT 方式处理溢出
    

    而以下则是一个因为 OVERFLOW FAIL 行为而导致子命令返回空值的例子:

    > BITFIELD mykey OVERFLOW FAIL incrby u2 102 1
    1) (nil)
    

    性能注意事项:
    BITFIELD 在一般情况下都是一个快速的命令, 需要注意的是, 访问一个长度较短的字符串的远端二进制位将引发一次内存分配操作, 这一操作花费的时间可能会比命令访问已有的字符串花费的时间要长。
    二进制位的排列:
    BITFIELD 把位图第一个字节偏移量 0 上的二进制位看作是 most significant 位, 以此类推。 举个例子, 如果我们对一个已经预先被全部设置为 0 的位图进行设置, 将它在偏移量 7 的值设置为 5 位无符号整数值 23 (二进制位为 10111 ), 那么命令将生产出以下这个位图表示:

    +--------+--------+
    |00000001|01110000|
    +--------+--------+
    

    当偏移量和整数长度与字节边界进行对齐时, BITFIELD 表示二进制位的方式跟大端表示法(big endian)一致, 但是在没有对齐的情况下, 理解这些二进制位是如何进行排列也是非常重要的。

    作者:红雨
    出处:https://www.cnblogs.com/52why
    微信公众号: 红雨python
  • 相关阅读:
    C# 关于爬取网站数据遇到csrf-token的分析与解决
    Nginx实现同一端口HTTP跳转HTTPS
    Console也要美颜了,来给Console添色彩
    程序员如何巧用Excel提高工作效率
    LeetCode每日一练(1-3)
    Json对象转Ts类
    JcApiHelper 简单好用的.Net ApiHelper
    .Net Core Mvc/WebApi 返回结果封装
    C#光盘刻录
    Orm框架开发之NewExpression合并问题
  • 原文地址:https://www.cnblogs.com/52why/p/14331745.html
Copyright © 2020-2023  润新知