Cara menggunakan Redis dan Haskell untuk melaksanakan fungsi pengehadan sumber
Dalam aplikasi rangkaian moden, pengurusan dan pengehadan sumber adalah sangat penting. Had sumber memastikan kestabilan pelayan dan mencegah penyalahgunaan dan tingkah laku berniat jahat. Artikel ini akan memperkenalkan cara menggunakan Redis dan Haskell untuk melaksanakan fungsi had sumber dan menyediakan contoh kod khusus.
Redis ialah pangkalan data storan nilai kunci berprestasi tinggi yang menyokong pelbagai struktur data. Ia menyediakan pelbagai fungsi, termasuk penyimpanan, pengiraan, tamat tempoh dan banyak lagi. Dalam fungsi had sumber, kami akan menggunakan fungsi pengiraan dan tamat tempoh Redis.
Haskell ialah bahasa pengaturcaraan yang berfungsi semata-mata dengan sistem jenis berkuasa dan keupayaan komposisi fungsi yang kaya. Kami akan menggunakan Haskell untuk menulis logik sisi pelayan untuk berinteraksi dengan Redis.
Terdapat banyak cara untuk melaksanakan fungsi had sumber Di bawah kami akan memperkenalkan kaedah berdasarkan pembilang dan tetingkap masa.
3.1 Kaunter
Kaunter ialah alat asas untuk melaksanakan pengehadan sumber. Kita boleh menggunakan arahan INCR Redis untuk melaksanakan operasi balas pada kunci. Berikut ialah contoh kod:
import Database.Redis incrementCounter :: Connection -> ByteString -> IO Integer incrementCounter conn key = runRedis conn $ do res <- incr key case res of Right n -> return n Left _ -> return 0
Kod ini mula-mula bersambung ke pelayan Redis, dan kemudian menggunakan perintah incr untuk menambah kunci yang ditentukan. Jika kunci tidak wujud, ia dibuat secara automatik dan nilai dimulakan kepada 0.
3.2 Tetingkap Masa
Tetingkap masa ialah julat masa yang mengehadkan penggunaan sumber. Sebagai contoh, kita boleh menetapkan tetingkap masa kepada 1 minit, yang bermaksud bahawa pengguna hanya boleh mengakses sumber tertentu beberapa kali dalam 1 minit. Berikut ialah contoh kod:
import Data.Time.Clock.POSIX import Database.Redis withinTimeWindow :: Connection -> ByteString -> Integer -> Integer -> IO Bool withinTimeWindow conn key limit window = do timestamp <- round . (* 1000) <$> getPOSIXTime runRedis conn $ do res <- zadd key [(fromIntegral timestamp, "")] -- Add a timestamp to the sorted set case res of Right _ -> do _ <- zremrangebyscore key 0 (fromIntegral (timestamp - window * 1000)) -- Remove old timestamps x <- zcount key (fromIntegral timestamp) (fromIntegral (timestamp + 1)) -- Count the number of timestamps within the window return (x <= limit) Left _ -> return False
Kod ini mula-mula mendapat cap masa semasa dan menukarkannya kepada milisaat. Kemudian gunakan perintah zadd untuk menambah cap masa pada set yang diisih, gunakan perintah zremrangebyscore untuk memadam cap masa lama dan gunakan perintah zcount untuk mengira bilangan cap masa dalam tetingkap. Akhir sekali, semak sama ada bilangan cap masa kurang daripada atau sama dengan nombor had.
Kini kita boleh menggunakan dua fungsi di atas untuk melaksanakan aplikasi sekatan sumber yang mudah.
Katakan kita ingin mengehadkan pengguna untuk menghantar 100 mesej sahaja dalam 1 minit. Anda boleh menggunakan kod berikut:
import Control.Monad import Data.ByteString.Char8 (pack) import Database.Redis main :: IO () main = do conn <- connect defaultConnectInfo replicateM_ 200 $ do count <- incrementCounter conn "user1" within <- withinTimeWindow conn "user1" 100 60 if count <= 100 && within then putStrLn "Allow" else putStrLn "Reject"
Kod ini mula-mula bersambung ke pelayan Redis, dan kemudian menggunakan fungsi replicateM_ untuk mensimulasikan pengguna menghantar 200 mesej. Setiap kali mesej dihantar, kaunter dinaikkan dahulu, dan kemudian ia dinilai sama ada ia berada dalam tetingkap masa dan tidak melebihi had Jika ya, mesej itu dibenarkan untuk dihantar, jika tidak ia ditolak untuk dihantar .
Artikel ini memperkenalkan cara menggunakan Redis dan Haskell untuk melaksanakan fungsi pengehadan sumber. Melalui kaedah kaunter dan tetingkap masa, penggunaan sumber boleh dikawal dengan berkesan untuk memastikan kestabilan pelayan. Dalam aplikasi praktikal, ia boleh dilaraskan dan dikembangkan secara fleksibel mengikut keperluan khusus.
Atas ialah kandungan terperinci Cara menggunakan Redis dan Haskell untuk melaksanakan fungsi had sumber. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!