Rumah  >  Artikel  >  pangkalan data  >  Cara menggunakan Redis untuk melaksanakan fungsi mengehadkan arus teragih

Cara menggunakan Redis untuk melaksanakan fungsi mengehadkan arus teragih

PHPz
PHPzasal
2023-11-07 12:26:141279semak imbas

Cara menggunakan Redis untuk melaksanakan fungsi mengehadkan arus teragih

Cara menggunakan Redis untuk melaksanakan fungsi pengehad semasa yang diedarkan

Pengenalan:
Dengan perkembangan pesat Internet, bilangan lawatan ke sistem perniagaan juga semakin meningkat. Apabila trafik tertumpu dalam sistem perniagaan tertentu, ia akan menimbulkan ancaman tertentu kepada kestabilan dan prestasi sistem. Untuk melindungi sistem perniagaan, pengehadan semasa telah menjadi cara yang sangat diperlukan. Dalam sistem teragih, Redis boleh digunakan untuk melaksanakan fungsi pengehad arus teragih dengan mudah. Artikel ini akan memperkenalkan cara menggunakan Redis untuk melaksanakan pengehadan arus teragih dan memberikan contoh kod khusus.

1. Prinsip asas dan struktur data Redis
Redis ialah sistem storan nilai kunci berprestasi tinggi berasaskan memori. Ia menyokong pelbagai struktur data seperti rentetan, senarai, cincang, dll. Di sini, kami memberi tumpuan terutamanya pada dua struktur data kaunter dan set tertib dalam Redis.

  1. Kaunter: Kaunter dalam Redis menggunakan struktur data String. Kaunter boleh ditambah melalui arahan INCR, dan masa tamat tempoh boleh ditetapkan untuk memudahkan pembersihan biasa.
  2. Set tempah: Set tersusun dalam Redis menggunakan struktur data ZSet (set tersusun). Setiap elemen boleh dikaitkan dengan skor dan diisih berdasarkan skor. Dalam set tertib, anda boleh menggunakan perintah ZRANGE untuk mendapatkan ahli dalam julat tertentu mengikut skor.

2. Idea untuk melaksanakan fungsi pengehad semasa
Melalui kaunter Redis dan koleksi yang dipesan, fungsi pengehad semasa yang diedarkan boleh dilaksanakan dengan mudah. Idea khusus adalah seperti berikut:

  1. Tetapkan kaunter untuk merekodkan bilangan permintaan trafik.
  2. Tetapkan tugas berjadual untuk kerap mengosongkan bilangan permintaan yang telah tamat tempoh di kaunter.
  3. Gunakan koleksi yang dipesan untuk merekodkan cap masa setiap permintaan, disusun mengikut masa.
  4. Setiap kali ada permintaan, masa permintaan terawal dalam julat masa tertentu diperolehi berdasarkan cap waktu dalam set yang ditempah.
  5. Jika terdapat lebih daripada bilangan maksimum permintaan dalam julat masa tertentu (seperti 1 saat), ia akan dinilai sebagai melebihi had semasa.

3. Contoh Kod

Berikut ialah contoh kod pengehad arus teragih Redis yang ditulis dalam Java:

import redis.clients.jedis.Jedis;

public class RateLimiter {
    private Jedis jedis;
    private String key; // Redis中的键
    private int maxRequests; // 最大请求数
    private int timeWindow; // 时间窗口,单位为秒

    public RateLimiter(Jedis jedis, String key, int maxRequests, int timeWindow) {
        this.jedis = jedis;
        this.key = key;
        this.maxRequests = maxRequests;
        this.timeWindow = timeWindow;
    }

    public boolean allowRequest() {
        long now = System.currentTimeMillis() / 1000; // 当前时间戳,单位为秒
        long earliest = now - timeWindow; // 最早的请求时间

        jedis.zremrangeByScore(key, 0, earliest); // 清理过期的请求时间

        long count = jedis.zcount(key, earliest, now); // 统计指定时间范围内的请求数

        if (count < maxRequests) {
            jedis.zadd(key, now, String.valueOf(now)); // 添加当前请求的时间
            return true;
        } else {
            return false;
        }
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379);
        RateLimiter rateLimiter = new RateLimiter(jedis, "requestCounter", 10, 1); // 最大请求数为10,时间窗口为1秒

        for (int i = 0; i < 20; i++) {
            System.out.println("第" + (i + 1) + "次请求:" + rateLimiter.allowRequest());
        }
        
        jedis.close();
    }
}

Kod di atas melaksanakan fungsi pengehad arus teragih yang mudah. Antaranya, kelas RateLimiter merangkum logik pengehad semasa, dan kelas Utama digunakan untuk ujian.

Kesimpulan:
Menggunakan Redis untuk melaksanakan fungsi pengehad arus teragih boleh melindungi kestabilan dan prestasi sistem perniagaan dengan mudah. Melalui kerjasama kaunter dan koleksi pesanan, bilangan permintaan boleh dikawal secara fleksibel, dan dengan menetapkan masa tamat tempoh, permintaan tamat tempoh boleh dikosongkan secara automatik. Di atas adalah contoh kod Senario penggunaan khusus perlu dilaraskan dan dioptimumkan mengikut situasi sebenar. Harap artikel ini membantu anda!

Atas ialah kandungan terperinci Cara menggunakan Redis untuk melaksanakan fungsi mengehadkan arus teragih. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn