专栏首页星辰日记利用Redis实现统计24小时内的访问量

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

利用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:

    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中检查这个键是否存在,如果不存在则需要新建:

 $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获取表内的数据个数:

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 2021年突破年薪百万难关!吃透这套Java真题合集

    我相信大多 Java 开发的程序员或多或少经历过BAT一些大厂的面试,也清楚一线互联网大厂 Java 面试是有一定难度的,小编经历过多次面试,有满意的也有备受打...

    Java程序猿
  • 腾讯会议空中加油级的扩容,只需按一个按钮

    受疫情影响,多数企业员工目前无法回到写字楼办公,学生推迟开学,稳定高效的进行远程办公和直播授课成为2020年的开年刚需。2月,腾讯宣布疫情期间免费开放可支持3...

    腾讯云数据库 TencentDB
  • 宝塔BT面板优化补充以及防CC优化方案,小白党福利

    攻击者借助代理服务器生成指向受害主机的合法请求,实现DDOS和伪装就叫:CC(ChallengeCollapsar)。

    程序员纬度
  • 618数据洪峰来了 一键下单背后都有哪些技术支撑?

    618大促来临,在零点的时候,你打开购物车、点点点、清空,整个过程一气呵成。但背后,成千上万的数据在马不停蹄、加速流转,以保障消费体验流畅有序。 腾讯云和数...

    腾讯云数据库 TencentDB
  • Redis 源码 bug 深入定位过程分享

    Redis 3.2.8及以前的版本中 AOF 重写过程存在fd泄漏的风险。本文描述了一次与此相关的 fd泄漏问题的定位过程,并结合源码分析了问题产生的根源。

    廖可知
  • 宝塔LNMP环境 防CC攻击

    实测:1核1G内存撑住700多代理IP持续攻击,屹立不倒,且CPU在45%左右徘徊。

    C4rpeDime
  • 近千节点的Redis集群运维,来自优酷蓝鲸的经验总结

    Redis是时下比较流行的NoSQL技术。在优酷我们使用Redis Cluster构建了一套内存存储系统,项目代号蓝鲸。到目前为止集群有700+节点,即将达到作...

    子润先生
  • 快速认识Redis(一)

    不好意思哈~ 各位你们的Redis迟到了!!!!!! 好了废话不多说开更!!!!!!

    刘浩的BigDataPath
  • Redis 实战篇:巧用数据类型实现亿级数据统计

    在移动应用的业务场景中,我们需要保存这样的信息:一个 key 关联了一个数据集合,同时还要对集合中的数据进行统计排序。

    码哥字节
  • 面试官嘲笑我,这你都不会?

    多年前刚毕业出来工作的时候,那个时候刚毕业对缓存的使用基本上可以说很少涉及,在大学做课件设计或者小型项目也都是用不到缓存,再者说了我大学是做嵌入式写汇编语言和c...

    我是阿沐
  • Redis入坟(四)Redis内存回收知多少

    Reids 所有的数据都是存储在内存中的,在某些情况下需要对占用的内存空间进行回收。内存回收主要分为两类,一类是 key 过期,一类是内存使用达到上限(max_...

    源码之路
  • Redis常见的5种不同的数据类型详解

    Redis除了可以存储键还可以存储常见的5种数据类型,分别是:String、List、Set、Hash、ZSet。对于Redis的命令有一部分是可以公用的,但是...

    Java后端技术
  • Redis常见面试题之 - 内存淘汰算法

    现在后端面试中比较喜欢问一些 Redis 的问题,比较常见的就是 内存淘汰算法。下面我们通过源码来分析 Redis 内存淘汰算法的实现,从而不会被面试官问到哑口...

    用户7686797
  • Redis Cluster服务平台化之路

    作者介绍: 姓名:李航 github:https://github.com/lidaohang

    Lucien168
  • 吐血整理的 60 个 Redis 面试题,全网最全了

    单进程单线程模式,采用队列模式将并发访问变为串行访问。Redis本身没有锁的概念,Redis对于多个客户端连接并不存在竞争,利用setnx实现锁。

    zhisheng
  • 王炸吐血整理60个Redis面试题,全网最全了

    单进程单线程模式,采用队列模式将并发访问变为串行访问。Redis本身没有锁的概念,Redis对于多个客户端连接并不存在竞争,利用setnx实现锁。

    王炸
  • 一文带你揭开Redis复制原理的神秘面纱

    墨墨导读:本文在依托Redis主从环境下,针对访问的数据一致性进行分析,解开Redis复制原理的神秘面纱。‍

    数据和云
  • 混在运维部的安全员说“端口与口令安全”

    ? 1. 前言 先简单自我介绍一下,其实,我是一个安全工程师。现就职于某互联网金融企业负责公司整体网络安全。 刚到公司时首先是了解一些企业规则和规则制定者,当...

    FB客服
  • 如何处理redis集群的hot key和big key

    redis 集群部署方式大部分采用类 Twemproxy 的方式进行部署。即通过 Twemproxy 对 redis key 进行分片计算,将 redis ke...

    akayzhang

扫码关注云+社区

领取腾讯云代金券