cari
Rumahpangkalan dataRedisBagaimana untuk melaksanakan algoritma baldi token menggunakan Redis? (dengan kod)

Artikel ini akan berkongsi dengan anda prinsip algoritma baldi token dan memperkenalkan kaedah menggunakan Redis untuk melaksanakan algoritma baldi token saya harap ia akan membantu semua orang!

Bagaimana untuk melaksanakan algoritma baldi token menggunakan Redis? (dengan kod)

Antara algoritma pengehad semasa, terdapat algoritma baldi token, yang boleh menangani letusan trafik yang singkat, yang amat berguna dalam persekitaran kehidupan sebenar di mana trafik berada tidak terlalu seragam, had semasa tidak akan dicetuskan dengan kerap, dan ia lebih mesra kepada pemanggil.

Sebagai contoh, had semasa ialah 10qps, selalunya ia tidak akan melebihi jumlah ini, tetapi kadang-kadang ia akan mencapai 30qps, dan kemudian ia akan kembali normal tidak lama lagi, dengan mengandaikan bahawa ledakan trafik ini tidak akan mempunyai kesan ke atas kestabilan sistem , kami boleh membenarkan trafik pecah serta-merta ini pada tahap tertentu, dengan itu membawa pengalaman ketersediaan yang lebih baik kepada pengguna. Di sinilah algoritma baldi token masuk.

Prinsip Algoritma Token Bucket

Seperti yang ditunjukkan dalam rajah di bawah, prinsip asas algoritma ialah: terdapat baldi token dengan kapasiti ke dalam baldi ini. Jika bilangan token dalam baldi melebihi X, maka ia akan dibuang. Apabila memproses permintaan, anda perlu mengalih keluar token daripada baldi token terlebih dahulu. Jika anda mendapat token, teruskan pemprosesan jika anda tidak boleh mendapatkan token, tolak permintaan.

Bagaimana untuk melaksanakan algoritma baldi token menggunakan Redis? (dengan kod)

Ia boleh dilihat bahawa penetapan nombor X, Y dan Z amat penting dalam algoritma baldi token. Z hendaklah lebih besar sedikit daripada bilangan permintaan bagi setiap unit masa Y, dan sistem akan berada dalam keadaan ini untuk masa yang lama Ini menunjukkan bahawa trafik telah melebihi jangkaan, dan puncanya perlu disiasat dengan segera dan langkah yang sepadan diambil.

Redis melaksanakan algoritma baldi token

Saya telah melihat baldi token dilaksanakan oleh beberapa program sebelum ini bilangan token setiap unit masa Y, atau lakukan proses ini dengan kerap dalam Pemasa. Saya tidak begitu berpuas hati dengan kaedah ini. Terdapat dua sebab Satu adalah pembaziran sumber benang, dan satu lagi adalah masa pelaksanaan yang tidak tepat kerana isu penjadualan. [Cadangan berkaitan: Tutorial Video Redis]

Kaedah untuk menentukan bilangan token dalam baldi token adalah melalui pengiraan Pertama, kira berapa lama masa yang telah berlalu dari permintaan terakhir hingga ini permintaan. Untuk masa yang lama, sama ada ambang masa untuk mengeluarkan token telah dicapai, kemudian berapa banyak token ditambah, dan berapa banyak token ini boleh dimasukkan ke dalam baldi.

Ceramah itu murah!

Mari kita lihat cara ia dilaksanakan dalam Redis Kerana ia melibatkan pelbagai interaksi dengan Redis, di sini kami berada di sini untuk meningkatkan daya pemprosesan pemprosesan pengehad semasa dan mengurangkan program dan Bilangan interaksi Redis menggunakan skrip Lua yang disokong oleh Redis Pelaksanaan skrip Lua adalah atom, jadi tidak perlu risau tentang data kotor.

Kod ini dipetik daripada FireflySoft.RateLimit Ia bukan sahaja menyokong penggunaan hamba tuan biasa bagi Redis, tetapi juga menyokong Redis berkelompok, jadi daya tampung boleh dipertingkatkan melalui pengembangan mendatar. Untuk kemudahan membaca, beberapa komen ditambah di sini, tetapi sebenarnya tiada.

-- 定义返回值,是个数组,包含:是否触发限流(1限流 0通过)、当前桶中的令牌数
local ret={}
ret[1]=0
-- Redis集群分片Key,KEYS[1]是限流目标
local cl_key = '{' .. KEYS[1] .. '}'

-- 获取限流惩罚的当前设置,触发限流惩罚时会写一个有过期时间的KV
-- 如果存在限流惩罚,则返回结果[1,-1]
local lock_key=cl_key .. '-lock'
local lock_val=redis.call('get',lock_key)
if lock_val == '1' then
    ret[1]=1
    ret[2]=-1
    return ret;
end

-- 这里省略部分代码

-- 获取[上次向桶中投放令牌的时间],如果没有设置过这个投放时间,则令牌桶也不存在,此时:
-- 一种情况是:首次执行,此时定义令牌桶就是满的。
-- 另一种情况是:较长时间没有执行过限流处理,导致承载这个时间的KV被释放了,
-- 这个过期时间会超过自然投放令牌到桶中直到桶满的时间,所以令牌桶也应该是满的。
local last_time=redis.call('get',st_key)
if(last_time==false)
then
 -- 本次执行后剩余令牌数量:桶的容量- 本次执行消耗的令牌数量
    bucket_amount = capacity - amount;
    -- 将这个令牌数量更新到令牌桶中,同时这里有个过期时间,如果长时间不执行这个程序,令牌桶KV会被回收
    redis.call('set',KEYS[1],bucket_amount,'PX',key_expire_time)
    -- 设置[上次向桶中放入令牌的时间],后边计算应放入桶中的令牌数量时会用到
    redis.call('set',st_key,start_time,'PX',key_expire_time)
    -- 返回值[当前桶中的令牌数]
    ret[2]=bucket_amount
    -- 无需其它处理
    return ret
end

-- 令牌桶存在,获取令牌桶中的当前令牌数
local current_value = redis.call('get',KEYS[1])
current_value = tonumber(current_value)

-- 判断是不是该放入新令牌到桶中了:当前时间-上次投放的时间 >= 投放的时间间隔
last_time=tonumber(last_time)
local last_time_changed=0
local past_time=current_time-last_time
if(past_time<inflow_unit)
then
 -- 不到投放的时候,直接从令牌桶中取走令牌
    bucket_amount=current_value-amount
else
 -- 需要放入一些令牌, 预计投放数量 = (距上次投放过去的时间/投放的时间间隔)*每单位时间投放的数量
    local past_inflow_unit_quantity = past_time/inflow_unit
    past_inflow_unit_quantity=math.floor(past_inflow_unit_quantity)
    last_time=last_time+past_inflow_unit_quantity*inflow_unit
    last_time_changed=1
    local past_inflow_quantity=past_inflow_unit_quantity*inflow_quantity_per_unit
    bucket_amount=current_value+past_inflow_quantity-amount
end

-- 这里省略部分代码

ret[2]=bucket_amount

-- 如果桶中剩余数量小于0,则看看是否需要限流惩罚,如果需要则写入一个惩罚KV,过期时间为惩罚的秒数
if(bucket_amount<0)
then
    if lock_seconds>0 then
        redis.call(&#39;set&#39;,lock_key,&#39;1&#39;,&#39;EX&#39;,lock_seconds,&#39;NX&#39;)
    end
    ret[1]=1
    return ret
end

-- 来到这里,代表可以成功扣减令牌,则需要更新令牌桶KV
if last_time_changed==1 then
    redis.call(&#39;set&#39;,KEYS[1],bucket_amount,&#39;PX&#39;,key_expire_time)
 -- 有新投放,更新[上次投放时间]为本次投放时间
    redis.call(&#39;set&#39;,st_key,last_time,&#39;PX&#39;,key_expire_time)
else
    redis.call(&#39;set&#39;,KEYS[1],bucket_amount,&#39;PX&#39;,key_expire_time)
end
return ret

Daripada kod di atas, dapat dilihat bahawa proses pemprosesan utama ialah:

1. Tentukan sama ada terdapat penalti had semasa, kembalikan terus , pergi ke langkah seterusnya.

2. Tentukan sama ada baldi token itu wujud, buat baldi token dahulu, kemudian tolak token dan kembalikan, pergi ke langkah seterusnya.

3. Tentukan sama ada token perlu dikeluarkan, jika tidak, token akan ditolak secara langsung.

4. Tentukan bilangan token selepas potongan Jika kurang daripada 0, kembali ke had semasa, dan tetapkan penalti had semasa jika lebih besar daripada atau sama dengan 0, pergi ke yang seterusnya langkah.

5. Kemas kini bilangan token dalam baldi kepada Redis.

Anda boleh menyerahkan dan menjalankan skrip Lua ini dalam perpustakaan Redis bagi mana-mana bahasa pembangunan Jika anda menggunakan platform .NET, anda boleh merujuk artikel ini: Kadar baldi token Penggunaan Teras ASP.NET had (https://blog.bossma.cn/dotnet/asp-net-core-token-bucket-algorithm-of-rate-limit/).

Mengenai FireflySoft.RateLimit

FireflySoft.RateLimit ialah perpustakaan kelas mengehadkan semasa berdasarkan .NET Standard terasnya ringkas dan ringan serta boleh fleksibel menghadapi pelbagai senario menghadkan semasa Permintaan.

Ciri utamanya termasuk:

  • Algoritma pengehadan berbilang semasa: empat algoritma terbina dalam: tetingkap tetap, tetingkap gelongsor, baldi bocor dan baldi token, yang juga boleh disesuaikan dan dikembangkan.
  • Storan berbilang kiraan: pada masa ini menyokong dua kaedah storan: memori dan Redis.
  • Mesra teragih: menyokong pengiraan bersatu program yang diedarkan melalui storan Redis.
  • Sasaran pengehad semasa yang fleksibel: Pelbagai data boleh diekstrak daripada permintaan untuk menetapkan sasaran pengehad semasa.
  • Sokong penalti mengehadkan semasa: anda boleh mengunci klien untuk tempoh masa selepas mencetuskan pengehadan semasa dan tidak membenarkan akses.
  • Perubahan peraturan dinamik: Menyokong peraturan pengehad semasa yang berubah secara dinamik semasa program sedang berjalan.
  • Ralat tersuai: Anda boleh menyesuaikan kod ralat dan mesej ralat selepas mencetuskan had semasa.
  • Kesesuaian universal: Pada dasarnya, ia boleh memenuhi sebarang senario yang memerlukan pengehadan semasa.

Alamat sumber terbuka Github: https://github.com/bosima/FireflySoft.RateLimit/blob/master/README.zh-CN.md

Artikel ini diterbitkan semula daripada: https://juejin.cn/post/7039105263168651301

Pengarang: Yinghuo Architecture

Untuk lebih banyak pengetahuan berkaitan pengaturcaraan, sila lawati: Video pengaturcaraan ! !

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan algoritma baldi token menggunakan Redis? (dengan kod). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Artikel ini dikembalikan pada:掘金社区. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Redis: meneroka ciri dan fungsinyaRedis: meneroka ciri dan fungsinyaApr 19, 2025 am 12:04 AM

Redis menonjol kerana kelajuan tinggi, fleksibiliti dan struktur data yang kaya. 1) Redis menyokong struktur data seperti rentetan, senarai, koleksi, hash dan koleksi yang diperintahkan. 2) Ia menyimpan data melalui ingatan dan menyokong RDB dan AOF kegigihan. 3) Bermula dari Redis 6.0, operasi I/O multi-threaded telah diperkenalkan, yang telah meningkatkan prestasi dalam senario konvensional yang tinggi.

Adakah Redis Pangkalan Data SQL atau NoSQL? Jawapannya dijelaskanAdakah Redis Pangkalan Data SQL atau NoSQL? Jawapannya dijelaskanApr 18, 2025 am 12:11 AM

RedisIsclassifiedasanosqldatabaseBecauseItuseSey-valuedatamodelinsteadofthetraditionalrelationaldatabasemodel.itoffersspeedandflexibility, makeitidealforreal-timeapplicationsandcaching, ButitmaybesuitiSuScenariscenariscenari

Redis: Meningkatkan prestasi aplikasi dan skalabilitiRedis: Meningkatkan prestasi aplikasi dan skalabilitiApr 17, 2025 am 12:16 AM

Redis meningkatkan prestasi aplikasi dan skalabiliti dengan data caching, melaksanakan penguncian dan ketekunan data yang diedarkan. 1) Data cache: Gunakan REDIS ke cache data yang sering diakses untuk meningkatkan kelajuan akses data. 2) Kunci yang diedarkan: Gunakan Redis untuk melaksanakan kunci yang diedarkan untuk memastikan keselamatan operasi dalam persekitaran yang diedarkan. 3) Kegigihan data: Memastikan keselamatan data melalui mekanisme RDB dan AOF untuk mencegah kehilangan data.

Redis: Meneroka Model dan Struktur DatanyaRedis: Meneroka Model dan Struktur DatanyaApr 16, 2025 am 12:09 AM

Model dan struktur data Redis termasuk lima jenis utama: 1. String: Digunakan untuk menyimpan teks atau data binari, dan menyokong operasi atom. 2. Senarai: Koleksi Elemen yang Diarahkan, sesuai untuk beratur dan susunan. 3. Set: unsur -unsur unik yang tidak teratur ditetapkan, menyokong operasi set. 4. Diarahkan Set (SortedSet): Satu set elemen yang unik dengan skor, sesuai untuk kedudukan. 5. Jadual Hash (Hash): Koleksi pasangan nilai utama, sesuai untuk menyimpan objek.

Redis: mengklasifikasikan pendekatan pangkalan datanyaRedis: mengklasifikasikan pendekatan pangkalan datanyaApr 15, 2025 am 12:06 AM

Kaedah pangkalan data Redis termasuk pangkalan data dalam memori dan penyimpanan nilai utama. 1) Redis menyimpan data dalam ingatan, dan membaca dan menulis dengan cepat. 2) Ia menggunakan pasangan nilai utama untuk menyimpan data, menyokong struktur data kompleks seperti senarai, koleksi, jadual hash dan koleksi yang diperintahkan, sesuai untuk pangkalan data cache dan NoSQL.

Mengapa menggunakan Redis? Faedah dan kelebihanMengapa menggunakan Redis? Faedah dan kelebihanApr 14, 2025 am 12:07 AM

REDIS adalah penyelesaian pangkalan data yang kuat kerana ia menyediakan prestasi cepat, struktur data yang kaya, ketersediaan dan skalabilitas yang tinggi, keupayaan kegigihan, dan pelbagai sokongan ekosistem. 1) Prestasi yang sangat cepat: Data Redis disimpan dalam ingatan dan mempunyai kelajuan membaca dan menulis yang sangat cepat, sesuai untuk aplikasi kesesuaian yang tinggi dan rendah. 2) Struktur data yang kaya: Menyokong pelbagai jenis data, seperti senarai, koleksi, dan lain -lain, yang sesuai untuk pelbagai senario. 3) Ketersediaan dan skalabilitas yang tinggi: Menyokong replikasi master-hamba dan mod kluster untuk mencapai ketersediaan yang tinggi dan berskala mendatar. 4) Kegigihan dan keselamatan data: Ketekunan data dicapai melalui RDB dan AOF untuk memastikan integriti dan kebolehpercayaan data. 5) Sokongan ekosistem dan komuniti yang luas: dengan ekosistem yang besar dan komuniti aktif,

Memahami NoSQL: Ciri Utama RedisMemahami NoSQL: Ciri Utama RedisApr 13, 2025 am 12:17 AM

Ciri -ciri utama Redis termasuk kelajuan, fleksibiliti dan sokongan struktur data yang kaya. 1) Kelajuan: Redis adalah pangkalan data dalam memori, dan membaca dan menulis operasi hampir seketika, sesuai untuk pengurusan cache dan sesi. 2) Fleksibiliti: Menyokong pelbagai struktur data, seperti rentetan, senarai, koleksi, dan lain -lain, yang sesuai untuk pemprosesan data yang kompleks. 3) Sokongan Struktur Data: Menyediakan rentetan, senarai, koleksi, jadual hash, dan lain -lain, yang sesuai untuk keperluan perniagaan yang berbeza.

Redis: Mengenal pasti fungsi utamanyaRedis: Mengenal pasti fungsi utamanyaApr 12, 2025 am 12:01 AM

Fungsi teras Redis adalah sistem penyimpanan dan pemprosesan data berprestasi tinggi. 1) Akses data berkelajuan tinggi: Redis menyimpan data dalam memori dan menyediakan kelajuan membaca dan menulis tahap mikrosecond. 2) Struktur Data Kaya: Menyokong rentetan, senarai, koleksi, dan lain -lain, dan menyesuaikan diri dengan pelbagai senario aplikasi. 3) Kegigihan: Data berterusan ke cakera melalui RDB dan AOF. 4) Menerbitkan langganan: boleh digunakan dalam beratur mesej atau sistem komunikasi masa nyata.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Dreamweaver Mac版

Dreamweaver Mac版

Alat pembangunan web visual

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

MinGW - GNU Minimalis untuk Windows

MinGW - GNU Minimalis untuk Windows

Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.