基于 Redis 的優(yōu)先級(jí)隊(duì)列

問題

如何使用 Redis 實(shí)現(xiàn)一個(gè)優(yōu)先級(jí)隊(duì)列呢辆脸?

sorted set 簡介

Sorted set 是 Redis 提供的一種數(shù)據(jù)結(jié)構(gòu)類型铃将,兼具 set 和 hash 的特點(diǎn)瞬浓。首先,sorted set 中的每個(gè)元素是唯一的牢撼;其次淮逻,sorted set 中的每個(gè)元素都關(guān)聯(lián)一個(gè)浮點(diǎn)值(叫做 score)。除此之外皱埠,sorted set 中的元素是有序的肮帐,這些元素依照如下規(guī)則排序:

  • 如果A和B是兩個(gè) score 不一樣的元素,則當(dāng)且僅當(dāng) A.score > B.score 的時(shí)候边器,A > B
  • 如果A和B的 score 一樣训枢,則當(dāng)且僅當(dāng)A的字典序大于B的時(shí)候,A > B

sorted set 操作

  • ZADD:向 sorted set 中添加元素
  • ZCOUNT: sorted set 中 score 等于指定值的元素有多少個(gè)
  • ZSCORE:sorted set 中指定元素的 score 是多少
  • ZCARD: sorted set 中總共有多少個(gè)元素
  • ZREM:刪除 sorted set 中的指定元素
  • ZREVRANGE:按照從大到小的順序返回指定索引區(qū)間內(nèi)的元素
  • ZRANGE: 按照從小到大的順序返回指定索引區(qū)間內(nèi)的元素

sorted set 支持的操作還有很多忘巧,上面只是列舉了一些對(duì)實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列有用的操作恒界。

優(yōu)先級(jí)隊(duì)列實(shí)現(xiàn)

基于 sorted set,可以實(shí)現(xiàn)一個(gè)簡單的優(yōu)先級(jí)隊(duì)列砚嘴。代碼如下:

class PriorityQueue(object):

    def __init__(self, redis_client, queue, namespace='priority-queue'):
        self.client = redis_client
        self.key = '%s:%s' % (namespace, queue)

    def enqueue(self, score, member):
        return self.client.zadd(self.key, score, member)

    def dequeue(self):
        """注意:該方法不是線程安全的"""
        score = None
        member = None
        result = self.client.zrevrange(self.key, 0, 0, withscores=True)
        # [( member, score), (member, score), ...]
        if result:
            member, score = result[0]
            ret = self.client.zrem(self.key, member)
            assert ret == 1
        return score, member

    def card(self):
        return self.client.zcard(self.key)

    def __repr__(self):
        return u"PriorityQueue<%s>" % self.key

優(yōu)先級(jí)隊(duì)列主要操作是入隊(duì)和出隊(duì)十酣,sorted set 根據(jù)元素的 score 維護(hù)了優(yōu)先級(jí)順序涩拙。需要注意的是,上述代碼中的出隊(duì)操作不是線程安全的耸采,因?yàn)槿?yōu)先級(jí)最高的元素以及刪除這個(gè)元素是兩次操作兴泥,不是原子性的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末虾宇,一起剝皮案震驚了整個(gè)濱河市搓彻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嘱朽,老刑警劉巖旭贬,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異燥翅,居然都是意外死亡骑篙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門森书,熙熙樓的掌柜王于貴愁眉苦臉地迎上來靶端,“玉大人,你說我怎么就攤上這事凛膏⊙蠲” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵猖毫,是天一觀的道長台谍。 經(jīng)常有香客問我,道長吁断,這世上最難降的妖魔是什么趁蕊? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮仔役,結(jié)果婚禮上掷伙,老公的妹妹穿的比我還像新娘。我一直安慰自己又兵,他們只是感情好任柜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沛厨,像睡著了一般宙地。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逆皮,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天宅粥,我揣著相機(jī)與錄音,去河邊找鬼页屠。 笑死粹胯,一個(gè)胖子當(dāng)著我的面吹牛蓖柔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播风纠,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼况鸣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了竹观?” 一聲冷哼從身側(cè)響起镐捧,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎臭增,沒想到半個(gè)月后懂酱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡誊抛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年列牺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拗窃。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瞎领,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出随夸,到底是詐尸還是另有隱情九默,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布宾毒,位于F島的核電站驼修,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏诈铛。R本人自食惡果不足惜乙各,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望幢竹。 院中可真熱鬧觅丰,春花似錦、人聲如沸妨退。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咬荷。三九已至,卻和暖如春轻掩,著一層夾襖步出監(jiān)牢的瞬間幸乒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國打工唇牧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留罕扎,地道東北人聚唐。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像腔召,于是被迫代替她去往敵國和親杆查。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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

  • 本文將從Redis的基本特性入手,通過講述Redis的數(shù)據(jù)結(jié)構(gòu)和主要命令對(duì)Redis的基本能力進(jìn)行直觀介紹浊仆。之后概...
    kelgon閱讀 61,133評(píng)論 23 626
  • 1-概覽 Redis是典型的Key-Value類型數(shù)據(jù)庫客峭,Key為字符類型,Value的類型常用的為五種類型:St...
    zhanglbjames閱讀 17,123評(píng)論 1 9
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理抡柿,服務(wù)發(fā)現(xiàn)舔琅,斷路器,智...
    卡卡羅2017閱讀 134,637評(píng)論 18 139
  • 友人問:如何讓文筆風(fēng)趣幽默洲劣? 答曰: 這個(gè)問題讓人很為難备蚓,如果這篇“答友人問”本身寫得不夠風(fēng)趣幽默,我還有什么資格...
    蘭川閱讀 1,095評(píng)論 0 5
  • 連續(xù)一周闪檬,夜夜夢魘星著。夢里面總能看到許多熟悉的身影,老同學(xué)粗悯、老同事虚循、做題、開會(huì)討論样傍,還有你横缔;你來你走不說一句話,但是...
    afterall閱讀 216評(píng)論 0 1