flask redis 实时统计在线人数

import datetime

from flask import Blueprint, jsonify, request
import redis
from flask import jsonify, current_app


class Redis(object):
    """
    redis数据库操作
    """

    @staticmethod
    def _get_r():
        # 获得连接
        host = "127.0.0.1"
        port = "6379"
        db = "0"
        password = "123456"
        r = redis.StrictRedis(host, port, db, decode_responses=True, password=password)
        return r

    @classmethod
    def exists(cls, key):
        r = cls._get_r()
        """
        存在返回1,
        不存在返回0
        """
        return r.exists(key)

    @classmethod
    def write(cls, key, value, expire=None):
        """
        写入键值对
        """
        # 判断是否有过期时间,没有就设置默认值
        if expire:
            expire_in_seconds = expire
        else:
            expire_in_seconds = eval(current_app.config['REDIS_EXPIRE'])
        r = cls._get_r()
        try:
            r.set(key, value, ex=expire_in_seconds)
            return True
        except redis.ConnectionError:
            return False

    @classmethod
    def read(cls, key):
        """
        读取键值对内容
        """
        r = cls._get_r()
        value = r.get(key)
        return value

    @classmethod
    def rewrite(cls, key,offset, value):
        """
         Setrange 命令用指定的字符串覆盖给定 key 所储存的字符串值,覆盖的位置从偏移量 offset 开始。
         0 重写String
        """
        r = cls._get_r()
        return r.setrange(key, offset, value)

    @classmethod
    def hset(cls, name, key, value):
        """
        写入hash表
        """
        r = cls._get_r()
        r.hset(name, key, value)

    @classmethod
    def hmset(cls, key, *value):
        """
        读取指定hash表的所有给定字段的值
        """
        r = cls._get_r()
        value = r.hmset(key, *value)
        return value

    @classmethod
    def hget(cls, name, key):
        """
        读取指定hash表的键值
        """
        r = cls._get_r()
        value = r.hget(name, key)
        return value.decode('utf-8') if value else value

    @classmethod
    def hgetall(cls, name):
        """
        获取指定hash表所有的值
        """
        r = cls._get_r()
        return r.hgetall(name)

    @classmethod
    def delete(cls, *names):
        """
        删除一个或者多个
        """
        r = cls._get_r()
        r.delete(*names)

    @classmethod
    def hdel(cls, name, key):
        """
        删除指定hash表的键值
        """
        r = cls._get_r()
        r.hdel(name, key)

    @classmethod
    def expire(cls, name, expire=None):
        """
        设置过期时间
        """
        if expire:
            expire_in_seconds = expire
        else:
            expire_in_seconds = current_app.config['REDIS_EXPIRE']
        r = cls._get_r()
        r.expire(name, expire_in_seconds)

    @classmethod
    def sadd(cls, name, key):
        """
        set list
        """
        r = cls._get_r()
        r.sadd(name, key)
        
    @classmethod
    def getKeys(cls, key):
        r = cls._get_r()
        return r.keys(key)
# 请求拦截器,对未登录的链接进行拦截,防止非法访问
@app.before_request
def before_user():
    # 获取在线ip统计在线人数
    try:
        real_ip = request.headers['X-Forwarded-For']
        if len(real_ip.split(',')) > 1:
            real_ip = real_ip.split(",")[1]
    except KeyError:
        real_ip = ''
    current_app.logger.info('real_ip=' + real_ip)

    cur_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    # 当key网段不存在,写入到redis
    Redis.write("ONLINE_USER:" + real_ip[0:10], cur_time, 60 * 2)
    online_user_cnt = len(Redis.getKeys("ONLINE_USER*"))
    current_app.logger.info('online user=' + str(online_user_cnt))

1.统计redis中key的数量
2.Nginx 反向代理 + Flask + gunicorn 架构解决获取用户真实ip问题


版权声明:本文为qq_27694835原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。