位图法统计活跃用户

  

Setbit的实际应用

  

场景:1亿个用户,每个用户登陆/做任意操作,记为今天活跃,否则记为不活跃

  

每周评出:有奖活跃用户:连续7天活动
每月评,等等…

  

思路:   

Userid dt活跃
1 2013-07-27 1
1 2013 - 0726

  

如果是放在表中,1:表急剧增大,2:要用集团和运算,计算较慢

  

用:位图法点阵
Log0721:“011001 ............... 0”

  

……
log0726:“011001 ...............0 '
Log0727:“0110000 ............. 1 '

  

1:记录用户登陆:
每天按日期生成一个位图,用户登陆后,把user_id位上的位值置为1

  

2:把1周的位图和计算,
位上为1的,即是连续登陆的用户

  

复述127.0.0.1:6379>setbit mon 100000000 0(一亿用户星期一的初始状态,都是0)
(整数)0
复述127.0.0.1:6379>setbit mon 3 1(3号用户周一登录一次,计为1)
(整数)0
复述127.0.0.1:6379>setbit mon 5 1(5号用户周一登录一次,计为1)
(整数)0
复述127.0.0.1:6379>setbit mon 7 1(7号用户周一登录一次,计为1)
(整数)0
复述127.0.0.1:6379>setbit星期四100000000 0
(整数)0
复述,127.0.0.1:6379>setbit星期四3 1
(整数)0
复述,127.0.0.1:6379>setbit星期四5 1
(整数)0
复述,127.0.0.1:6379>setbit星期四8 1
(整数)0
复述,127.0.0.1:6379>setbit温家宝100000000 0
(整数)0
复述,127.0.0.1:6379>setbit温家宝3 1
(整数)0
复述,127.0.0.1:6379>setbit温家宝4 1
(整数)0
复述,127.0.0.1:6379>setbit温家宝6 1
(整数)0
复述,127.0.0.1:6379>bitop和res mon 2月温家宝
(整数)12500001

  

拔煌挤ㄍ臣苹钤居没?

  

如上例,优点:
1:节约空间,1个亿人每天的登陆情况,用1个亿,约1200 wbyte,约10米的字符就能表示
2:计算方便

位图法统计活跃用户