参考:http://www.inter12.org/archives/1192
https://www.jianshu.com/p/e115189001fe
https://www.cnblogs.com/-courage/p/11536733.html
RowKey的设计:
在实际的设计中我们可能更多的是结合多种设计方法来实现Rowkey的最优化设计。
案例一:
设计订单状态表时使用:Rowkey: reverse(order_id) + (Long.MAX_VALUE – timestamp),
这样设计的好处:(1)我们只会查本订单的数据,通过reverse订单号避免Region热点,(2)可以按时间倒排显示。
案例二:
使用HBase作为事件(事件指的的终端在APP中发生的行为,比如登录、下单等等统称事件(event))的临时存储(HBase只存储了最近10分钟的热数据)来举例:
设计event事件的Rowkey为:两位随机数Salt + eventId + Date + kafka的Offset
这样设计的好处是:
设计加盐的目的是为了增加查询的并发性,假如Salt的范围是0~n,那我们在查询的时候,可以将数据分为n个split同时做scan操作。经过我们的多次测试验证,增加并发度能够将整体的查询速度提升5~20倍以上。随后的eventId和Date是用来做范围Scan使用的。在我们的查询场景中,大部分都是指定了eventId的,因此我们把eventId放在了第二个位置上,同时呢,eventId的取值有几十个,通过Salt + eventId的方式可以保证不会形成热点。在单机部署版本中,HBase会存储所有的event数据,所以我们把date放在rowkey的第三个位置上以实现按date做scan,批量Scan性能甚至可以做到毫秒级返回。
这样的rowkey设计能够很好的支持如下几个查询场景:
1、全表scan
在这种情况下,我们仍然可以将全表数据切分成n份并发查询,从而实现查询的实时响应。
2、只按照event_id查询
3、按照event_id和date查询
案例三:
某主题的留言倒序展示,这个时候我们设计的Rowkey要和时间顺序相关。
可以使用"Long.MAX_VALUE - 发表时间"的 long 值作为 Rowkey 的前缀。 rowKey为: 主题Id + "Long.MAX_VALUE - 发表时间"
案例四:
交易类数据
查询场景:
1.查询某个卖家某段时间内的交易记录
[seller id][timestmap][order number]
2.查询某个买家某段时间内的交易记录
[buyer id][timestmap][order number]
3.根据订单号查询
[order number]
4.同时满足1,2,3
三张表:
一张买家维度表,rowkey为:
[buyer id][timestmap][order number]
一张卖家维度表,rowkey为:
[seller id][timestmap][order number]
一张订单索引表,rowkey为:
[order number]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)