PV统计的代码要求对接口进行限流 用redis作用缓存 分别统计页面的人数和访问次数

当然可以!下面是一个示例的代码,使用Redis作为缓存来统计PV(页面访问量)和UV(独立访客数),并对接口进行限流:

```python
import time
import redis
from flask import Flask, request

app = Flask(__name__)
redis_client = redis.Redis(host='localhost', port=6379)

# 限流装饰器
def rate_limit(key_prefix, limit, expire):
    def decorator(f):
        def wrapper(*args, **kwargs):
            key = f"{key_prefix}:{request.remote_addr}"
            count = redis_client.get(key)
            if count is None:
                count = 1
                redis_client.setex(key, expire, count)
            else:
                count = int(count)
                if count >= limit:
                    return "访问过于频繁,请稍后再试!"
                count += 1
                redis_client.setex(key, expire, count)
            return f(*args, **kwargs)
        return wrapper
    return decorator

@app.route('/')
@rate_limit(key_prefix='pv', limit=100, expire=60)  # 限流配置:每分钟最多允许100次访问
def index():
    # 统计PV
    redis_client.incr('pv')
    
    # 统计UV
    user_ip = request.remote_addr
    today = time.strftime('%Y-%m-%d', time.localtime())
    uv_key = f"uv:{today}"
    redis_client.sadd(uv_key, user_ip)
    
    return "Hello World!"

@app.route('/stats')
def stats():
    # 获取PV
    pv = redis_client.get('pv') or 0
    
    # 获取UV
    today = time.strftime('%Y-%m-%d', time.localtime())
    uv_key = f"uv:{today}"
    uv = redis_client.scard(uv_key)
    
    return f"PV: {pv}, UV: {uv}"

if __name__ == '__main__':
    app.run()
```

在上面的代码中,`rate_limit` 是一个装饰器函数,用于限制接口访问频率。在 `index` 函数中,添加了 `@rate_limit` 装饰器,并传入了限流的配置参数,即每分钟最多允许100次访问。使用 Redis 来记录每个IP的访问次数,当访问次数超过限制时,返回错误消息。

在 `index` 函数中,会自动统计 PV(页面访问量)的数量,通过 `redis_client.incr('pv')` 来自增计数。同时,会统计 UV(独立访客数)的数量,将每个访客的 IP 添加到 `uv:{today}` 的 Redis 集合中,并使用 `redis_client.scard` 获取集合的基数(即不重复的元素个数)作为 UV 数量。

在 `/stats` 接口中,可以获取 PV 和 UV 的统计结果。

请注意,上述代码只是一个简单示例,实际情况下可能需要更复杂的逻辑来处理访问量统计和限流的问题,具体实现可以根据实际需求进行调整。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值