記憶體資料庫應用之NBA籃球圖文直播室儲存設計(Redis版)

胖子哥發表於2016-04-19

1.1 摘要

上一篇《記憶體資料庫應用之NBA籃球圖文直播室儲存設計》針對NBA籃球直播室的需求規格做了詳細的介紹,其中儲存設計是基於Memcached記憶體結構特點進行。本文針對相同的業務規則和需求,採用Redis實現相同的功能,只是儲存結構發生了變化。考慮到介紹Redis的資料網上已經很多,本文不再重複介紹,感興趣的可自行學習,在這裡只重點介紹Redis的實際應用。為了行文方便,所有針對資料的操作均使用命令列執行。

1.2 實驗環境

表1:          實驗環境

備註

作業系統

RHEL6.0.2

 

Redis版本

2.6.13

 

1.3 儲存設計

1.3.1 實時資料

1.3.1.1 實時比分

Memcached儲存的資料型別是字元型,而實際操作過程中,需要用到的資料型別是整型,因此每次進行資料操作時,都需要進行資料型別轉換。Redis儲存型別仍然為字元型(string),但是針對字元操作提供了計數操作提供了封裝,具體操作命令如下:

incr(key):名稱為key的string增1操作

incrby(key, integer):名稱為key的string增加integer

decr(key):名稱為key的string減1操作

decrby(key, integer):名稱為key的string減少integer

示例指令碼如下:

Incrby NBA.YYYYMMDD.XX.HOST.SCORE 2         (兩分球)

Incrby NBA.YYYYMMDD.XX.HOST.SCORE 3                 (三分球)

Incrby NBA.YYYYMMDD.XX.HOST.SCORE 1  (罰球)

1.3.1.2 單節比分

單節比分可以採用與實時比分相同的儲存策略,考慮到一場比賽分為多節,特殊情況下會包含單個或多個加時的情況,採用Redis儲存時我們採用Hash結構儲存相關資料。涉及相關操作包括:

hset(key, field, value):向名稱為key的hash中新增元素field<—>value

hget(key, field):返回名稱為key的hash中field對應的value

hmget(key, field1, …,field N):返回名稱為key的hash中field i對應的value

hmset(key, field1, value1,…,field N, value N):向名稱為key的hash中新增元素field i<—>value i

hincrby(key, field, integer):將名稱為key的hash中field的value增加integer

操作指令碼如下所示:

HSET NBA.YYYYMMDD.XX.HOST.ESCORE 1 0

HSET NBA.YYYYMMDD.XX.HOST. ESCORE 2 0

HINCRBY NBA.YYYYMMDD.XX.HOST. ESCORE 1 2 第一節得分增加兩分

HINCRBY NBA.YYYYMMDD.XX.HOST. ESCORE 1 2 第一節得分增加兩分

HGET NBA.YYYYMMDD.XX.HOST. ESCORE 1  獲取第一節得分

HGET NBA.YYYYMMDD.XX.HOST. ESCORE 1 2 第一節、第二節得分

1.3.1.3 場上隊員

Redis支援List結構,所有針對當前場上隊員資訊的儲存採用List,這一點區別於Memcached針對每一個球員位置的設定。相關操作命令如下:

rpush(key, value):在名稱為key的list尾新增一個值為value的元素

lpush(key, value):在名稱為key的list頭新增一個值為value的 元素

lrange(key, start, end):返回名稱為key的list中start至end之間的元素(下標從0開始,下同)

ltrim(key, start, end):擷取名稱為key的list,保留start至end之間的元素

lindex(key, index):返回名稱為key的list中index位置的元素

lset(key, index, value):給名稱為key的list中index位置的元素賦值為value

lrem(key, count, value):刪除count個名稱為key的list中值為value的元素。

lpop(key):返回並刪除名稱為key的list中的首元素

rpop(key):返回並刪除名稱為key的list中的尾元素

我們呼叫LPUSH命令,將每一個隊員的資訊儲存連結串列,需求獲取當前場上隊員資訊是,呼叫lrange命令獲取當前在場上的5位隊員。這裡面的區別好處打大家可以慢慢體會。示例指令碼如下:

LPUSH NBA.YYYYMMDD.XX.HOST.MEMBER 康利

LPUSH NBA.YYYYMMDD.XX.HOST.MEMBER 加索爾

LPUSH NBA.YYYYMMDD.XX.HOST.MEMBER 蘭多夫

LPUSH NBA.YYYYMMDD.XX.HOST.MEMBER 李

LRANGE NBA.YYYYMMDD.XX.HOST.MEMBER 0 4

備註:在這裡我們將List按照佇列方式使用,通過讀取前5位資料,獲取當前場上隊員資訊。

本節犯規、剩餘長暫停、剩餘短暫停採用string儲存,有實時比分儲存方式相同。

1.3.2 文字直播

文字直播採用List進行儲存,可以儲存設定List的長度,儲存當前多少條直播資訊。具體使用方法與場上隊員相同。


相關文章