Loading

使用redis数据库+python实现获取在线用户人数

使用redis数据库+python实现获取在线用户人数


这里使用的是redis集合:

Redis集是字符串的无序集合。可以在O(1)中添加,删除和检查成员的存在(恒定时间,而与Set中包含的元素数量无关)。

一个集合的最大长度为232 (4294967295,每列表可以存储超过40亿个元素)

应用范围:

  • 您可以使用Redis集来跟踪独特的事物。想知道访问指定博客帖子的所有唯一IP地址吗?每次处理页面视图时,只需使用SADD。这样避免插入重复的IP。
  • Redis集很好地表示关系。您可以使用Set代表每个标签,使用Redis创建标签系统。然后,可以使用SADD命令将具有给定标签的所有对象的所有ID添加到代表该特定标签的Set中。您是否希望所有对象的所有ID同时具有三个不同的标签?只需使用SINTER即可。
  • 您可以使用Set使用SPOP或SRANDMEMBER命令随机提取元素。

redis集合底层实现

  • 底层封装的是 哈希(Hash) ,也就是我们常说的字典,它利用的是字典的特性。
  • 集合在业界也被成为是没有值(vaue)的字典,只有key。无论是哈希(Hash)还是字典。

大家在做网站排行榜等有序的数据时,可以使用redis数据库中的 有序集合(Sorted Sets)

与Redis集类似,Redis排序集是非重复的String集合。区别在于,排序集的每个成员都与得分相关联,该得分用于从最小到最大得分中获取排序的排序集。虽然成员是唯一的,但分数可能会重复。

一个有序集合的最大长度为232 (4294967295,每列表可以存储超过40亿个元素)

应用范围:

  • 在大型在线游戏中担任排行榜,每次提交新分数时,您就可以使用ZADD对其进行更新。您可以轻松地使用ZRANGE吸引顶级用户,也可以给定用户名,使用ZRANK返回其在列表中的排名。一起使用ZRANK和ZRANGE可以向用户显示得分与给定用户相似的得分。速度很快。
  • 排序集通常用于索引Redis中存储的数据。例如,如果您有许多代表用户的哈希,则可以使用已排序的集合,其元素具有用户的年龄作为得分,而用户的ID作为值。因此,使用ZRANGEBYSCORE检索具有给定年龄段的所有用户将非常简单快捷。

代码实现:

# 连接redis
r = redis.Redis(host='127.0.0.1', port=6379, db=5, decode_responses=True)
# 获取当前在线用户人数
class GetOnLines(APIView):
    def get(self, request):
    		#获取用户ip地址
        if "HTTP_X_FORWARDED_FOR" in request.META:
            ip = request.META.get("HTTP_X_FOGWARDED_FOR")
        else:
            ip = request.META.get("REMOTE_ADDR")
        if r.scard("set_ip"):
          #添加用户ip
            r.sadd("set_ip", ip)
        else:
            r.sadd("set_ip", ip)
            r.expire("set_ip", 30)	#因为没有办法判断人是否走了,使用相对性 设置一个时间,清除一下这个ip 再添加
        return Response({"online": r.scard("set_ip")})

posted @ 2020-12-21 20:45  就学45分钟  阅读(322)  评论(0编辑  收藏  举报