Rumah  >  Artikel  >  pangkalan data  >  Prinsip dan kaedah pelaksanaan Redis melaksanakan pengehadan arus teragih

Prinsip dan kaedah pelaksanaan Redis melaksanakan pengehadan arus teragih

WBOY
WBOYasal
2023-05-11 16:40:591914semak imbas

Dengan pembangunan Internet, banyak aplikasi perlu mengehadkan aliran pelbagai permintaan. Ini kerana di bawah konkurensi yang tinggi, aplikasi akan berada di bawah tekanan sebilangan besar permintaan, menyebabkan perkhidmatan ranap atau bertindak balas dengan perlahan. Untuk menyelesaikan masalah ini, pembangun biasanya menggunakan teknologi pengehad semasa yang diedarkan untuk mengawal aliran permintaan dan memastikan ketersediaan dan kestabilan perkhidmatan yang tinggi. Sebagai sistem storan data memori berprestasi tinggi, Redis ialah salah satu daripada penyelesaian pengehad semasa teragih yang biasa digunakan. Artikel ini akan memperkenalkan prinsip dan kaedah pelaksanaan pengehadan arus teragih dalam Redis.

1. Apa yang mengehadkan arus teragih

Penghadan arus teragih merujuk kepada proses mengawal trafik permintaan melalui kerjasama antara berbilang pelayan. Pengehad kadar mengira bilangan permintaan, membandingkan kadar permintaan masuk dengan kadar yang dibenarkan dan menerima atau menolak permintaan berdasarkan nisbah. Dalam pendikitan teragih, setiap nod berkongsi kadar permintaan dan kaunter permintaan, yang membantu memastikan bahawa kadar adalah sama untuk semua nod dan mengelakkan kelebihan beban nod.

2. Prinsip Redis melaksanakan pengehadan arus teragih

Redis menggunakan struktur data terbina dalam, terutamanya zset (set diisih), untuk melaksanakan pengehadan arus teragih. Zset ialah set diisih di mana setiap elemen adalah unik dan mempunyai skor. Skor digunakan untuk mengisih elemen, biasanya nombor atau masa. Dalam pengehadan arus teragih, kita boleh menetapkan zset untuk setiap pengguna (atau alamat IP), dan kemudian menggunakan zset ini untuk menyimpan kaunter permintaan pengguna. Apabila setiap permintaan tiba, kami menyimpannya dalam zset dan menambah pembilang menggunakan arahan INCRBY Redis. Kami kemudian menghantar skor permintaan dan cap masa semasa bersama-sama sebagai parameter kepada perintah zrangebyscore untuk mengira kadar permintaan dalam julat masa tertentu. Jika kadar melebihi kadar yang dibenarkan, permintaan akan ditolak.

3. Cara Redis melaksanakan pengehadan semasa yang diedarkan Digunakan untuk menyimpan pengehad kadar (satu pengehad kadar mewakili pengguna atau alamat IP) dan meminta pembilang untuk setiap pengehad kadar.

Setiap kali permintaan tiba, kami menyimpannya dalam zset pengehad kadar ini dan menambah pembilang menggunakan arahan INCRBY. Secara lalai, arahan ini menambah pembilang sebanyak 1 setiap kali, tetapi anda boleh meningkatkan kenaikan dengan menetapkan argumen arahan kepada nilai yang lebih tinggi.

    Gunakan perintah zrangebyscore untuk mencari semua permintaan dengan kaunter permintaan dalam julat masa yang ditentukan dan mengira kadar permintaan.
  1. Jika kadar permintaan melebihi kadar yang dibenarkan, tolak permintaan dan kembalikan mesej ralat.
  2. Jika kadar permintaan tidak melebihi kadar yang dibenarkan, terima permintaan dan kemas kini kaunter permintaan dalam zset.
  3. Berikut ialah kod sampel yang menunjukkan cara menggunakan Redis untuk melaksanakan pengehadan arus teragih. Antaranya, kami menggunakan zset global untuk menyimpan kaunter permintaan bagi setiap alamat IP, dan menggunakan perintah zrangebyscore untuk mengira kadar permintaan sesaat.
  4. import redis
    import time
    
    class RateLimiter(object):
        def __init__(self, redis_client, rate, key_prefix='limiter'):
            self.redis = redis_client
            self.rate = rate
            self.key_prefix = key_prefix
    
        def allow_request(self, ip):
            key = '%s:%s' % (self.key_prefix, ip)
            now = time.time()
            count = self.redis.zcount(key, now - 1, now)
            if count < self.rate:
                self.redis.zadd(key, now, now)
                return True
            return False
    
    if __name__ == '__main__':
        redis_client = redis.Redis()
        limiter = RateLimiter(redis_client, 5)
        for i in range(10):
            print(limiter.allow_request('192.168.1.1'))
            time.sleep(1)
  5. Dalam kod di atas, kami mula-mula mencipta kelas yang dipanggil RateLimiter, yang menggunakan Redis sebagai storan bahagian belakang. Pembina menerima dua parameter: Contoh klien Redis dan had kadar. Setiap kali kami memanggil kaedah allow_request, ia akan menerima parameter yang mewakili alamat IP dan kemudian menyemak sama ada bilangan permintaan untuk alamat IP tersebut melebihi had kadar. Jika tidak, ia mengumpul permintaan dan mengembalikan Benar jika tidak, ia menolak permintaan dan mengembalikan Salah.
Dalam fungsi utama, kami mencipta contoh bernama limiter, menetapkan had kadar kepada 5 (iaitu, menerima sehingga 5 permintaan sesaat), dan kemudian mensimulasikan 10 permintaan berturut-turut, setiap permintaan Selang adalah 1 saat . Pada permulaan permintaan ke-6, memandangkan had kadar telah dicapai, semua permintaan akan ditolak dan Palsu akan dikembalikan.

4. Ringkasan

Redis ialah sistem penyimpanan data memori berprestasi tinggi yang menyediakan pelbagai struktur data, terutamanya zset (Set Diisih), yang merupakan pilihan ideal untuk melaksanakan pengehadan arus teragih . Dengan menggunakan fungsi seperti perintah zset, INCRBY dan zrangebyscore Redis, kami boleh melaksanakan pengehadan arus teragih dengan mudah untuk mengawal aliran permintaan dan memastikan ketersediaan dan kestabilan perkhidmatan yang tinggi.

Atas ialah kandungan terperinci Prinsip dan kaedah pelaksanaan Redis melaksanakan pengehadan 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