這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)redis的incr和hash應(yīng)用是怎樣的,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
為舒蘭等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及舒蘭網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、舒蘭網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
比如北京車(chē)牌采取先搶到后審批資質(zhì)的流程。車(chē)牌池子中有N多號(hào)碼,頁(yè)面呈現(xiàn)以一頁(yè)十條的方式展示,每個(gè)號(hào)碼后有一個(gè)搶的按鈕,且一個(gè)人只能搶一個(gè)車(chē)牌,同樣一個(gè)車(chē)牌只能被一個(gè)人搶到。業(yè)務(wù)模型參考(http://num.10010.com/NumApp/chseNumList/init?num=186)
if ($this->redis_db->incr("bj_".$car_no) != 1) { 讓別人先下手了,點(diǎn)別的去~ }else{ //搶到競(jìng)態(tài)條件,如果不復(fù)核資質(zhì)要求退出,并清除incr if(搶到了但是沒(méi)資質(zhì)等){ 釋放對(duì)此id的竟態(tài)權(quán),別占茅坑 $this->yredis_db->del("bj_".$id); }else{ 其他業(yè)務(wù)A 抱得號(hào)碼歸... 其他業(yè)務(wù)B } }
另外,incr
對(duì)string
類(lèi)型,hash
類(lèi)型,sortedSet
類(lèi)型都可以進(jìn)行操作
blpop
相對(duì)于lpop有一個(gè)好處,可以對(duì)多個(gè)隊(duì)列進(jìn)行優(yōu)先級(jí)操作。blpop
會(huì)按照key
的排列順序依次彈出,返回值為key
的listname及具體元素值,而且可以設(shè)置block
時(shí)間,原則是先阻塞先服務(wù).
$date = date('Ymd', time()); //左進(jìn)左出 ,優(yōu)先分配一般的車(chē)牌號(hào)碼,然后在分配非常好的連號(hào)號(hào)碼,設(shè)置一個(gè)阻塞時(shí)間 return $this->redis->blpop(self::$_config['dispatch_normal_list'] . $date, self::$_config['dispatch_better_list'] . $date, self::$_config['redis_block_l_pop_time_out']);
設(shè)置hash
中一個(gè)field
為指定value
,前提是field
不存在。如果存在,返回0。
這樣能保證在一個(gè)人只能搶一個(gè)車(chē)牌,但是搶到車(chē)牌執(zhí)行付款或者其他業(yè)務(wù)操作過(guò)程中,其他人無(wú)法對(duì)此操作,(即不能將此車(chē)牌綁定到其他人身上)。根據(jù)具體業(yè)務(wù)情況,可設(shè)置基于car_no的hash field和基于 people 的hash field。
hash_base_people {"zhangsan":"京A888","lisi":"京A999"} hash_base_car_no {"京A888":"zhangsan","京A999":"lisi"}
基于這兩個(gè)hash 可以做更多關(guān)于業(yè)務(wù)的操作,比如通過(guò)hget等查看具體的綁定關(guān)系。
有了通過(guò)hsetnx的綁定模型,當(dāng)某個(gè)人對(duì)某個(gè)車(chē)牌交付了訂金等一系列之后,就代表可以永遠(yuǎn)的將其消除,這樣會(huì)用到hdel。另外如果在指定時(shí)間內(nèi)沒(méi)有做比如交付訂金之類(lèi)的操作,這個(gè)車(chē)牌號(hào)碼會(huì)回爐到原始列表中。
//刪除以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);
如果有入口將北京可以搶拍的車(chē)牌放入到一個(gè)list里
$lpush_res = $redisObj->lpush($list_name, $car_no);
其中l(wèi)ist_name的值可以根據(jù)car_no的具體值來(lái)確定,比如有6和8的我就放入到better_car_no
列表里,其他的放入到normal_car_no
列表里,最后可以用blpop
來(lái)指定一個(gè)先后優(yōu)先級(jí)。
安全的隊(duì)列彈出模式,比如N多人對(duì)一個(gè)入口按鈕進(jìn)行操作,如果list結(jié)構(gòu)中有足夠的數(shù)據(jù),每個(gè)人有且只有一條數(shù)據(jù)會(huì)被領(lǐng)取,領(lǐng)取之后再做其他的業(yè)務(wù)操作。
但是問(wèn)題是,如果用lpop
之后,原隊(duì)列中已被彈出,如果中途客戶端在取得該pop
的元素后,且完成處理此元素前,客戶端發(fā)生崩潰。這時(shí)候此條消息就憑空消失了。如果沒(méi)有其他補(bǔ)助措施(比如通過(guò)綁定或者記錄此彈出的元素)需要嚴(yán)謹(jǐn)要求,可以用rpoplpus
h可以解決此問(wèn)題。在客戶端真正處理完此pop
的元素之后,通過(guò)lrem
將此消息安全刪除。
上述就是小編為大家分享的redis的incr和hash應(yīng)用是怎樣的了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。