Redis 统计实时在线人数
zset
Redis 中的 sorted set
(有序集合) 也称为 zset
. 它提供了两个参数, 一个为 score
, 一个为 member
.
其中, score
为排序的分数, 它可以是双精度或者整数. 其结构类似
1 | | (score) member1 |
如何实现
我们可以简单的通过 zadd
方法向一个有序集合内添加成员.
为了方便演示, 在这里使用 Interval 的方式, 定时请求指定接口. 将 score
设置为请求时的 unix时间戳
zset 提供了一个 zcount
方法, 可以让我们快速获取指定 socre 范围内的成员数量.
我们假设用户5秒钟内无操作, 即掉线. 这样便可以通过 zcount
获取实时在线人数
1 | func main() { |
当然, 为了防止 数据一直增加, 对于 5秒前的数据, 应该定时将其移出.
我们可以通过 zremrangebyscore
方法, 来移除 指定范围内的数据.
1 | func AutoRemover() { |
zset 的其他方法
除了上述提到的方法, zset 还提供了很多其他的方法, 如:
- zcard key 直接获取 指定 key 内的成员数量
- zscore key member 获取指定成员的分数
- zincrby key incr member 增加指定成员的分数
- zrange key start end [WITHSCORES] 获取指定范围内的成员 并按照分数从小到大排序
- zrevrange key start end [WITHSCORES] 与上一个相反
- etc.
其他
可以在 Github 找到 示例.
这里同时实现了, 所有用户及自己的 在线时间显示.
当然, 也可以通过 WebSocket 来实现类似的功能, 这样会更加准确, 但是可能会带来一定的性能损失.