随笔 - 581  文章 - 0 评论 - 48 阅读 - 131万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

参考: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]

posted on   毛会懂  阅读(181)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示