1 用表统计方式 用数据表统计在线人数,这种方式只能用在并发量不大的情况下。 首先我们先新建表:user_login 编辑 user_login 表 模拟用户登录,不存在用户就存入表,存在的则更新登录
1 用表统计方式用数据表统计在线人数,这种方式只能用在并发量不大的情况下。 首先我们先新建表:user_login 编辑 user_login 表 模拟用户登录,不存在用户就存入表,存在的则更新登录信息
这里还需要定期清理无任何操作的用户,假如用户一个小时内无任何操作,我们可以记为无效用户 代码如下:
我们可以实现的功能: 1)当前在线人数 2)某时间段内在线人数 3)最新上线的用户 4)指定用户是否在线
2 使用 redis 有序集合实现在线人数统计因为是内存中,所以效率很高,可以统计某个时间段内的在线人数,可以做各种聚合操作。但是如果在线人数比较多的情况下,会比较占用内存。还有一点: 无法通过用户操作时间清除掉无效用户,只有手动登出的用户才会从集合中删除。 代码如下:
3 使用 hyperloglog 做统计跟有序集合方式不同,hyperloglog 十分节约空间,但是实现的功能也非常单一,只能统计在线人数,不能实现其余的任何功能。 Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。 在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。 但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
这种方案仅仅只能统计出某个时间段在线人数的总量, 对在线用户的名单却无能为力,但是却挺节省内存的,对统计数据要求不多情况下 ,我们便可以考虑这种方案 4 使用 bitmap 统计bitmap 就是通过一个 bit 位来表示某个元素对应的值或者状态,其中的 key 就是对应元素本身。我们知道 8 个 bit 可以组成一个 Byte,所以 bitmap 本身会极大的节省储存空间。 bitmap 常用来做比如用户签到、活跃用户、在线用户等功能。 代码如下
bitmap 消耗的内存空间不多, 统计的信息却挺多的,这种方案是值得推荐一下的。 |
2019-06-28
2019-10-03
2019-07-04
2019-06-22
2019-02-12