PHP Redis menyelesaikan masalah praktikal pengehadan aliran pesanan

藏色散人
Lepaskan: 2023-04-10 15:52:01
ke hadapan
3461 orang telah melayarinya

1. Setiap keluaran siri artikel ini akan menyelesaikan masalah Redis yang praktikal
2. Soalan bagi setiap isu akan dipilih daripada komen setiap isu
3 Redis berkaitan. Untuk pertanyaan lain, sila hubungi saya Jika anda berminat, saya tidak akan menolak untuk memulakan siri baru
4. Saya sering menggunakan PHP, jadi penyelesaiannya adalah terutamanya PHP
5. Jika tiada soalan yang sesuai dalam komen, saya akan buat soalan saya sendiri

Penerangan masalah:

Ini adalah isu pertama, jadi saya hanya boleh buat soalan saya sendiri

Bagaimana cara menggunakan Redis untuk mengehadkan aliran pesanan Contohnya, N akses dibenarkan setiap M saat

Penyelesaian:

🎜>
<?php

    /**
     * 是否允许放行
     * @param string $key       redis键前缀
     * @param int $timeInterval 时间间隔(秒)
     * @param int $max          时间间隔内最大放行数
     * @return bool             是否放行
     * @throws Exception
     * @example
     * <pre class="brush:php;toolbar:false">
     * //每秒放行一个
     * isAllow('my_allow');
     *
     * //每秒放行3个
     * isAllow('my_allow',1,3);
     *
     * //每3秒放行2个
     * isAllow('my_allow',3,2);
     */
    function isAllow(string $key, int $timeInterval=1, int $max=1):bool{
        if($timeInterval<1){
            throw new Exception(&#39;时间间隔必须大于0&#39;);
        }
        if($max<1){
            throw new Exception(&#39;最大放行数必须大于0&#39;);
        }

        $redis=new Redis();
        $redis->connect('192.168.31.187');
        if(!$redis->isConnected()){
            throw new Exception('Redis服务连接失败');
        }

        //对时间戳取模,使得每$timeInterval秒取得同一个时间戳
        $time=time();
        $key.=':'.($time-($time%$timeInterval));

        //自增并返回自增后的结果
        $index=$redis->incr($key);

        //如果是第一个访问,设置键的过期时间
        if($index===1){
            $redis->expire($key,$timeInterval+1);
        }

        return $index<$max+1;
    }
Salin selepas log masuk
Tafsiran kod:

  • Ambil Modul masa, supaya nama kunci dikemas kini setiap $timeInterval saat

  • incr( ) kaedah menambah nilai kunci secara automatik Jika kunci tidak wujud, ia akan membuat kunci dengan nilai 0 dan kemudian menambahnya

  • Mengikut prinsip daripada kenaikan automatik, nilai yang dikembalikan oleh kenaikan automatik ke-N di bawah nama kunci yang sama ialah N

  • Nama kunci dikemas kini setiap $timeInterval saat Sekali, jadi kunci tidak lagi mempunyai nilai selepas 1 saat $timeInterval mencipta kunci

Di atas, semua orang dialu-alukan untuk bertanya, membetulkan ralat, menambah dan mengoptimumkan.

Disyorkan: "

Tutorial Video PHP"

Atas ialah kandungan terperinci PHP Redis menyelesaikan masalah praktikal pengehadan aliran pesanan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:learnku.com
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan