Redis源码分析(十九)——二进制位操作bitops

对给定的键的键值(字符串或整数)进行位操作:如SETBIT/ GETBIT:设置或  获取键值指定位的值(0或1); BITOP :对给的多个定键值按位进行AND  OR XOR 以及NOT运算 等操作。

在存储数据时,对于那些只有两个取值的数据(比如性别)按二进制位来存储比存放对应的整数或者字符等能节约很多空间。


具体命令实现:

BITCOUNT

 计算长度为 count 的二进制数组指针 s 被设置为 1 的位的数量。

size_t redisPopcount(void *s, long count)

  其中一种计算方法可见:http://blog.csdn.net/yuyixinye/article/details/40657773


SETBIT /  GETBIT命令的基本思想:

***把偏移量bitoffset(给定键值的目标位)转化为第byte个字节的第bit个位 的组合,

***然后在字符串(为整数编码的先转化为字符串编码)中取出(或设置)第bitoffset个字符的第bit位即可

***注意: 要取的位是在字符串中从左到右的顺序计算的,而在取某个字节的bit位时是按右到左的顺序计算的,因此        需要转换


按位AND  OR XOR 以及NOT 等命令:

优化处理措施在键的数量比较少时,把键值字符串划分为整数个32位 + 最后的残余(小于32位)位数组成。对前面的整数倍的32位的,每次循环处理4个字节(32位),由于对每个键值字符串,这4个字节是连着存放的,因此可以一次载入到缓存中,然后按位进行处理; 而对于后面的小于32位的则每次循环只处理一个字节


<span style="font-size:18px;">/* SETBIT key offset bitvalue */
//与GET命令实现思路一致: 找到要设
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值