用 HBase 来存储 zset
- - idea's blog虽然内存中有非常丰富的数据结构, 但真正的业务数据一般只有非常少的几种, 据我所知的有: 哈希表(Key-Value), zset(sorted set). 其中, 又以 zset 的业务表达能力最为强大. zset 是元素的集合, 集合中的元素都是唯一的, 并且每个元素都有一个排序权重值, 决定该元素在集合中的线性位置(一维坐标)..
虽然内存中有非常丰富的数据结构, 但真正的业务数据一般只有非常少的几种, 据我所知的有: 哈希表(Key-Value), zset(sorted set). 其中, 又以 zset 的业务表达能力最为强大. zset 是元素的集合, 集合中的元素都是唯一的, 并且每个元素都有一个排序权重值, 决定该元素在集合中的线性位置(一维坐标).
在 MySQL 数据库中, 可以用如下表结构来存储 zset:
weight, setname, element UNIQUE(setname, element)
Redis 本身支持 zset 数据类型. MySQL 方案可存储大数据, 但读性能非常有问题, 因为其排序是在查询进行时动态发生的. Redis 速度快, 但最大的问题是数据量不能超过内存容量. 所以, 需要寻找一种替代的方案.
HBase 不支持 zset, 但可利用其”Key 的有序性和可遍历性”, 通过设计 Key 的结构来实现 zset. 对于 zset 的每一个元素, 需要在 HBase 中存储两条数据:
key=setname|weight|element, value=NULL key=setname|element, value=score 或者 setname|weight|element
将 Key 中”|”分隔的每一个字段都定长.
读取: 利用 scan
写入/更新: 查询 key=setname|element, 然后删除 key=setname|weight|element, 再插入 key=setname|new_weight|element.
删除: 查询并删除 key=setname|element, 然后删除 key=setname|weight|element
备注: 当然, 这只是说明 HBase 能存储 zset, 并且手工测试读取的性能还不错, 但还未做更多的测试.
你现在看的文章是: 用 HBase 来存储 zset