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.
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)
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!