内存数据库应用之NBA篮球图文直播室存储设计(Redis版)
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的长度,保存当前多少条直播信息。具体使用方法与场上队员相同。
作者:张子良
出处:http://www.cnblogs.com/hadoopdev
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】