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

以前听过一个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 才可以。代码如下:
 

 <?php
        $redis = new Redis();
        $redis->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);

上一篇: No partition metadata for topic test due to kafka.common.LeaderNotAvailableException}   下一篇: MySQL online schema change

提交疑问

回顶部