91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

極鏈科技Video++:劉偉

整理:包包

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


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

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

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

什么是有序集合

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


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

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

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

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

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

* zscore 用來查詢某個元素在集合中的分

* zrevrank 返回某個元素在集合中的位置

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

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

設(shè)計投票游戲

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

投票游戲的用戶故事

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

2. 創(chuàng)建用戶

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

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

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

6. 所有人查看實時的候選人選票排名

游戲流程


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

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

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

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

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

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

redis-cli偽代碼

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

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


2. 為用戶分配額度

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


3. 用戶投票

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


4. 各種榜單

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


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


node.js代碼

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

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


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

    關(guān)注

    0

    文章

    392

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    Redis哨兵模式的自動故障檢測與主從切換實戰(zhàn)

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

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

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

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

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

    Redis Sentinel和Cluster模式如何選擇

    在我十年的運維生涯中,見過太多團隊在Redis集群方案選擇上踩坑。有的團隊盲目追求"高大上"的Cluster模式,結(jié)果運維復(fù)雜度爆表;有的團隊死守Sentinel不放,最后擴展性成了瓶頸。今天,我想通過這篇萬字長文,把我在生產(chǎn)環(huán)境中積累的經(jīng)驗全部分享給你。
    的頭像 發(fā)表于 09-08 09:31 ?585次閱讀

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

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

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

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

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

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

    Redis集群部署配置詳解

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

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

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

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

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

    【幸狐Omni3576邊緣計算套件試用體驗】Redis最新8.0.2版本源碼安裝及性能測試

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

    零死角玩轉(zhuǎn)STM32——中級篇

    本文共4冊,由于資料內(nèi)存過大,分開上傳,有需要的朋友可以去主頁搜索下載哦~ 《零死角玩轉(zhuǎn) STM32》系列教程由初級篇、中級篇、高級篇、系統(tǒng)篇、四個部分組成,更適合初學(xué)者,步步為營,從入門到精通
    發(fā)表于 05-21 13:56

    Redis 再次開源!

    “ ?Redis 現(xiàn)已采用 AGPLv3 開源許可證。? ” Redis CEO 的 Blog 以下是 Redis CEO Rowan Trollope 的 Blog: 像 AWS 和 GCP 這樣
    的頭像 發(fā)表于 05-06 18:26 ?933次閱讀

    redis三種集群方案詳解

    Redis中提供的集群方案總共有三種(一般一個redis節(jié)點不超過10G內(nèi)存)。
    的頭像 發(fā)表于 03-31 10:46 ?1535次閱讀
    <b class='flag-5'>redis</b>三種集群方案詳解

    安科瑞EMS3.0有序充電管理解決方案破解充電樁“用電焦慮”

    有序充電 充電樁
    的頭像 發(fā)表于 03-21 13:29 ?754次閱讀
    安科瑞EMS3.0<b class='flag-5'>有序</b>充電管理解決方案破解充電樁“用電焦慮”