精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

    文章

    371

    瀏覽量

    10848
收藏 人收藏

    評論

    相關推薦

    Redis開源版與Redis企業版,怎么選用?

    點擊“藍字”關注我們數以千計的企業和數以百萬計的開發人員Redis開源版來構建應用程序。但隨著用戶數量、數據量和地區性的增加,成本、可擴展性、運營和可用性等問題也隨之而來。Redis企業版
    的頭像 發表于 04-04 08:04 ?976次閱讀
    <b class='flag-5'>Redis</b>開源版與<b class='flag-5'>Redis</b>企業版,怎么選用?

    GaussDB(for Redis) 游戲實踐:玩家下線行為上報

    實現以上功能時,感知用戶下線行為延遲較大,導致上報時間不準確。華為云 GaussDB(for Redis)作為一款企業級游戲數據庫,具備卓越的企業級能力,能及時上報用戶下線行為,并被廣泛應用于排行榜等多種業務場景。 基于
    的頭像 發表于 03-28 22:03 ?503次閱讀

    Redis實現分布式多規則限流的方式介紹

    市面上很多介紹 Redis 如何實現限流的,但是大部分都有一個缺點,就是只能實現單一的限流,比如 1 分鐘訪問 1 次或者 60 分鐘訪問 10 次這種,但是如果想一個接口兩種規則都需要滿足呢,我們的項目又是分布式項目,應該如何
    的頭像 發表于 02-26 10:07 ?453次閱讀
    <b class='flag-5'>Redis</b><b class='flag-5'>實現</b>分布式多規則限流的方式介紹

    Redis的LRU實現和應用

    在編程中,計數器是一種基本但強大的工具,用于跟蹤和管理數據和資源。本文將深入探討不同類型的計數器的應用,從Redis的LRU(最近最少使用)緩存淘汰算法的實現,到如何在內存受限的環境中有效地使用計數器,再到普通計數器的巧妙應用。
    的頭像 發表于 12-15 09:24 ?573次閱讀

    redis是關系型數據庫嗎

    Server)是一個開源的高性能鍵值對存儲系統。它使用C語言編寫,具有內存中數據存儲和持久化到硬盤的功能。Redis支持多種數據結構,如字符串、哈希表、列表、集合有序集合等,這使得
    的頭像 發表于 12-05 10:32 ?1505次閱讀

    redis數據結構的底層實現

    數據結構,包括字符串、列表、哈希表、集合有序集合。每種數據結構都有不同的底層實現,以滿足對于不同操作的高效支持。 首先,我們來看Redis
    的頭像 發表于 12-05 10:14 ?597次閱讀

    redis容器內怎么查看redis日志

    redis是一款流行的開源內存數據庫,常用于緩存、消息隊列、任務管理等場景。在使用redis時,了解如何查看redis日志對于排查問題、監控性能和分析應用程序行為非常重要。在本文中,我們將介紹在
    的頭像 發表于 12-05 10:10 ?3510次閱讀

    redis持久化機制和如何實現持久化

    Redis是一款高性能的非關系型數據庫,其持久化機制是保證數據在重啟后仍能夠保存的關鍵。Redis提供了兩種方式來實現持久化:RDB(Redis DataBase)和AOF(Appen
    的頭像 發表于 12-05 10:02 ?443次閱讀

    redis的主要方法

    ,包括字符串操作、哈希操作、列表操作、集合操作以及有序集合操作等,同時還會對每個方法進行實例演示。 一、字符串操作 Redis的字符串是最基本的數據類型,可以存儲任意類型的數據,包括二
    的頭像 發表于 12-05 09:59 ?783次閱讀

    redis的increment方法

    Redis是一種流行的開源鍵值存儲數據庫,具有高性能和卓越的可擴展性。它支持多種數據結構和功能,包括字符串、列表、哈希、集合有序集合。其中,Red
    的頭像 發表于 12-05 09:57 ?1179次閱讀

    redis hash底層實現原理

    數據結構是如何實現的呢?本文將詳細介紹Redis哈希底層的實現原理。 在Redis中,每個哈希都是由一個類似于字典(Dictionary)的結構實現
    的頭像 發表于 12-04 16:27 ?564次閱讀

    如何實現Redis分布式鎖

    機制,下面將詳細介紹如何實現Redis分布式鎖。 一、引言 在分布式系統中,多個節點可能同時讀寫同一共享資源。如果沒有實現互斥訪問和同步機制,就會產生數據不一致和競態條件等問題。解決這個問題的一種方法是使用分布式鎖,在訪問共享
    的頭像 發表于 12-04 11:24 ?668次閱讀

    mongodb和redis的區別

    )文檔的形式存儲。每個文檔都是一個獨立的實體,可以包含不同的字段和嵌套的文檔。這種數據模型非常適合復雜的結構和靈活的數據模式。 Redis是一個鍵值存儲數據庫,數據被存儲為鍵值對。鍵可以是任何字符串,值可以是字符串、列表、哈希表、集合
    的頭像 發表于 12-04 11:11 ?1131次閱讀

    Java redis鎖怎么實現

    在Java中實現Redis鎖涉及到以下幾個方面:Redis的安裝配置、Redis連接池的使用、Redis數據結構的選擇、
    的頭像 發表于 12-04 10:47 ?1129次閱讀

    Redis工具集的實現和使用

    Redis 基本上是互聯網公司必備的工具了,Redis的應用場景實在太多了,但是有很多相似的功能如果每個項目都要實現一遍就顯得太麻煩了,所以為了方便,我打算開發一個基于 Redis
    的頭像 發表于 12-03 17:32 ?1195次閱讀
    <b class='flag-5'>Redis</b>工具集的<b class='flag-5'>實現</b>和使用