使用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")})
从小白到大神的蜕变~~