以前听过一个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);