Rumah  >  Artikel  >  pangkalan data  >  Cara menggunakan Redis dan Haskell untuk melaksanakan fungsi had sumber

Cara menggunakan Redis dan Haskell untuk melaksanakan fungsi had sumber

WBOY
WBOYasal
2023-09-21 14:03:401269semak imbas

Cara menggunakan Redis dan Haskell untuk melaksanakan fungsi had sumber

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.

  1. Pengenalan kepada Redis

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.

  1. Pengenalan kepada Haskell

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.

  1. Pelaksanaan fungsi had sumber

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.

  1. Aplikasi Contoh

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 .

  1. Ringkasan

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!

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