滑动窗口日志实现
了解滑动窗口日志算法、它的精确性,以及记录单个请求时间戳所带来的存储影响。
滑动窗口日志实现 是 CoddyKit 上的免费 API Rate Limiting & Scalability Patterns 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 API Rate Limiting & Scalability Patterns 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 API Rate Limiting & Scalability Patterns 课程共包含 4 节课。
本课时的部分内容尚未翻译,以英文显示。
Intro to Sliding Window Log
Welcome to the Sliding Window Log algorithm! This method offers a highly precise way to enforce API rate limits.
Unlike simpler methods, it keeps a detailed record of each request, allowing for very accurate control over traffic.
The Timestamp Log Core
The core idea of the Sliding Window Log is to store the exact timestamp of every request made by a client.
- Imagine a list or array.
- Each time a request is made, its current time (e.g., in milliseconds) is added to this list.
- This log allows us to precisely track activity over any given period.
Logging New Requests
When a new request arrives, the algorithm performs two main steps:
- It records the current time and adds it to the list of request timestamps.
- It then cleans up old timestamps that are no longer relevant to the current 'sliding' window.
This ensures the log only contains recent, active requests.
Checking the Sliding Window
To determine if a new request should be allowed, the algorithm calculates a sliding window.
- For a 60-second limit, if the current time is
T, the window covers requests fromT - 60 secondstoT. - It counts how many timestamps in the log fall within this calculated window.
- If the count is below the allowed limit, the request is permitted.
Visualizing Window Movement
Think of the window as a continuous period that 'slides' forward with each new request.
If your limit is 3 requests per 5 seconds:
- At
t=0, window is[-5s, 0s]. - At
t=2s, window is[-3s, 2s]. - At
t=6s, window is[1s, 6s].
Only timestamps within the current sliding window are counted.
Limiter Class Setup
Let's set up a basic Java class for our Sliding Window Log rate limiter. We'll use an ArrayList to store the request timestamps.
Try running this to see the initial setup:
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class SlidingWindowLogRateLimiter {
private final List<Long> requestTimestamps;
private final long windowSizeMillis; // e.g., 60_000 for 60 seconds
private final int maxRequests;
public SlidingWindowLogRateLimiter(long windowSize, TimeUnit unit, int maxRequests) {
this.requestTimestamps = new ArrayList<>();
this.windowSizeMillis = unit.toMillis(windowSize);
this.maxRequests = maxRequests;
}
// The allowRequest() method will be added next!
public static void main(String[] args) {
System.out.println("Rate Limiter setup complete!");
}
}Implementing allowRequest()
Now, let's implement the core logic for the allowRequest() method. This method will remove old timestamps and check if the current request can be allowed.
Run the code to see a simple test of the rate limiter in action!
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class SlidingWindowLogRateLimiter {
private final List<Long> requestTimestamps;
private final long windowSizeMillis;
private final int maxRequests;
public SlidingWindowLogRateLimiter(long windowSize, TimeUnit unit, int maxRequests) {
this.requestTimestamps = new ArrayList<>();
this.windowSizeMillis = unit.toMillis(windowSize);
this.maxRequests = maxRequests;
}
public synchronized boolean allowRequest() {
long currentTime = System.currentTimeMillis();
long windowStartTime = currentTime - windowSizeMillis;
// Remove timestamps older than the current window
requestTimestamps.removeIf(timestamp -> timestamp <= windowStartTime);
// Check if adding a new request would exceed the limit
if (requestTimestamps.size() < maxRequests) {
requestTimestamps.add(currentTime);
return true;
}
return false;
}
public static void main(String[] args) throws InterruptedException {
// Example: 3 requests allowed per 5 seconds
SlidingWindowLogRateLimiter limiter =
new SlidingWindowLogRateLimiter(5, TimeUnit.SECONDS, 3);
System.out.println("Testing 5s, 3 requests limit:");
for (int i = 0; i < 5; i++) {
boolean allowed = limiter.allowRequest();
System.out.println("Request " + (i + 1) + ": " + (allowed ? "Allowed" : "Blocked"));
if (i == 2) Thread.sleep(1000); // Small delay to simulate real traffic
}
// Wait for the window to pass to allow more requests
System.out.println("Waiting 5 seconds for window reset...");
Thread.sleep(5000);
System.out.println("Request after window reset: " + (limiter.allowRequest() ? "Allowed" : "Blocked"));
}
}Key Advantage: High Precision
The biggest strength of the Sliding Window Log algorithm is its high precision.
- Because it records every individual timestamp, it can accurately calculate the number of requests within any dynamic window.
- This eliminates the 'burstiness' problem seen in Fixed Window Counters, where a sudden spike at the window's edge could bypass limits.
The Memory & Performance Challenge
While precise, the Sliding Window Log has significant drawbacks, especially for high-volume APIs:
- Memory Usage: Storing every timestamp for millions of requests can consume a lot of memory.
- Performance: Operations like adding new timestamps and removing old ones (especially with large lists) can become slow, impacting performance.
This makes it less suitable for extremely high-throughput systems unless optimized.
Check Your Understanding
Consider the Sliding Window Log algorithm. Which of the following statements are true about its characteristics?
Recap: Sliding Window Log
In this lesson, we explored the Sliding Window Log algorithm:
- It tracks every request by its exact timestamp.
- It offers high precision, avoiding the 'burst' issue of fixed windows.
- Its main drawbacks are high memory usage and potential performance bottlenecks for very large request logs.
Next, we'll look at the Sliding Window Counter, which aims to improve on these drawbacks!
常见问题解答
「滑动窗口日志实现」课时是免费的吗?
是的 — 「滑动窗口日志实现」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 API Rate Limiting & Scalability Patterns 课程的其余内容,请升级到 CoddyKit PRO。 API Rate Limiting & Scalability Patterns 课程共包含 4 节课。
「滑动窗口日志实现」这节课中我会学到什么?
了解滑动窗口日志算法、它的精确性,以及记录单个请求时间戳所带来的存储影响。 你通过在浏览器中直接运行的动手代码来练习 API Rate Limiting & Scalability Patterns,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 API Rate Limiting & Scalability Patterns 需要有经验吗?
无需任何先前经验。CoddyKit 上的 API Rate Limiting & Scalability Patterns 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「滑动窗口日志实现」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 API Rate Limiting & Scalability Patterns 课中编写并运行代码吗?
能。每节 API Rate Limiting & Scalability Patterns 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。