24小时 只记录一次IP

<%
'获取IP地址的类
Private Function getIP()
Dim strIPAddr
If Request.ServerVariables("HTTP_X_FORWARDED_FOR") = "" OR InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), "unknown") > 0 Then
strIPAddr = Request.ServerVariables("REMOTE_ADDR")
ElseIf InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ",") > 0 Then
strIPAddr = Mid(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), 1, InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ",")-1)
ElseIf InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ";") > 0 Then
strIPAddr = Mid(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), 1, InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ";")-1)
Else
strIPAddr = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
End If
getIP = Trim(Mid(strIPAddr, 1, 30))
End Function

     uip=getIP() '获得客户端IP
     set rs=server.createobject("adodb.recordset")
     sql="select * from IP where ip= '"&uip&"'"   '查询数据库中获得IP的记录
     rs.open sql,conn,1,3
     if rs.eof Then      '判断是否存在记录
         rs.close
     '添加新的页面记录
     sql="select * from IP"
     rs.open sql,conn,3,2
     rs.addnew
     rs("ip") = uip
     rs("date") = Now()
     rs.update
     rs.close
     set rs = Nothing
         '这里写上你对相关网站添加一次点击
     Else
     s_date = rs("date")  
         rs.close
         If datediff("d",s_date,Now()) <> 0 Then  '判断记录时间和现在的差几天 如果不等于0天 也就不是同一天
     '这里写上你对相关网站添加一次点击
         End If
         End If
         
%>
 
在处理某个IP地址的告警频率限制问题时,可以通过结合Redis和Java实现一个高效的限流机制。目标是在某IP的告警数量超过设定阈值后,每天仅允许发送一次通知。以下是实现思路及代码示例。 ### 核心逻辑 1. **记录每个IP的告警次数**:使用Redis存储每个IP的当日告警次数。 2. **判断是否超过阈值**:当告警次数达到阈值时,标记该IP为“已通知”状态,并设置过期时间为24小时。 3. **控制每日仅通知一次**:通过检查“已通知”状态决定是否发送通知,避免重复推送。 ### 数据结构设计 - 使用`String`类型记录IP的当日告警次数,键格式为 `alert:count:{ip}`。 - 使用`String`类型标记IP是否已通知,键格式为 `alert:notified:{ip}`,并设置TTL为24小时。 ### Java 实现代码示例 ```java import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import java.util.concurrent.TimeUnit; @Service public class AlertService { private final StringRedisTemplate redisTemplate; // 告警阈值 private static final int ALERT_THRESHOLD = 5; public AlertService(StringRedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; } public void handleAlert(String ipAddress) { String countKey = "alert:count:" + ipAddress; String notifiedKey = "alert:notified:" + ipAddress; // 获取当前告警次数 String countStr = redisTemplate.opsForValue().get(countKey); int count = countStr == null ? 0 : Integer.parseInt(countStr); if (count >= ALERT_THRESHOLD) { // 检查是否已经通知过 Boolean isNotified = redisTemplate.hasKey(notifiedKey); if (Boolean.TRUE.equals(isNotified)) { // 已通知过,不再发送 return; } else { // 发送通知 sendNotification(ipAddress); // 标记为已通知,并设置24小时过期时间 redisTemplate.opsForValue().set(notifiedKey, "1", 1, TimeUnit.DAYS); } } else { // 增加告警计数 redisTemplate.opsForValue().increment(countKey); // 设置过期时间为24小时,确保次日重置 redisTemplate.expire(countKey, 1, TimeUnit.DAYS); } } private void sendNotification(String ipAddress) { // 实际发送通知的逻辑,例如邮件、短信或消息推送 System.out.println("Sending notification for IP: " + ipAddress); } } ``` ### 说明 - **告警计数与重置**:每次触发告警时,递增对应IP的计数器,并设置TTL为24小时,保证每日自动重置[^1]。 - **通知控制**:当计数达到阈值后,检查是否已通知标志,若已存在则跳过发送,确保每天最多通知一次[^1]。 - **性能优化**:整个过程依赖于Redis的原子操作(如`increment`),保证并发安全[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值