日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

玩轉(zhuǎn)Redis-使用有序集合(sorted sets)實(shí)現(xiàn)投票游戲

張康康 ? 2018-09-26 12:40 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

極鏈科技Video++:劉偉

整理:包包

redis是一種提供多種數(shù)據(jù)類型的開(kāi)源key-value存儲(chǔ)系統(tǒng),通常將數(shù)據(jù)全部存儲(chǔ)在內(nèi)存中。


redis是目前最受歡迎的key-value存儲(chǔ)系統(tǒng),是基于內(nèi)存存儲(chǔ)kv的數(shù)據(jù)庫(kù),合理的使用redis作為緩存,可以極大的改善系統(tǒng)的性能和服務(wù)器請(qǐng)求響應(yīng)時(shí)間。

redis除了基本的kv存儲(chǔ)以外,還實(shí)現(xiàn)了哈希(Map), 列表(list), 集合(sets) 和有序集合(sorted sets)等數(shù)據(jù)類型;結(jié)合內(nèi)存和數(shù)據(jù)結(jié)構(gòu)的特性,在業(yè)務(wù)功能實(shí)現(xiàn)的過(guò)程中,可以更靈活的實(shí)現(xiàn)很多特性。

今天介紹的是有序集合這種數(shù)據(jù)結(jié)構(gòu),我們?cè)趯?shí)際的業(yè)務(wù)過(guò)程中使用了有序集合,并且收獲到一些有價(jià)值的經(jīng)驗(yàn)。

什么是有序集合

在redis提供的數(shù)據(jù)類型中,有集合(Set)和有序集合(Sorted Set),在集合中不能添加重復(fù)的元素,相同值的元素只能有一個(gè);而有序集合可以給每個(gè)元素設(shè)置一個(gè)double類型的分?jǐn)?shù),通過(guò)這個(gè)值,redis能為集合中的成員進(jìn)行從小到大的排序。


在redis中,有序集合的實(shí)現(xiàn),使用的是一種叫[skiplist]數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)可以讓get、set、add和remove等操作的預(yù)期時(shí)間達(dá)到O(log N),具體的原理,有興趣可以自己了解。

有序集合提供了豐富的操作,可以在很多應(yīng)用場(chǎng)景應(yīng)用。

* zunionstore 是求兩個(gè)有序集合的并集,可以用來(lái)合并兩個(gè)投票中所有參與的人的排行榜。

* zinterstore 是求兩個(gè)集合的交集,通過(guò)它,可以獲得同時(shí)參加多個(gè)候選人投票的名單列表。

* zrevrank 方便的查詢某個(gè)元素在有序集合中的位置,也就是投票的排名。

* zscore 用來(lái)查詢某個(gè)元素在集合中的分

* zrevrank 返回某個(gè)元素在集合中的位置

* zrevrangebyscore 獲取某個(gè)分?jǐn)?shù)區(qū)間內(nèi)元素的排行榜

有序集合提供了從小到大和從大到小兩種排行榜,其中有rev的命令,返回的是從大到小的集合。

設(shè)計(jì)投票游戲

之所以會(huì)在投票游戲中選用redis,主要考慮高并發(fā)的支持,在實(shí)際應(yīng)用的場(chǎng)景中,因?yàn)橥镀钡臅r(shí)候可能有很高的并發(fā)投票和實(shí)時(shí)投票結(jié)果查詢,如果所有操作都直接操作數(shù)據(jù)庫(kù),那么會(huì)對(duì)數(shù)據(jù)庫(kù)造成較大的負(fù)載。經(jīng)過(guò)考察技術(shù)方案和實(shí)現(xiàn)成本,決定采用redis提供的有序集合,實(shí)現(xiàn)投票過(guò)程和實(shí)時(shí)排名的展示,直接讀取緩存,避免了非核心業(yè)務(wù)對(duì)數(shù)據(jù)庫(kù)的突發(fā)高并發(fā)訪問(wèn)。

投票游戲的用戶故事

1. 創(chuàng)建投票的候選人

2. 創(chuàng)建用戶

3. 用戶參加活動(dòng),獲得一定數(shù)量的投票額度

4. 用戶使用投票額度為候選人投票

5. 候選人查看為自己投票的用戶的計(jì)票排名

6. 所有人查看實(shí)時(shí)的候選人選票排名

游戲流程


首先是可以有管理員,創(chuàng)建候選人和用戶,或者候選人和用戶自己注冊(cè),這個(gè)取決于具體的場(chǎng)景的需要。本次demo提供的接口是用戶和候選人自己注冊(cè)的模式。存儲(chǔ)用戶和候選人信息,最簡(jiǎn)單實(shí)現(xiàn)可以用redis的字符串類型key/value,本身就是hash,也可以使用redis提供的hash類型。

創(chuàng)建用戶以后,為用戶分配投票額度是要做的工作,通過(guò)redis的字符串類型,INCR實(shí)現(xiàn),可以保證操作的原子性。投票過(guò)程同樣在這個(gè)數(shù)據(jù)結(jié)構(gòu)上減去一定的值,但是為了防止并發(fā)情況下,用戶使用超過(guò)自己擁有的額度,需要設(shè)計(jì)一個(gè)鎖,只有在獲得鎖之后,才能做DECR操作。

投票扣減用戶的額度之后,就可以操作核心數(shù)據(jù)結(jié)構(gòu),有序集合。第一步是為特定的候選人增加上獲得的投票,這個(gè)是所有候選人的id作為鍵的有序集合,分?jǐn)?shù)就是獲得的總票數(shù);同時(shí)在用戶針對(duì)這名候選人的投票記錄上,也記錄每個(gè)用戶為同一個(gè)候選人投票的排名。

實(shí)現(xiàn)上面的操作之后,獲得實(shí)時(shí)投票排名,就是一件很輕松的工作。有序集合提供的操作可以簡(jiǎn)單的查詢出各種排名有關(guān)的名單。

編碼實(shí)現(xiàn)redis的調(diào)用

設(shè)計(jì)好游戲流程之后,就可以開(kāi)始直接動(dòng)手實(shí)現(xiàn)了,下面用redis-cli命令,以偽代碼的形式展示一下競(jìng)猜的整個(gè)流程,可以直接在redis客戶端下查看效果。

redis-cli偽代碼

1. 創(chuàng)建用戶和競(jìng)選的候選人

玩轉(zhuǎn)Redis-使用有序集合(sorted sets)實(shí)現(xiàn)投票游戲


2. 為用戶分配額度

玩轉(zhuǎn)Redis-使用有序集合(sorted sets)實(shí)現(xiàn)投票游戲


3. 用戶投票

玩轉(zhuǎn)Redis-使用有序集合(sorted sets)實(shí)現(xiàn)投票游戲


4. 各種榜單

玩轉(zhuǎn)Redis-使用有序集合(sorted sets)實(shí)現(xiàn)投票游戲


下圖是運(yùn)行結(jié)果:


node.js代碼

最后,我們用node.js實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的后端服務(wù)demo,javascript的數(shù)據(jù)結(jié)構(gòu)和redis SDK比較清晰的展示原生命令的調(diào)用效果。demo演示了各種api的調(diào)用,可以安裝說(shuō)明,使用curl調(diào)用對(duì)應(yīng)的接口效果。

實(shí)現(xiàn)過(guò)程中,我們可以看到,如果直接使用命令,其實(shí)整個(gè)投票過(guò)程只需要非常簡(jiǎn)單的幾個(gè)命令就可以完成。而demo中演示的代碼,相比命令,增加了很多提供接口訪問(wèn)和sdk調(diào)用相關(guān)的代碼;如果最后為生產(chǎn)應(yīng)用編寫一個(gè)投票程序,根據(jù)業(yè)務(wù)邏輯的需要和容量規(guī)劃,還需要考慮更多的細(xì)節(jié),軟件開(kāi)發(fā)本身也是這樣的過(guò)程,從一個(gè)簡(jiǎn)單的想法和創(chuàng)意開(kāi)始,然后需要考慮更多的現(xiàn)實(shí)場(chǎng)景和需求,不斷的在程序中還原出整個(gè)構(gòu)想。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    394

    瀏覽量

    12258
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Redis應(yīng)用監(jiān)控指標(biāo)大盤點(diǎn)

    Redis作為高性能內(nèi)存數(shù)據(jù)庫(kù),廣泛應(yīng)用于緩存、會(huì)話存儲(chǔ)、消息隊(duì)列等場(chǎng)景。對(duì)Redis運(yùn)行狀況的有效監(jiān)控,是保障業(yè)務(wù)穩(wěn)定性的關(guān)鍵。本文的目的是幫助運(yùn)維工程師建立完整的Redis監(jiān)控知識(shí)體系,講解需要監(jiān)控哪些指標(biāo)、如何采集這些指標(biāo)
    的頭像 發(fā)表于 04-09 10:07 ?178次閱讀

    全方位對(duì)比:Redis能取代MySQL嗎?看完這篇你就懂了

    Redis能不能取代MySQL?答案很明確:不能取代,但可以互補(bǔ)。
    的頭像 發(fā)表于 04-07 10:50 ?202次閱讀
    全方位對(duì)比:<b class='flag-5'>Redis</b>能取代MySQL嗎?看完這篇你就懂了

    “汽車電子·2026年度金芯獎(jiǎng)”網(wǎng)絡(luò)投票通道正式開(kāi)啟!

    》雜志社共同組織開(kāi)展了“汽車電子·2026年度金芯獎(jiǎng)”評(píng)選活動(dòng)。 ? 現(xiàn)開(kāi)啟用戶投票/網(wǎng)絡(luò)投票渠道! 長(zhǎng)按掃碼投票 一、網(wǎng)絡(luò)投票時(shí)間 2026年4月1日-4月30日 ? ? 二、獎(jiǎng)項(xiàng)設(shè)
    的頭像 發(fā)表于 04-02 18:16 ?876次閱讀
    “汽車電子·2026年度金芯獎(jiǎng)”網(wǎng)絡(luò)<b class='flag-5'>投票</b>通道正式開(kāi)啟!

    磁性元器件行業(yè)評(píng)選大眾投票達(dá)71萬(wàn)票

    3 月 27 日,2025 “星特杯” 第十一屆大中華區(qū)磁性元器件與數(shù)字電源行業(yè)年度評(píng)選(下稱“磁性元器件行業(yè)評(píng)選”)大眾投票階段正式收官。本屆投票累計(jì)票數(shù)突破71 萬(wàn),創(chuàng)下該評(píng)選舉辦以來(lái)的歷史新高
    的頭像 發(fā)表于 04-01 14:28 ?174次閱讀
    磁性元器件行業(yè)評(píng)選大眾<b class='flag-5'>投票</b>達(dá)71萬(wàn)票

    Redis哨兵模式的自動(dòng)故障檢測(cè)與主從切換實(shí)戰(zhàn)

    Redis 主從復(fù)制解決了讀擴(kuò)展和數(shù)據(jù)冗余問(wèn)題,但主節(jié)點(diǎn)故障時(shí)需要人工介入切換,這在生產(chǎn)環(huán)境中是不可接受的。Sentinel(哨兵)模式在主從架構(gòu)之上增加了自動(dòng)故障檢測(cè)和故障轉(zhuǎn)移能力,是 Redis 高可用的標(biāo)準(zhǔn)方案之一。
    的頭像 發(fā)表于 02-27 11:05 ?313次閱讀

    投票總數(shù)超44萬(wàn)!星特杯投票進(jìn)入白熱化

    一、44萬(wàn)票背后:星特杯投票節(jié)奏加快,競(jìng)爭(zhēng)明顯升溫 截至目前,星特杯評(píng)選的總投票數(shù)已突破44萬(wàn),展現(xiàn)出行業(yè)內(nèi)外對(duì)這一獎(jiǎng)項(xiàng)的極大關(guān)注。當(dāng)前,星特杯評(píng)選投票狀況非常激烈,入圍企業(yè)正在通過(guò)各種方式積極發(fā)動(dòng)
    的頭像 發(fā)表于 02-03 15:09 ?367次閱讀
    <b class='flag-5'>投票</b>總數(shù)超44萬(wàn)!星特杯<b class='flag-5'>投票</b>進(jìn)入白熱化

    在Termux環(huán)境下實(shí)現(xiàn)康威生命游戲

    你想要在Termux環(huán)境下實(shí)現(xiàn)康威生命游戲,并專門展示經(jīng)典的“滑翔機(jī)”模式,構(gòu)建一個(gè)能持續(xù)運(yùn)行的二維世界,同時(shí)需要完整的程序代碼和調(diào)試說(shuō)明。 一、實(shí)現(xiàn)思路康威生命游戲的核心是遵循4條規(guī)
    發(fā)表于 12-21 18:36

    ??FourCastNet 3實(shí)現(xiàn)快速精準(zhǔn)的大型集合天氣預(yù)報(bào)

    FourCastNet 3(FCN3)是 NVIDIA Earth-2 中最新的 AI 全球天氣預(yù)報(bào)系統(tǒng)。FCN3 首次完美地結(jié)合了概率預(yù)測(cè)能力、計(jì)算效率、頻譜保真度、集合校準(zhǔn)和次季節(jié)
    的頭像 發(fā)表于 08-30 15:49 ?2493次閱讀

    V2G+動(dòng)態(tài)分配:安科瑞有序充電方案如何實(shí)現(xiàn)電網(wǎng)、運(yùn)營(yíng)商、用戶三贏?

    分析國(guó)內(nèi)外有序充電技術(shù)發(fā)展現(xiàn)狀,設(shè)計(jì)了包含邊緣計(jì)算網(wǎng)關(guān)、智能排隊(duì)算法和功率動(dòng)態(tài)分配策略的有序充電管控終端架構(gòu),并詳細(xì)闡述了其工作原理和實(shí)現(xiàn)方法。系統(tǒng)采用分層控制策略,實(shí)現(xiàn)臺(tái)區(qū)內(nèi)充電負(fù)荷
    的頭像 發(fā)表于 08-15 16:55 ?2039次閱讀
    V2G+動(dòng)態(tài)分配:安科瑞<b class='flag-5'>有序</b>充電方案如何<b class='flag-5'>實(shí)現(xiàn)</b>電網(wǎng)、運(yùn)營(yíng)商、用戶三贏?

    “云-邊-端”協(xié)調(diào)的新能源汽車有序充電系統(tǒng)級(jí)商業(yè)化驗(yàn)證

    分析國(guó)內(nèi)外有序充電技術(shù)發(fā)展現(xiàn)狀,設(shè)計(jì)了包含邊緣計(jì)算網(wǎng)關(guān)、智能排隊(duì)算法和功率動(dòng)態(tài)分配策略的有序充電管控終端架構(gòu),并詳細(xì)闡述了其工作原理和實(shí)現(xiàn)方法。系統(tǒng)采用分層控制策略,實(shí)現(xiàn)臺(tái)區(qū)內(nèi)充電負(fù)荷
    的頭像 發(fā)表于 08-12 16:57 ?912次閱讀
    “云-邊-端”協(xié)調(diào)的新能源汽車<b class='flag-5'>有序</b>充電系統(tǒng)級(jí)商業(yè)化驗(yàn)證

    Redis集群部署配置詳解

    Redis集群是一種分布式Redis解決方案,通過(guò)數(shù)據(jù)分片和主從復(fù)制實(shí)現(xiàn)高可用性和橫向擴(kuò)展。集群將整個(gè)數(shù)據(jù)集分割成16384個(gè)哈希槽(hash slots),每個(gè)節(jié)點(diǎn)負(fù)責(zé)一部分槽位。
    的頭像 發(fā)表于 07-17 11:04 ?1199次閱讀

    Redis集群部署與性能優(yōu)化實(shí)戰(zhàn)

    Redis作為高性能的內(nèi)存數(shù)據(jù)庫(kù),在現(xiàn)代互聯(lián)網(wǎng)架構(gòu)中扮演著關(guān)鍵角色。作為運(yùn)維工程師,掌握Redis的部署、配置和優(yōu)化技能至關(guān)重要。本文將從實(shí)戰(zhàn)角度出發(fā),詳細(xì)介紹Redis集群的搭建、性能優(yōu)化以及監(jiān)控運(yùn)維的核心技術(shù)。
    的頭像 發(fā)表于 07-08 17:56 ?1045次閱讀

    【經(jīng)驗(yàn)分享】在Omni3576上編譯Redis-8.0.2源碼,并安裝及性能測(cè)試

    本文首先介紹Redis是什么,然后介紹如何在Omni3576上編譯Redis-8.0.2源碼,以及從源碼編譯、安裝Redis,最后介紹如何在Omni3576上運(yùn)行Redis性能測(cè)試,并
    的頭像 發(fā)表于 06-05 08:05 ?1108次閱讀
    【經(jīng)驗(yàn)分享】在Omni3576上編譯<b class='flag-5'>Redis</b>-8.0.2源碼,并安裝及性能測(cè)試

    【幸狐Omni3576邊緣計(jì)算套件試用體驗(yàn)】Redis最新8.0.2版本源碼安裝及性能測(cè)試

    本文首先介紹Redis是什么,然后介紹如何在Omni3576上編譯Redis-8.0.2源碼,以及從源碼編譯、安裝Redis,最后介紹如何在Omni3576上運(yùn)行Redis性能測(cè)試,并
    發(fā)表于 06-03 01:28

    Redis 再次開(kāi)源!

    “ ?Redis 現(xiàn)已采用 AGPLv3 開(kāi)源許可證。? ” Redis CEO 的 Blog 以下是 Redis CEO Rowan Trollope 的 Blog: 像 AWS 和 GCP 這樣
    的頭像 發(fā)表于 05-06 18:26 ?1075次閱讀
    宁乡县| 高邮市| 安乡县| 开远市| 蚌埠市| 从江县| 广州市| 阳山县| 左贡县| 古蔺县| 康保县| 芜湖市| 厦门市| 鄂伦春自治旗| 沾益县| 谷城县| 枞阳县| 巨野县| 丽水市| 上栗县| 田东县| 沾益县| 文昌市| 安陆市| 阿荣旗| 西和县| 电白县| 永泰县| 通道| 巴楚县| 响水县| 哈密市| 麦盖提县| 炎陵县| 渭南市| 彭州市| 嘉善县| 图们市| 台州市| 都安| 龙游县|