前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用Redis实现统计24小时内的访问量

利用Redis实现统计24小时内的访问量

作者头像
xcsoft
发布2021-07-21 14:55:25
2.5K0
发布2021-07-21 14:55:25
举报
文章被收录于专栏:星辰日记星辰日记

利用Redis实现统计24小时内的访问量

需求

  我们这里的需求是,记录不同用户在24小时(指定时间)内的访问量,并记录访问日志。如果达到一定的频率则封禁IP

测试环境

Redis 6.2.4 PHP 8.0

开始

  我们先来了解一下Redis,Redis是一个高性能的Key => Value缓存器,由于数据缓存在内存中,所以比Mysql等数据库等响应速度要快几十到上百倍。

  在这个实例中,我们用到的是Redis的Hash类型,通过用户每次访问,在Redis中记录访问者的IP以及对应的时间戳,来达到统计的目的,并且判断该IP访问的历史时间戳是否超过了24小时,如果超过则删除,最终通过llen来获取24小时内的访问次数。

  首先我们通过PHP连接Redis:

代码语言:javascript
复制
    try {
            $redis = new Redis(); 
            $redis->connect('127.0.0.1', 6379);
            $redis -> select(1); //选择DB1
        } catch (Exception $e) {
            header('Content-type:text/json');
            header('Access-Control-Allow-Origin: *');
            header('ERROR: redis -> ' . $e->getMessage());
            echo json_encode(array('code' => 444,'msg' => '系统错误,请联系管理员')); // redis连接失败
            exit; 
        }

   接着可以通过$_SERVER['REMOTE_ADDR']等函数获取 访问者ip,获取访问者IP之后,我们需要在Redis中检查这个键是否存在,如果不存在则需要新建:

代码语言:javascript
复制
 $redis_key_name = 用户IP;
 if($redis -> exists($redis_key_name)){
        while(True) {
            //检查历史访问的时间戳是否过期,过期则删除
            $da = $redis -> lRange($redis_key_name,0,1)[0] ?? '';
            if(time() - (int)$da >= $limit_time){
                $redis -> lrem($redis_key_name,$da,0);
            } else {
                break;
            }
        }
        //写入当前时间戳
        $redis -> rPushx($redis_key_name,time());
        $num = $redis -> llen($redis_key_name);
    } else {
        $redis -> lPush($redis_key_name,time());
        $num = 1;
    }

  之后我们可以直接使用llen获取表内的数据个数:

代码语言:javascript
复制
if($redis -> llen($redis_key_name) >= $limit_num){
        //超过限制数目 -> banip
    }
$redis -> expire($redis_key_name,$limit_time); //这里用来设置键的有效期 ,超过24小时则删除

//同时可以通过error_log()函数记录用户的访问信息

demo

  式例: https://github.com/soxft/Redis-Record

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

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