Redisは、ユーザーの一定期間のログイン数を統計します.

1451 ワード

私はredisのsetbitとbitcountを使ってこの操作を行います.注意すべきはsetbitがbit位置を変更し、bitcountがbyte位置をチェックし、両者は8の倍数の差があることです.疑似コードは次のとおりです.
//           
long daysBetween(Date date1,Date date2)  
{  
        Calendar cal = Calendar.getInstance();  
        cal.setTime(date1);  
        long time1 = cal.getTimeInMillis();               
        cal.setTime(date2);  
        long time2 = cal.getTimeInMillis();       
        long between_days=(time2-time1)/(1000*3600*24);  
          
       return Long.parseLong(String.valueOf(between_days));         
}  
   
//    ,        
long dayIndex(Date date1) throws ParseException
 {
  String d0 = "2010-01-01 00:00:00";  
  Date date0 = simpledate.parse(d0);
  return daysBetween(date0, date1);//      2010 1 1    
 }



 //  redis setbit  ,     ,      8,  true
boolean setUserLoginday(Jedis redis, String user, Date currentDate)
{        
        long day_position = dayIndex(currentDate);    
        
        //  8            bit  
        //  bitcount      byte  
        return redis.setbit(user, day_position * 8, true);  
}




//  redis bitcount    ,     ,            
long countUserLoginDays(Jedis redis, String user, Date fromdate, Date todate) throws ParseException {           
  long from_day_position = DataTransformer.dayIndex(fromdate);
  long to_day_position = DataTransformer.dayIndex(todate);
    return redis.bitcount(key, from_day_position, to_day_position);            
    }