数据库 · 4 11 月, 2024

互聯網大廠面試:如何利用 Redis 實現全局接口限流

互聯網大廠面試:如何利用 Redis 實現全局接口限流

在當今的互聯網環境中,接口限流是一個至關重要的技術,尤其是在高流量的應用中。面試中,許多大廠會考察候選人對於接口限流的理解和實現能力。Redis 作為一種高效的內存數據庫,因其快速的讀寫性能和豐富的數據結構,成為實現全局接口限流的理想選擇。

什麼是接口限流?

接口限流是指對某一接口的請求數量進行限制,以防止系統過載。這種技術可以保護後端服務,確保其在高流量情況下仍能穩定運行。常見的限流策略包括:

  • 固定窗口限流
  • 滑動窗口限流
  • 令牌桶算法
  • 漏桶算法

為什麼選擇 Redis?

Redis 是一種高性能的鍵值存儲系統,具有以下優勢:

  • 高效性:Redis 的數據操作速度極快,能夠支持每秒數十萬次的請求。
  • 持久性:支持數據持久化,能夠在重啟後恢復數據。
  • 豐富的數據結構:支持字符串、哈希、列表、集合等多種數據類型,靈活性高。

Redis 實現全局接口限流的基本思路

使用 Redis 實現全局接口限流的基本思路是利用 Redis 的鍵值存儲特性,將每個用戶的請求次數存儲在 Redis 中,並設置過期時間。以下是實現的基本步驟:

1. 設置請求計數器

每當用戶發送請求時,系統會在 Redis 中增加一個計數器。可以使用 Redis 的 INCR 命令來實現:

INCR user:123:request_count

這裡的 user:123:request_count 是用戶 ID 的請求計數器。

2. 設置過期時間

為了防止計數器無限增長,我們需要為計數器設置過期時間。可以使用 EXPIRE 命令來設置:

EXPIRE user:123:request_count 60

這樣,計數器在 60 秒後會自動清除。

3. 檢查請求次數

在每次請求到來時,我們需要檢查當前的請求次數是否超過限制。如果超過限制,則拒絕請求;否則,允許請求並更新計數器:

if (GET user:123:request_count > limit) {
    return "Too many requests";
} else {
    INCR user:123:request_count;
}

示例代碼

以下是一個簡單的 Node.js 示例,展示如何使用 Redis 實現接口限流:

const redis = require('redis');
const client = redis.createClient();

const limit = 100; // 每分鐘最多請求次數

app.use((req, res, next) => {
    const userId = req.user.id; // 假設用戶 ID 存在請求中
    const key = `user:${userId}:request_count`;

    client.get(key, (err, count) => {
        if (err) throw err;

        count = parseInt(count) || 0;

        if (count >= limit) {
            return res.status(429).send("Too many requests");
        }

        client.multi()
            .incr(key)
            .expire(key, 60)
            .exec();
        
        next();
    });
});

總結

在互聯網大廠的面試中,掌握如何利用 Redis 實現全局接口限流是一項重要技能。通過設置請求計數器、過期時間以及檢查請求次數,可以有效地保護系統免受過載影響。這不僅能提高系統的穩定性,還能提升用戶體驗。

如果您對於 香港VPS 及其在高流量應用中的應用有興趣,歡迎訪問我們的網站以獲取更多資訊。