IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    使用redis的setbit和bitcount来进行区间统计的坑

    linuxphp@qq.com(keminar)发表于 2015-04-30 17:59:00
    love 0
    贵贵的博客 ( http://blog.linuxphp.org/ ) :

    以前听过一个bitmap做统计的分享,最近又看了文章“使用Redis bitmaps进行快速、简单、实时统计” 和

    http://www.infoq.com/cn/articles/the-secret-of-bitmap/ 后对实现流程已经清楚了
    正好项目中有需要统计一个用户最近7天,30天,90天的发帖量,想来用这种方法是效率最高占用资源最少的。

    我在实际操作中确发现奇怪的问题,取全部BITCOUNT正常,取一个区间的会不正常
    redis> BITCOUNT bits
    (integer) 0
    redis> SETBIT bits 1 1
    (integer) 0
    redis> SETBIT bits 2 1
    (integer) 0
    redis> BITCOUNT bits
    (integer) 2
    redis> BITCOUNT bits 2 -1
    (integer) 0
    为什么我设置了bitcount的start后会取不到值?最后在http://www.cnphp6.com/archives/83725 找到了答案
    “redis的setbit修改的是bit位置,而bitcount检查的是byte位置,两者相差有8的倍数”,再看文档确实是有这个说明,不过太不明显了
    所以在setbit 前把offset * 8 才可以。代码如下:

     connect('127.0.0.1', 6379, 10);
    
            // 乘以8的原因是这个操作修改的是bit位置
            $start = 1;
            $offset = $start * 8;
            $redis->setBit('bit', $offset, 1);
            $count = $redis->bitCount('bit', $start, -1);
            var_dump($count);


沪ICP备19023445号-2号
友情链接