前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis 统计实时在线人数

Redis 统计实时在线人数

原创
作者头像
xcsoft
发布2022-06-14 00:08:08
3K0
发布2022-06-14 00:08:08
举报
文章被收录于专栏:星辰日记星辰日记

zset

Redis 中的 sorted set (有序集合) 也称为 zset. 它提供了两个参数, 一个为 score, 一个为 member.

其中, score 为排序的分数, 它可以是双精度或者整数. 其结构类似

代码语言:txt
复制
        | (score) member1
key =>  | (score) member2
        | (score) member3

如何实现

我们可以简单的通过 zadd 方法向一个有序集合内添加成员.

为了方便演示, 在这里使用 Interval 的方式, 定时请求指定接口. 将 score 设置为请求时的 unix时间戳

zset 提供了一个 zcount 方法, 可以让我们快速获取指定 socre 范围内的成员数量.

我们假设用户5秒钟内无操作, 即掉线. 这样便可以通过 zcount 获取实时在线人数

代码语言:go
复制
func main() {
    // 使用 gin 提供 web 服务
    r := gin.Default()

    r.GET("/", func(c *gin.Context) {
        _redis := redisutil.R.Get() // redis pool
        defer redis.Close()

        // 用户标识
        userId := c.ClientIp()
        _, _ = _redis.Do("ZADD", "online_user", time.Now().Unix(), userIdentity)

        // 获取在线人数
        count, _ := redis.Int(_redis.Do("ZCOUNT", "online_user", time.Now().Unix()-5, "+inf"))

        c.JSON(200, gin.H{
            "count": count,
        })
    })

    r.Run()
}

当然, 为了防止 数据一直增加, 对于 5秒前的数据, 应该定时将其移出.

我们可以通过 zremrangebyscore 方法, 来移除 指定范围内的数据.

代码语言:go
复制
func AutoRemover() {
    _redis := redisutil.R.Get() // redis pool
    defer redis.Close()

    c := Cron.New()

    c.AddFunc("@every 5s", func() {
        _, _ = _redis.Do("ZREMRANGEBYSCORE", "online_user", "-inf", time.Now().Unix()-5)
    })
    c.Start()
}

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 来实现类似的功能, 这样会更加准确, 但是可能会带来一定的性能损失.

参考

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • zset
  • 如何实现
  • zset 的其他方法
  • 其他
  • 参考
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档