2012-11-08

用 HBase 来存储 zset

Views: 14862 | Add Comments

虽然内存中有非常丰富的数据结构, 但真正的业务数据一般只有非常少的几种, 据我所知的有: 哈希表(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=weight 或者 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, 并且手工测试读取的性能还不错, 但还未做更多的测试.

Related posts:

  1. HBase 在 Linux 下安装和配置
  2. SSDB在大数据量日志分析中的应用案例
  3. SSDB – 支持 zset 的 LevelDB 服务器
  4. 基于Redis构建系统的经验和教训
  5. 百行代码实现一个简单的Zset(SortedSet)
Posted by ideawu at 2012-11-08 20:03:16

Leave a Comment