https://github.com/jifei/BeautifulPHP/blob/master/Algorithm/OnlineUser.php
* 每分钟百万用户,实时统计最近15分钟在线用户总数
* 使用redis的set数据结构,把用户ID或者唯一表示的其他属性存放在当前分钟的集合中
* 计算指定时间段内的用户数,计算这些分钟集合的并集即可,性能在2s内
*
* 优化:集合设置过期时间,集合的key可以增加日期date('dhi'),查看在线用户数增加开始结束时间判断限制
class OnlineUser
{
public $prefix_key = "online";//key前缀
public function __construct()
{
$this->redis = new Redis();
}
/**
* 往集合中添加新的在线用户
*
* @param $uid
*/
public function addUser($uid)
{
$this->redis->sAdd($this->prefix_key . date('hi'), $uid);
}
/**
* 获取在线用户数
*
* @param $start_min 统计开始分钟 hi格式
* @param $end_min 统计结束的分钟
*
* @return mixed
*/
public function userNum($start_min, $end_min)
{
//第一个参数,并集的key名称
$params[] = $this->prefix_key . $start_min . '_' . $end_min;
//遍历时间区间内所有的分钟,并放入到参数中
for ($min = $start_min; $min < $end_min; $min++) {
$params[] = $this->prefix_key . $min;
}
//求所有分钟的用户的并集并保存,性能比直接计算返回快很多,省去了数据传输
$num = call_user_func_array([$this->redis, "sUnionStore"], $params);
//删除临时并集
$this->redis->delete($params[0]);
return $num;
}
}
http://laoxu.blog.51cto.com/4120547/1318461
http://blog.csdn.net/billfeller/article/details/40960613
* 每分钟百万用户,实时统计最近15分钟在线用户总数
* 使用redis的set数据结构,把用户ID或者唯一表示的其他属性存放在当前分钟的集合中
* 计算指定时间段内的用户数,计算这些分钟集合的并集即可,性能在2s内
*
* 优化:集合设置过期时间,集合的key可以增加日期date('dhi'),查看在线用户数增加开始结束时间判断限制
class OnlineUser
{
public $prefix_key = "online";//key前缀
public function __construct()
{
$this->redis = new Redis();
}
/**
* 往集合中添加新的在线用户
*
* @param $uid
*/
public function addUser($uid)
{
$this->redis->sAdd($this->prefix_key . date('hi'), $uid);
}
/**
* 获取在线用户数
*
* @param $start_min 统计开始分钟 hi格式
* @param $end_min 统计结束的分钟
*
* @return mixed
*/
public function userNum($start_min, $end_min)
{
//第一个参数,并集的key名称
$params[] = $this->prefix_key . $start_min . '_' . $end_min;
//遍历时间区间内所有的分钟,并放入到参数中
for ($min = $start_min; $min < $end_min; $min++) {
$params[] = $this->prefix_key . $min;
}
//求所有分钟的用户的并集并保存,性能比直接计算返回快很多,省去了数据传输
$num = call_user_func_array([$this->redis, "sUnionStore"], $params);
//删除临时并集
$this->redis->delete($params[0]);
return $num;
}
}
http://laoxu.blog.51cto.com/4120547/1318461
1
2
3
4
5
6
7
8
9
| #!/usr/bin/python import redis r=redis.StrictRedis(host= '192.168.39.138' ,port= 6379 ) r. set ( 'online' , '0' ) r.incr( 'online' ) r.incr( 'online' ) r.incr( 'online' ) r.decr( 'online' ) print r. get ( 'online' ) |
// 纪录用户在线的中间件 // 这里使用user-agent作为用户标识符 // 这里使用sorted sets,以便查询最近N毫秒内在线的用户; app.use(function(req, res, next) { var ua = req.headers['user-agent']; db.zadd('online', Date.now(), ua, next); }); // 通过 zrevrangebyscore 来查询上一分钟在线用户。 // 我们将能得到从当前时间算起在 60,000 毫秒内活跃的用户。 app.use(function(req, res, next) { var min = 60 * 1000; var ago = Date.now() - min; db.zrevrangebyscore('online', '+inf', ago, function (err, users) { if (err) { return next (err); } req.online = users; next (); }); }); // 从不同浏览器进入就可以看到同时在线用户数不断增加 app.get('/', function(req, res){ res.send(req.online.length + ' users online'); });