火竞猜官网_火竞猜投注
火竞猜官网

小米云服务,运用 Redis 计算在线用户人数,取环后注意事项

admin admin ⋅ 2019-04-11 15:09:25

在构建运用的时分, 咱们常常需求对用户的一举一动进行记载, 而其间一个比较重要的操作, 便是对在线的用户进行记载。

本文将介绍四种运用 Redis 对在线用户进行记载的计划, 这些计划尽管都能够对在线用户的数量进行核算, 但每个计划都有一些自己特有的操作, 而且各个计划的功能特征以及资源消耗也各有不同。

计划 1 :运用有序调集

每逢一个用户上线时, 咱们就履行 ZADD 指令, 将这个用户以及它的在线时刻添加到指定的有序调集中:

ZADD "online_users"  

经过运用 ZSCORE 指令查看指定的用户 ID 在有序调集中是否有相关联的分值, 咱们能够知道该用户是否在线:

ZSCORE "online_users" 

而经过履行 ZCARD 指令, 咱们能够知道总共有多用户在线:

ZCARD "online_users"

运用有序调集贮存在线用户的强壮之处在于, 它是本文介绍的一切计划傍边, 能够履行最多聚合操作的一个计划, 原因在于, 这一计划既能够经过有序调集的成员(也便是用户的 ID)进行聚合操作, 也能够依据有序调集的分值(也便是用户孙才政的登录时刻)进行聚合操作。

首要, 经过 ZINTERSTORE 和 ZUN姜异康最新去向IONSTORE 指令, 咱们能够对多个记载了在线用户的有序调集进行聚合核算:

# 核算出 7 天之内都有上线的用户,并将它贮存到 7_da公狗交配ys_both_online_users 有序调集傍边
ZINTERSTORE 7_days_bot小米云效劳,运用 Redis 核算在线用户人数,取环后注意事项h_online_users 7 "day_1_online_users" "day_2_o小米云效劳,运用 Redis 核算在线用户人数,取环后注意事项nline_users" ... "day_7_online_users"
# 核算出 7 天之内总共有多少人上线了
ZUNIONSTORE 7_days_total_online_users 7 "day_1_黑袜帅哥online_users" ... "day_7_online_users"

此外, 经过 ZCOUNT 指令, 咱们能够核算出在指定的时刻段之内有多少用户在线, 而 ZRANGEBYSCORE 指令则能够d2671让咱们获取到这些用户的名单:

# 核算指定时刻段内上线的用户数量
ZCOUNT "online_users"
# 获取指定时刻段内上线的用户名单
ZRANGEBYSCORE "online_users" WITHSCORES

经过这一办法, 咱们能够知道网站在不一起刻段的上线人数以及上线用户名单, 比如说, 咱们能够用这个办法来别离获悉网站在早晨、上午、正午、下午和夜晚的上线人数。

计划 2 :运用调集

正亿年玉虫如上一节所说, 运用有序调集能够一起贮存在线用户的名单以及各个用户的上线时刻, 但假如咱们只想要记载在线用户的名单, 而不想要贮存用户的上线时刻, 那么也能够运用调集来替代有序调集, 对在线的用户进行记载。

在这种情况下, 每逢一个用户上线时, 咱们就履行以下 SADD 指令, 将它添加到在线用户名单傍边:

SADD "online_users" 

经过运用 SISMEMBER 指令, 咱们能够查看一个指定的用户当时是否在线:

SISMEMBER "online_users" 

而核算在线人数的作业则能够经过履行 SCARD 指令来完结:

SCARD "online_users"

经过调集运算操作, 咱们能够像有序调集计划相同, 对不一起刻段或许日期的在线用户名单进行聚合核算。 比如说, 经过 SINTER 或许 SINTERSTORE 指令, 咱们能够核算出一周都有在线的用户:

SINTER "day人权律师_1_online_users" "day_2_online_users" ... "day_7_online_users"

此外, 经过 SUNION 指令或许 SUNIONSTORE 指令, 咱们能够核算出一周内在线用户的总数量:

SUNION "day_1_online_users" "day_2_online_users" ... "day_7_online_users"郭原池

而经过履行 SDIF唐依雪F 指令或许 SDIFFSTORE 指令, 咱们能够知道哪些用户今天上线了, 可是昨日没有上线:

SDIFF "today_online_users" "yesterday_online_users"

又或许作业日上线了, 可是假期没有上线:

# 核算作业日上线名单
SINTERSTORE "weekday_online_users" "monday_online_users" "tuesday_online_users" ... "friday_online_users"
# 核算假期上线名单
SINTERSTORE "holiday_戴志聪online_users" "saturday_online_users" "sunday_online_users"
# 核算作业日上线可是假期未上线的名单
SDIFF "weekday_online_users" "holiday_online_users"

诸如此类。

计划 3 :运用 HyperLogLog

尽管运用有序调集和调集能够很好地完结记载在线人数的作业, 但以上这两个计划都有一个显着的缺陷, 那便是, 这两个计划消耗的内存会跟着被核算用户数量的增多而增多: 假如你的网站用户数量比较多, 又或许你需求记载多天/多个时段的在线用户名单并进行聚合核算, 那么这两个计划可能会消耗你很多内存。

另一方面, 在有些情况下, 咱们只想要知道在线用户的人数, 而不需求知道详细的在线用户名单, 这时有序调集和调集贮存的信息就会显得剩余了。

在需求尽可能地节省内存而且只需求知道在线用户数量的情况下, 咱们能够运用 HyperLogLog 来对在线用户进行核算: HyperLogLog 是一个概率算法, 它能够对元素的基数进行预算, 而且每个 HyperLogLog 只需求消耗 12 KB 内存, 关于用户数量十分多可是内存却十分严重的体系, 这一计划无疑是最佳之选。

在这一计划下, 咱们运用 PFADD 指令去记载在线的用户:

PFADD "online_users" 

运用 PFCOUNT 指令获取在线人数:

PFCOUNT "online_users"

由于 HyperLogLog 也供给了核算交集的 PFMERGE 指令, 所以咱们也能够用这个指令核算出多个给定时刻段或日期之内, 上线的总人数:

# 核算 7 天之内总共有多少人上线了
PFME小米云效劳,运用 Redis 核算在线用户人数,取环后注意事项RGE "7_days_bo美少女视频th_online_users" "day_1_online_users" "day_2_online_users" ... "d我的绝色老公ay_7_online_users"
PFCOUNT "7_days_both_on小米云效劳,运用 Redis 核算在线用户人数,取环后注意事项line_users"

计划 4 :运用位图(bitmap)

回忆上面介绍的三个计划, 咱们能够得出以上定论:

  • 运用有序调集或许调集能够贮存详细的在线用户名单, 可是却需求消耗很多的内存;
  • 而运用 HyperLogLog 尽管能够有效地削减核算在线用户所需的内存, 可是它却没办法精确地记载详细的在线用户名单。

那么是否存在一种既能够取得在线用户名单, 又能够尽量削减内存消耗的办法存在呢? 这种办法确实存在 —— 运用 Redis 的位图就能够办到。

Redis 的位图便是一个由二进制位组成的数组, 经过将数组中的每个二进制位与用户 ID 进行一一对应, 咱们能够运用位图去记载每个用户是否在线。

当一个用户上线时, 咱们就运用 SETBIT 指令, 将这个用户对应的二进制位设置为 1 :

# 此处的 user_id 有必要为数字,由于它会被用作索引
SETBIT "online_users" 1

经过运用 GETBIT 指令去查看一个二进制位的值是否为 直播之万能宠物王1 , 咱们能够知道指定的用户是否在线:

GETBIT "online_users" 

而经过 BITCOUNT 指令, 咱们能够核算出位图中有多少个二进制位被设置成了 1 , 也便是有多少个用户在线:

BITCOUNT "online_users"

跟调集相同, 用户也能够对多个位图进行聚合核算 —— 经过 BITOP 指令, 用户能够对一个或多个位图履行逻辑并、逻辑或、逻辑异或或许逻辑非操作:

# 核算出 7 天都在线的用户
BITOP "AND" "7_da胭脂泪罗永娟ys_both_online_users" "day_1_online_users" "day_2_online_users" ... "day_7_online_users"
# 核算出 7 在的在线用户杨程茗总人数
BITOP "OR" "7_days_total_online_users" "day_1_online_users" "day_2_online_users" ... "day吕宗瑞_7_online_users"
# 核算出两天傍边只要其间一天在线的用户
BIT朝鲜金正思OP "XOR" "only_one_day_on闭组词line" "day_1_online_users" "day_2_online_users"

HyperLogLog 计划记载一个用户是否在线需求花费 1 个二进制位, 关于用户数为 100 万的网站来说, 运用这一计划只需求消耗 125 KB 内存, 而关于用户数为 1000 万的网站来说, 运用这一计划也只需求花费 1.25 MB 内存。

尽管位图节省内存的作用不及 HyperLogLog 那么明显, 可是运用位图能够精确地判别一个用户是小米云效劳,运用 Redis 核算在线用户人数,取环后注意事项否上线, 而且能够像调集和有序调集相同, 对在线用户名单进行聚合核算。 因而关于想要小米云效劳,运用 Redis 核算在线用户人数,取环后注意事项尽量节省内存, 但又需求精确地知道用户是否在线, 又或许需求对用户的在线名单进行聚合核算的运用来说, 运用位图能够说是最佳之选。

总结

以下表格总结了以上四个计划的特色:

计划特色 有序调集 能够一起贮存在线用户的名单以及用户的上线时刻,能够履行十分多的聚合核算操作,可是消耗的内存也十分多。 调集 能够贮存在线用户的名单,也能够履行聚合核算,消耗的内存比有序调集少,可是跟有序调集相同,这个计划消耗的内存也会跟着用户数量的增多而增多。 HyperLogLog 不管需求核算的用户有多少,只需求消耗 12 KB 内存,但由于概率算法的特性,只能给出在线人数的预算值,而且也无法获取精确的在线用户名单。 位图 在尽可能节省内存的情况下,记载在线用户的名单,而且能够对这些名单执超级天眼今天启用行聚合操作。 由于 Redis 一起支撑多种数据结构, 所以一个问题常常能够在 Redis 里边找多种不同的解法, 而且每种解法都有各自的长处和缺陷, 本文介绍的问题便是一个很好的比如。

关于核算在线用户的办法就介绍到这儿, 期望这些计划会给我们带来协助和启示。

转载地址:http://w小米云效劳,运用 Redis 核算在线用户人数,取环后注意事项ww.cnblogs.com/mr-amazing/p/6245421.html

admin

admin

TA太懒了...暂时没有任何简介

精彩新闻