位图指令

位图指令

 ===========setbit 指令===================
setbit  key  offset value 下标从0开始
eg 
  setbit  w 1 1;  在第一位(高位) 设为1  如果返回为0 则则设置成功 返回为1 表示该位原来有值 覆盖成功
getbit key  offset  同时也可以执行 get key 零存整取 所以也有整存零取的操作
eg 
  getbit w 1 
  
 ===========bitcount 指令===================
 bitcount  key  start  end  [start ,end] 
             区间  -1 表示尾部 第一 -2表示尾部第二个 返回所在指定区间内 位为1的数量
 
 set w he 
 
 bitcount w  0 0 --->3 下标从0开始
 bitcount w 0 -1(1)--->7 
 
 =============bitpos 指令===================
     用来查找指定范围内出现的第一个 0 或 1。
   bitpos key bit(0|1) start end
        其中 bit只能为0或者1  start end指的是对应的字节  
        该指令返回的结果是说 在[start,end]区间的字符内   第一个0或者1(bit为)出现的位置的下表(该下标是全部bit的位置)
    
    eg
      he-> 01101000 01100101        
        127.0.0.1:6379> bitpos w 1 0 1  查找he 中第一次出现1的bit位的下标
        (integer) 1
        127.0.0.1:6379> bitpos w 0 0 0
        (integer) 0
        127.0.0.1:6379> bitpos w 1 1 1 查找e中第一次出现1的bit位的下标
        (integer) 9 
 
  ================bitfield 指令 ================
    对指定位置的连续bit位进行读或写处理  
  1.读指令 bitfield  get key u|i[num] offset  
          该指令是从该字节偏移offset的bit位  读取 区间为[offset,num+offset]
                 如果为u[num] 则从偏移出 连续读num个bit位 然后按照无符号数显示结果    
                 如果为i[num] 则从偏移出 连续读num个bit位 然后按照有符号数显示结果    
       eg 
         he-> 01101000 01100101   
         set w he
         bitfield w get u2 0 ==>01  无符号数 ---->1          
         bitfield w get u3 1 ==>110 无符号数 ---->3          
         bitfield w get i3 1 ==>110 有符号数  按位取反  001  末位加1   010 ---->-2    
         
         同时支持一次读取多个
         127.0.0.1:6379> bitfield w get u2 0   get u3 1    get i3 1
        1) (integer) 1
        2) (integer) 6
        3) (integer) -2
        
 2. 写指令 bitfield key set i|u[num] offset value
           该指令将bit位区间 [offset,num+num] 替换为 value对应的 bit值 这里 value 必须为整数 
            如果超过区间的长度 值截取 区间范围内的bit位
           比如 要对0000 设置 128   明显不够长度 这个时候 我们只区128的低4位 0000
            无符号貌似没什么意义 就不管了
      eg
        he-> 01101000 01100101   
        set w he 
        127.0.0.1:6379> bitfield w set u8 8 h  不是数字 非法
        (error) ERR value is not an integer or out of range
        127.0.0.1:6379> bitfield w set u4 8 128  4个bit位 放不下128 只取2低位的4个bit
        1) (integer) 6
        127.0.0.1:6379> bitfield w get u4 8   这里取值就变为0
        1) (integer) 0
        127.0.0.1:6379> get w    这里e 从 01100101 变为  0000 0101 没有对应的asii码 所以转为16进制输出
        "h\x05"
        127.0.0.1:6379> bitfield w set u8 8 97 -->a
        1) (integer) 101
        127.0.0.1:6379> get w
        "ha"         
 3.  自增指令(个人感觉用处不大) bitfield key incrby u|i[num] offset value
          对指定区间内的(有)无符号数字 增加 value 区间为 [offset,num+offset]
        eg 
         he-> 01101000 01100101   
         set w he       
        127.0.0.1:6379> bitfield w incrby u4 12 1
        1) (integer) 6
        127.0.0.1:6379> bitfield w get u4 12
        1) (integer) 6
        127.0.0.1:6379>    
         
 4. 对于incryby 指定区间溢出后的处理
    1. 默认是折返 即溢出 只保留指定区间的bit的值    
    2. overflow 指定溢出策略
         sat  饱和截断 即保留最大值 不在自增
         fail 不执行   
       eg
        he-> 01101000 01100101   
        set w he 
        
        // 饱和截断  
        127.0.0.1:6379> bitfield w overflow sat incrby u3 0 3
        1) (integer) 6
        127.0.0.1:6379>  bitfield w overflow sat incrby u3 0 1
        1) (integer) 7
        127.0.0.1:6379>  bitfield w overflow sat incrby u3 0 1  --这里不改变
        1) (integer) 7        
         
        //默认折返 
        127.0.0.1:6379>  bitfield w incrby u3 0 1
        1) (integer) 6
        127.0.0.1:6379>  bitfield w incrby u3 0 1
        1) (integer) 7
        127.0.0.1:6379>  bitfield w incrby u3 0 1
        1) (integer) 0
        127.0.0.1:6379>  bitfield w incrby u3 0 1
        1) (integer) 1  
        
        //不执行
        127.0.0.1:6379>  bitfield w overflow fail incrby u3 0 1
        1) (integer) 5
        127.0.0.1:6379>  bitfield w overflow fail incrby u3 0 1
        1) (integer) 6
        127.0.0.1:6379>  bitfield w overflow fail incrby u3 0 1
        1) (integer) 7
        127.0.0.1:6379>  bitfield w overflow fail incrby u3 0 1   --这里已经超过做大值 所以这里不执行
        1) (nil)  
        127.0.0.1:6379> bitfield w get u3 0  --- 此时仍然是最大值
        1) (integer) 7
        127.0.0.1:6379>
         
         
         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值