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的长度,保存当前多少条直播信息。具体使用方法与场上队员相同。