Rumah >pembangunan bahagian belakang >tutorial php >PHP Redis menyelesaikan masalah praktikal pengehadan aliran pesanan

PHP Redis menyelesaikan masalah praktikal pengehadan aliran pesanan

藏色散人
藏色散人ke hadapan
2021-08-23 14:52:513502semak imbas

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;
    }
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!

Kenyataan:
Artikel ini dikembalikan pada:learnku.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam