溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

redis的incr和hash應用是怎樣的

發(fā)布時間:2021-09-24 10:51:53 來源:億速云 閱讀:472 作者:柒染 欄目:關(guān)系型數(shù)據(jù)庫

這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)redis的incr和hash應用是怎樣的,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

incr

比如北京車牌采取先搶到后審批資質(zhì)的流程。車牌池子中有N多號碼,頁面呈現(xiàn)以一頁十條的方式展示,每個號碼后有一個搶的按鈕,且一個人只能搶一個車牌,同樣一個車牌只能被一個人搶到。業(yè)務模型參考(http://num.10010.com/NumApp/chseNumList/init?num=186)

<!-- more -->

 if ($this->redis_db->incr("bj_".$car_no) != 1) {
      讓別人先下手了,點別的去~
  }else{
       //搶到競態(tài)條件,如果不復核資質(zhì)要求退出,并清除incr
       if(搶到了但是沒資質(zhì)等){
         釋放對此id的竟態(tài)權(quán),別占茅坑
         $this->yredis_db->del("bj_".$id);
       }else{
         其他業(yè)務A
         抱得號碼歸...
         其他業(yè)務B
     }
}

另外,incrstring類型,hash類型,sortedSet類型都可以進行操作

blpop

blpop相對于lpop有一個好處,可以對多個隊列進行優(yōu)先級操作。
blpop會按照key的排列順序依次彈出,返回值為key的listname及具體元素值,而且可以設置block時間,原則是先阻塞先服務.

        $date = date('Ymd', time());
        //左進左出 ,優(yōu)先分配一般的車牌號碼,然后在分配非常好的連號號碼,設置一個阻塞時間
        return $this->redis->blpop(self::$_config['dispatch_normal_list'] . $date, self::$_config['dispatch_better_list'] . $date, self::$_config['redis_block_l_pop_time_out']);

hsetnx

設置hash中一個field為指定value,前提是field不存在。如果存在,返回0。
這樣能保證在一個人只能搶一個車牌,但是搶到車牌執(zhí)行付款或者其他業(yè)務操作過程中,其他人無法對此操作,(即不能將此車牌綁定到其他人身上)。根據(jù)具體業(yè)務情況,可設置基于car_no的hash field和基于 people 的hash field。

hash_base_people {"zhangsan":"京A888","lisi":"京A999"}
hash_base_car_no {"京A888":"zhangsan","京A999":"lisi"}

基于這兩個hash 可以做更多關(guān)于業(yè)務的操作,比如通過hget等查看具體的綁定關(guān)系。

hdel

有了通過hsetnx的綁定模型,當某個人對某個車牌交付了訂金等一系列之后,就代表可以永遠的將其消除,這樣會用到hdel。另外如果在指定時間內(nèi)沒有做比如交付訂金之類的操作,這個車牌號碼會回爐到原始列表中。

 //刪除以people_id為key的hash
 $base_people_id_del = $this->redis->hdel(self::$_config['hash_base_people'], $people_id);

 //刪除以car_no為key的hash
 $base_car_no_del = $this->redis->hdel(self::$_config['hash_base_car_no'], $clue_id);

lpush

如果有入口將北京可以搶拍的車牌放入到一個list里

$lpush_res = $redisObj->lpush($list_name, $car_no);

其中l(wèi)ist_name的值可以根據(jù)car_no的具體值來確定,比如有6和8的我就放入到better_car_no列表里,其他的放入到normal_car_no列表里,最后可以用blpop來指定一個先后優(yōu)先級。

rpoplpush

安全的隊列彈出模式,比如N多人對一個入口按鈕進行操作,如果list結(jié)構(gòu)中有足夠的數(shù)據(jù),每個人有且只有一條數(shù)據(jù)會被領(lǐng)取,領(lǐng)取之后再做其他的業(yè)務操作。
但是問題是,如果用lpop之后,原隊列中已被彈出,如果中途客戶端在取得該pop的元素后,且完成處理此元素前,客戶端發(fā)生崩潰。這時候此條消息就憑空消失了。如果沒有其他補助措施(比如通過綁定或者記錄此彈出的元素)需要嚴謹要求,可以用rpoplpush可以解決此問題。在客戶端真正處理完此pop的元素之后,通過lrem將此消息安全刪除。

上述就是小編為大家分享的redis的incr和hash應用是怎樣的了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI