首頁 > 資料庫 > Redis > 解析redis的incr和hash應用

解析redis的incr和hash應用

藏色散人
發布: 2021-09-18 16:46:20
轉載
2881 人瀏覽過

incr

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

 if ($this->redis_db->incr("bj_".$car_no) != 1) {
      让别人先下手了,点别的去~
  }else{
       //抢到竞态条件,如果不复核资质要求退出,并清除incr
       if(抢到了但是没资质等){
         释放对此id的竟态权,别占茅坑
         $this->yredis_db->del("bj_".$id);
       }else{
         其他业务A
         抱得号码归...
         其他业务B
     }
}
登入後複製

另外,incrstring類型,hash類型,sortedSet類型都可以進行運算

blpop

blpop相對於lpop有一個好處,可以對多個佇列進行優先權操作。
blpop會依照key的排列順序依序彈出,傳回值為key的listname及具體元素值,而且可以設定block時間,原則是先阻塞先服務.

        $date = date('Ymd', time());
        //左进左出 ,优先分配一般的车牌号码,然后在分配非常好的连号号码,设置一个阻塞时间
        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。
這樣能保證在一個人只能搶一個車牌,但是搶到車牌執行付款或其他業務操作過程中,其他人無法對此操作,(即不能將此車牌綁定到其他人身上)。根據具體業務情況,可設定基於car_no的hash field和基於 people 的hash field。

hash_base_people {"zhangsan":"京A888","lisi":"京A999"}
hash_base_car_no {"京A888":"zhangsan","京A999":"lisi"}
登入後複製

基於這兩個hash 可以做更多關於業務的操作,例如透過hget等查看具體的綁定關係。

hdel

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

 //删除以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);
登入後複製

其中list_name的值可以根據car_no的具體值來確定,例如有6和8的我就放入到better_car_no列表裡,其他的放入到normal_car_no列表裡,最後可以用blpop#來指定一個先後優先級。

rpoplpush

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

推薦學習:《redis影片教學

#

以上是解析redis的incr和hash應用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:segmentfault.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板