redis的incr和hash應用

2021-09-14 07:04:02 字數 1949 閱讀 3359

if ($this->redis_db->incr("bj_".$car_no) != 1) elseelse

}

另外,incrstring型別,hash型別,sortedset型別都可以進行操作

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']);

設定hash中乙個field為指定value,前提是field不存在。如果存在,返回0。

這樣能保證在乙個人只能搶乙個車牌,但是搶到車牌執行付款或者其他業務操作過程中,其他人無法對此操作,(即不能將此車牌繫結到其他人身上)。根據具體業務情況,可設定基於car_no的hash field和基於 people 的hash field。

hash_base_people 

hash_base_car_no

基於這兩個hash 可以做更多關於業務的操作,比如通過hget等檢視具體的繫結關係。

有了通過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);

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

$lpush_res = $redisobj->lpush($list_name, $car_no);
其中list_name的值可以根據car_no的具體值來確定,比如有6和8的我就放入到better_car_no列表裡,其他的放入到normal_car_no列表裡,最後可以用blpop來指定乙個先後優先順序。

安全的佇列彈出模式,比如n多人對乙個入口按鈕進行操作,如果list結構中有足夠的資料,每個人有且只有一條資料會被領取,領取之後再做其他的業務操作。

但是問題是,如果用lpop之後,原佇列中已被彈出,如果中途客戶端在取得該pop的元素後,且完成處理此元素前,客戶端發生崩潰。這時候此條訊息就憑空消失了。如果沒有其他補助措施(比如通過繫結或者記錄此彈出的元素)需要嚴謹要求,可以用rpoplpush可以解決此問題。在客戶端真正處理完此pop的元素之後,通過lrem將此訊息安全刪除。

redis的hash和常用操作

redis在記憶體中儲存hash型別是以name對應乙個字典形式儲存的 hset name,key,value name對應的hash中設定乙個鍵值對 不存在,則建立 否則,修改 引數 name redis的name key key1對應的hash中的key value value1對應的hash中...

redis 的無序集合和hash操作

1 往集合新增資料 2 檢視集合所有元素 3 集合刪除操作 4 返回並刪除集合key中乙個隨機的元素 體現集合無序性 5 返回集合中乙個隨機的元素 6 判斷value是否在集合key中,存在返回1 不存在返回0 7 返回集合中的個數 8 把source 中的value 刪除,移動到desc集合中去 ...

Redis採用的Hash演算法

在redis中,採用bernstein的hash演算法,具體 如下 unsigned int dictgenhashfunction const unsigned char buf,int len 解釋 把字串轉化成乙個無符號32位int型別,範圍從 0x00000000u到 0xffffffu,但...