女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

極鏈科技Video++:劉偉

整理:包包

redis是一種提供多種數據類型的開源key-value存儲系統,通常將數據全部存儲在內存中。


redis是目前最受歡迎的key-value存儲系統,是基于內存存儲kv的數據庫,合理的使用redis作為緩存,可以極大的改善系統的性能和服務器請求響應時間。

redis除了基本的kv存儲以外,還實現了哈希(Map), 列表(list), 集合(sets) 和有序集合(sorted sets)等數據類型;結合內存和數據結構的特性,在業務功能實現的過程中,可以更靈活的實現很多特性。

今天介紹的是有序集合這種數據結構,我們在實際的業務過程中使用了有序集合,并且收獲到一些有價值的經驗。

什么是有序集合

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


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

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

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

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

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

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

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

* zrevrangebyscore 獲取某個分數區間內元素的排行榜

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

設計投票游戲

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

投票游戲的用戶故事

1. 創建投票的候選人

2. 創建用戶

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

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

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

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

游戲流程


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

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

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

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

編碼實現redis的調用

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

redis-cli偽代碼

1. 創建用戶和競選的候選人

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


2. 為用戶分配額度

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


3. 用戶投票

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


4. 各種榜單

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


下圖是運行結果:


node.js代碼

最后,我們用node.js實現了一個簡單的后端服務demo,javascript的數據結構和redis SDK比較清晰的展示原生命令的調用效果。demo演示了各種api的調用,可以安裝說明,使用curl調用對應的接口效果。

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


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Redis
    +關注

    關注

    0

    文章

    387

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Redis集群部署配置詳解

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

    Redis集群部署與性能優化實戰

    Redis作為高性能的內存數據庫,在現代互聯網架構中扮演著關鍵角色。作為運維工程師,掌握Redis的部署、配置和優化技能至關重要。本文將從實戰角度出發,詳細介紹Redis集群的搭建、性能優化以及監控運維的核心技術。
    的頭像 發表于 07-08 17:56 ?227次閱讀

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

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

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

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

    Redis 再次開源!

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

    redis三種集群方案詳解

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

    Redis實戰筆記

    在目前的技術選型中,Redis 儼然已經成為了系統高性能緩存方案的事實標準,因此現在?Redis 也成為了后端開發的基本技能樹之一。 ? 基于上述情況,今天給大家分享一份?杰哥?親筆撰寫的內部
    的頭像 發表于 02-09 09:12 ?392次閱讀
    <b class='flag-5'>Redis</b>實戰筆記

    Redis Cluster之故障轉移

    1. Redis Cluster 簡介 Redis Cluster 是 Redis 官方提供的 Redis 集群功能。 為什么要實現
    的頭像 發表于 01-20 09:21 ?891次閱讀
    <b class='flag-5'>Redis</b> Cluster之故障轉移

    華為云Flexus X實例,Redis性能加速評測及對比

    隨著云計算技術的飛速發展,Redis 作為一種高性能的內存數據庫,在各種應用場景中發揮著越來越重要的作用。為了滿足不同用戶對 Redis 性能的高要求,華為云推出了 Flexus X 實例,并提供了
    的頭像 發表于 12-29 15:47 ?493次閱讀
    華為云Flexus X實例,<b class='flag-5'>Redis</b>性能加速評測及對比

    華為云 Flexus X 輕松實現 Redis 一主多從高效部署

    ,Flexus?X 預裝 Redis 加速鏡像,簡化了 Redis 的安裝和配置流程,降低了技術門檻,使開發者能夠更專注于業務邏輯的實現。 ????????本文將詳細介紹如何在華為云 Flexus?X 上
    的頭像 發表于 12-27 13:45 ?490次閱讀
    華為云 Flexus X 輕松<b class='flag-5'>實現</b> <b class='flag-5'>Redis</b> 一主多從高效部署

    Redis緩存與Memcached的比較

    關鍵特性和差異: 1. 數據存儲 Redis: Redis是一個開源的鍵值存儲,支持多種數據結構,如字符串、列表、集合、有序集合、散列、位圖
    的頭像 發表于 12-18 09:33 ?590次閱讀

    nginx+lua+redis實現灰度發布

    作者:馬仁喜 前言: 授人以魚不如授人以漁 .先學會用,在學原理,在學創造,可能一輩子用不到這種能力,但是不能不具備這種能力。這篇文章主要是沉淀使用nginx+lua+redis實現灰度,當我們具備
    的頭像 發表于 12-17 10:01 ?439次閱讀

    玩轉RK3588開發板基于connector-split 功能實現多屏聯動

    玩轉RK3588開發板基于connector-split 功能實現多屏聯動
    的頭像 發表于 12-02 16:05 ?972次閱讀
    <b class='flag-5'>玩轉</b>RK3588開發板基于connector-split 功能<b class='flag-5'>實現</b>多屏聯動

    電動汽車有序充電智能管控軟件平臺設計與應用

    摘要: 為了打造便捷生活,實現對用戶充電信息的采集、充電狀態的實時監測,該文基于電動汽車立體車庫智能管控系統,設計并開發電動汽車有序充電智能管控軟件平臺。該軟件由電動汽車有序充電后臺管理軟件和微信
    的頭像 發表于 10-29 15:51 ?575次閱讀
    電動汽車<b class='flag-5'>有序</b>充電智能管控軟件平臺設計與應用

    恒訊科技分析:云數據庫rds和redis區別是什么如何選擇?

    結構化數據,使用SQL作為查詢語言,支持ACID事務和多種復雜查詢操作。而Redis是一個基于內存的非關系型數據庫,采用鍵值對模型存儲數據,支持豐富的數據結構如字符串、列表、集合、哈希表等。 2、性能:Redis以其超快的速度而
    的頭像 發表于 08-19 15:31 ?825次閱讀