成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Redis原子計數(shù)器incr如何防止并發(fā)請求

這篇文章將為大家詳細(xì)講解有關(guān)redis原子計數(shù)器incr如何防止并發(fā)請求,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

成都創(chuàng)新互聯(lián)是一家專注于成都做網(wǎng)站、成都網(wǎng)站建設(shè)與策劃設(shè)計,莆田網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:莆田等地區(qū)。莆田做網(wǎng)站價格咨詢:13518219792

一、前言

在一些對高并發(fā)請求有限制的系統(tǒng)或者功能里,比如說秒殺活動,或者一些網(wǎng)站返回的當(dāng)前用戶過多,請稍后嘗試。這些都是通過對同一時刻請求數(shù)量進(jìn)行了限制,一般用作對后臺系統(tǒng)的保護(hù),防止系統(tǒng)因為過大的流量沖擊而崩潰。對于系統(tǒng)崩潰帶來的后果,顯然還是拒絕一部分請求更能被維護(hù)者所接受。
而在各種限流中,除了系統(tǒng)自身設(shè)計的帶鎖機(jī)制的計數(shù)器外,利用Redis實現(xiàn)顯然是一種既高效安全又便捷方便的方式。

二、incr命令

Redis Incr 命令將 key 中儲存的數(shù)字值增一。
如果 key 不存在,那么 key 的值會先被初始化為 0 ,然后再執(zhí)行 INCR 操作。
如果值包含錯誤的類型,或字符串類型的值不能表示為數(shù)字,那么返回一個錯誤。
本操作的值限制在 64 位(bit)有符號數(shù)字表示之內(nèi)。
示例:

127.0.0.1:6379> set num 10
OK
127.0.0.1:6379> incr num
(integer) 11
127.0.0.1:6379> get num    # 數(shù)字值在 Redis 中以字符串的形式保存
"11"

注意: 由于redis并沒有一個明確的類型來表示整型數(shù)據(jù),所以這個操作是一個字符串操作。

執(zhí)行這個操作的時候,key對應(yīng)存儲的字符串被解析為10進(jìn)制的64位有符號整型數(shù)據(jù)。
事實上,Redis 內(nèi)部采用整數(shù)形式(Integer representation)來存儲對應(yīng)的整數(shù)值,所以對該類字符串值實際上是用整數(shù)保存,也就不存在存儲整數(shù)的字符串表示(String representation)所帶來的額外消耗。

三、使用場景

1.計數(shù)器

使用思路是:每次有相關(guān)操作的時候,就向Redis服務(wù)器發(fā)送一個incr命令。
例如這樣一個場景:我們有一個web應(yīng)用,我們想記錄每個用戶每天訪問這個網(wǎng)站的次數(shù)。
web應(yīng)用只需要通過拼接用戶id和代表當(dāng)前時間的字符串作為key,每次用戶訪問這個頁面的時候?qū)@個key執(zhí)行一下incr命令。

這個場景可以有很多種擴(kuò)展方法:
通過結(jié)合使用INCR和EXPIRE命令,可以實現(xiàn)一個只記錄用戶在指定間隔時間內(nèi)的訪問次數(shù)的計數(shù)器
客戶端可以通過GETSET命令獲取當(dāng)前計數(shù)器的值并且重置為0
通過類似于DECR或者INCRBY等原子遞增/遞減的命令,可以根據(jù)用戶的操作來增加或者減少某些值 比如在線游戲,需要對用戶的游戲分?jǐn)?shù)進(jìn)行實時控制,分?jǐn)?shù)可能增加也可能減少。

2.限速器

限速器是一種可以限制某些操作執(zhí)行速率的特殊場景。
傳統(tǒng)的例子就是限制某個公共api的請求數(shù)目。
假設(shè)我們要解決如下問題:限制某個api每秒每個ip的請求次數(shù)不超過10次。
我們可以通過incr命令來實現(xiàn)兩種方法解決這個問題。

四、流量控制之java實現(xiàn)

這里我們將在java中使用redis-incr的特性來構(gòu)建一個1分鐘內(nèi)只允許 請求100次的控制代碼,key代表在redis內(nèi)存放的被控制的鍵值。

public static boolean flowControl(String key){
        //最大允許100
        int max = 100;
        long total = 1L;
        try {
            if (jedisInstance.get(key) == null) {
                //jedisInstance是Jedis連接實例,可以使單鏈接也可以使用鏈接池獲取,實現(xiàn)方式請參考之前的blog內(nèi)容
                //如果redis目前沒有這個key,創(chuàng)建并賦予0,有效時間為60s
                jedisInstance.setex(key, 60, "0");
            } else {
                //獲取加1后的值
                total = jedisInstance.incr(redisKey).longValue();
                //Redis TTL命令以秒為單位返回key的剩余過期時間。當(dāng)key不存在時,返回-2。當(dāng)key存在但沒有設(shè)置剩余生存時間時,返回-1。否則,以秒為單位,返回key的剩余生存時間。
                if (jedisInstance.ttl(redisKey).longValue() == -1L)
                {
                    //為給定key設(shè)置生存時間,當(dāng)key過期時(生存時間為0),它會被自動刪除。
                    jedisInstance.expire(redisKey, 60);
                }
            }
        } catch (Exception e) {
            logger.error("流量控制組件:執(zhí)行計數(shù)操作失敗,無法執(zhí)行計數(shù)");
        }
        long keytotaltransations = max;
        //判斷是否已超過最大值,超過則返回false
        if (total > keytotaltransations) {
            return false;
        }
        return true;
    }

關(guān)于Redis原子計數(shù)器incr如何防止并發(fā)請求就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

分享名稱:Redis原子計數(shù)器incr如何防止并發(fā)請求
網(wǎng)站URL:http://jinyejixie.com/article44/iieoee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、ChatGPT、小程序開發(fā)、做網(wǎng)站、品牌網(wǎng)站設(shè)計、定制開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)
福泉市| 华容县| 鄂州市| 沐川县| 绥中县| 庆阳市| 诏安县| 水富县| 洛浦县| 砚山县| 攀枝花市| 卓资县| 安国市| 土默特右旗| 泸西县| 高清| 泾川县| 江华| 察雅县| 临颍县| 西乌珠穆沁旗| 罗田县| 肇东市| 宁河县| 韶关市| 金平| 宜州市| 和林格尔县| 黑水县| 疏勒县| 额济纳旗| 安塞县| 桓仁| 灵寿县| 锡林浩特市| 喀什市| 清水河县| 连平县| 都江堰市| 浦江县| 绍兴市|