关于用 Redis 做在线人数统计

2016-08-12 17:08:58 +08:00
 Livid

在线统计是很多 SNS 的常见功能。最近在优化 V2EX 的过程中,实现了一种新的方式,性能不错,分享给大家。

  1. 使用一个单独的 Redis 数据库
  2. 每个在线用户是一条带有 TTL 的记录,在每次 Session 开始时写入这条记录到 Redis
  3. 需要统计当前有多少人在线的话,只需要在这个数据库上用 dbsize() 就可以获得,不会遇到 keys() 可能带来的性能问题
23186 次点击
所在节点    Redis
33 条回复
songjiaxin2008
2016-08-12 17:11:55 +08:00
等于说并不是非常精确的统计(因为 TTL )吗?可能 WebSocket 可以规避这个问题。
nigelvon
2016-08-12 17:14:05 +08:00
思路不错~学习了~
holyghost
2016-08-12 17:17:55 +08:00
思路不错
qiayue
2016-08-12 17:22:19 +08:00
@songjiaxin2008 在线人数一般都是统计当前这一刻往前一段时间(如 15 分钟或者 30 分钟)的人数
southwolf
2016-08-12 17:23:05 +08:00
@songjiaxin2008 论坛并不需要特别精确的在线统计,大多数时候都不需要。 websocket 还是太昂贵了
wy315700
2016-08-12 17:35:28 +08:00
dbsize
(error) ERR protocol is not supported


一部分云服务并不支持这条命令
kn007
2016-08-12 17:40:49 +08:00
单纯只做在线统计会不会比较浪费?
其他功能呢?
latyas
2016-08-12 17:57:00 +08:00
这是用户每次刷新页面都会更新 ttl 的节奏?
http2
2016-08-12 18:04:35 +08:00
哈哈,我也用的这个方法。
KiseXu
2016-08-12 18:09:15 +08:00
每一次刷新页面,更新 TTL ,这个数据库不但可以统计在线总人数。还可以判断一条记录是否存在来判断用户的在线状态。
dangyuluo
2016-08-12 18:11:11 +08:00
也算是一个新思路。
scott1743
2016-08-12 18:37:59 +08:00
dbsize 亮了,单独用 redis 的一个数据库来存 session 会不会更方便?
changshu
2016-08-12 18:39:17 +08:00
redis 清理 ttl 过期元素不是即时的, dbsize 会偏大一点, 印象里 keys 虽然性能糟糕, 但会清理过期元素.

感觉 sorted sets 的方案更折中一点.
est
2016-08-12 18:43:54 +08:00
用 sorted set 的 zrange 性能更好。还可以看谁最后上线啥的。
Livid
2016-08-12 19:53:40 +08:00
@est 没有用 sorted set 的原因是需要定期清理,如果不希望里面有太久远的数据的话。
ooonme
2016-08-12 20:34:00 +08:00
我们是用 web 日志算的,有几分钟延迟还 ok
workwonder
2016-08-12 21:16:44 +08:00
elasticsearch 吗?
Jaylee
2016-08-12 21:56:54 +08:00
正确的做法应该是用 setbit
julyclyde
2016-08-12 22:00:14 +08:00
@changshu
@est
zrange 有性能问题,不但这个 set 会慢,还会拖累整个 redis 实例
yyfrankyy
2016-08-12 22:29:28 +08:00
只是为了数字的话为何不用 setbit

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/298920

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX