用 HBase 来存储 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, 并且手工测试读取的性能还不错, 但还未做更多的测试.

Related posts:

  1. HBase 在 Linux 下安装和配置
  2. Redis 导数据的 PHP 脚本
  3. 基于Redis构建系统的经验和教训
  4. Redis被bgsave和bgrewriteaof阻塞的解决方法
  5. MySQL命令行按Delete键输出”~”的问题

你现在看的文章是: 用 HBase 来存储 zset

Linode VPS - 美国虚拟主机 | IT牛人博客聚合网站

你可能感兴趣的:(高性能Web架构)