常用lua 腳本(操作redis)

這里記錄一下工作中常用的lua腳本
主要是用來操作redis,保證多個命令原子性

分布式鎖

主要是用來保證同一個資源在多個服務(wù)中也能保證唯一性的操作
這里加鎖主要是利用setnx 命令咽袜,保證唯一key只能被一個服務(wù)設(shè)置成功宣蔚,并且為了防止出現(xiàn)不能釋放鎖的問題养涮,所以設(shè)置一個過期時間,當(dāng)然如果redis版本比較的高的話蒿赢,一個命令也能支持了
解鎖主要是先get 保證自己仍然持有這把鎖,然后delete釋放這把鎖毛嫉,保證原子性即可

//加鎖解鎖 start

    //lock script
    private static final String lockScript = " if redis.call('setnx',KEYS[1],ARGV[1]) == 1 " +
            " then redis.call('expire',KEYS[1],ARGV[2]) " +
            " return 1 " +
            " else return 0 end ";

    /**
     * 加鎖
     * @param key
     * @param value
     * @param second 鎖過期時間
     * @return
     */
    public boolean lock(String key,String value,Long second){
        DefaultRedisScript<Boolean> script = new DefaultRedisScript<>();
        script.setScriptText(lockScript);
        script.setResultType(Boolean.class);
        return stringRedisTemplate.execute(script,Collections.singletonList(key),value,second+"");
    }


    //unlock script
    private static final String unlockScript = " if redis.call('get',KEYS[1]) == ARGV[1] " +
                            " then return redis.call('del',KEYS[1]) " +
                            " else return 0 end ";


    /**
     * 解鎖
     * @param key
     * @param value
     * @return
     */
    public boolean unlock(String key,String value){
        DefaultRedisScript<Boolean> script = new DefaultRedisScript<>();
        script.setScriptText(unlockScript);
        script.setResultType(Boolean.class);
        return stringRedisTemplate.execute(script,Collections.singletonList(key),value);
    }

接口限流

接口限流有很多方案雌桑,
1,從配置上來說务荆,可以在網(wǎng)關(guān)層做妆距,比如ng的配置,也可以在web服務(wù)器上做函匕,比如tomcat的相關(guān)配置
2毅厚,從算法來說,比如令牌浦箱,漏桶等等
這里咱們的需求是針對分布式環(huán)境下吸耿,單個用戶對某個接口的訪問進行限流
需求:對某接口每分鐘請求數(shù)不超過60次(單個用戶60Qps)
這里我們簡單一點,使用redis的zset
偽代碼如下:
以用戶id為key,每次請求先判斷指定時間范圍內(nèi)改用戶的請求記錄 (zcount min max)酷窥,如果大于等于60咽安,則直接return掉;如果小于60,則 zadd key value 當(dāng)前時間戳
這里只要將這兩步操縱合并到同一個腳本中即可蓬推。
代碼如下:

private static final String scripts = "if redis.call('zcount',KEYS[1],ARGV[1],ARGV[2] ) < tonumber(ARGV[3])  " +
            "then return redis.call('zadd',KEYS[1],ARGV[4],ARGV[5])  " +
            "else return 0  " +
            "end";

    /**
     * 
     * @param userKey
     * @param min
     * @param max
     * @param maxV
     * @param value
     * @param score
     * @return
     */
    public boolean getToken(String userKey,String min,String max,String maxV,String value,String score){
        DefaultRedisScript<Boolean> script = new DefaultRedisScript<>();
        script.setScriptText(scripts);
        script.setResultType(Boolean.class);
        return  stringRedisTemplate.execute(script,Collections.singletonList(userKey),min,max,maxV,value,score);
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妆棒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子沸伏,更是在濱河造成了極大的恐慌糕珊,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毅糟,死亡現(xiàn)場離奇詭異红选,居然都是意外死亡,警方通過查閱死者的電腦和手機姆另,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門喇肋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人迹辐,你說我怎么就攤上這事蝶防。” “怎么了明吩?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵间学,是天一觀的道長。 經(jīng)常有香客問我印荔,道長低葫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任躏鱼,我火速辦了婚禮氮采,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘染苛。我一直安慰自己鹊漠,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布茶行。 她就那樣靜靜地躺著躯概,像睡著了一般。 火紅的嫁衣襯著肌膚如雪畔师。 梳的紋絲不亂的頭發(fā)上娶靡,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機與錄音看锉,去河邊找鬼姿锭。 笑死塔鳍,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的呻此。 我是一名探鬼主播轮纫,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼焚鲜!你這毒婦竟也來了掌唾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤忿磅,失蹤者是張志新(化名)和其女友劉穎糯彬,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體葱她,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡撩扒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了览效。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片却舀。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖锤灿,靈堂內(nèi)的尸體忽然破棺而出挽拔,到底是詐尸還是另有隱情,我是刑警寧澤但校,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布螃诅,位于F島的核電站,受9級特大地震影響状囱,放射性物質(zhì)發(fā)生泄漏术裸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一亭枷、第九天 我趴在偏房一處隱蔽的房頂上張望袭艺。 院中可真熱鬧,春花似錦叨粘、人聲如沸猾编。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽答倡。三九已至,卻和暖如春驴党,著一層夾襖步出監(jiān)牢的瞬間瘪撇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留倔既,地道東北人恕曲。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像叉存,于是被迫代替她去往敵國和親码俩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容