如何使用SSDB的zscan命令

如何使用SSDB的zscan命令

SSDB(LevelDB 服务器, NoSQL 存储方案)的 zscan 是最强大的一条命令, 因为它操作的是 zset(sorted set) 数据类型, 只需要一条 zscan 命令就能直接地表达业务逻辑, “所写即所想”. 例如, 获取用户的未读消息列表, 获取按上架时间排序的商品列表, 获取微博 timeline…

zset 可以理解为关系数据库里具有两个字段的表, 一个字段是 key, UNIQUE 索引, 也即数据的唯一标识; 另一个字段是浮点型 score, 每一个 key 对应的排序权重值. 在关系数据库中, 要分页遍历数据, 就要执行类似的一条 SQL 查询:

select * from table order by score, key limit start, size

每一次查询都会进行排序, 性能非常低. 而 SSDB 的 zset 中的数据是已经排好序的, 读取时不需要进行排序. zscan 的命令原型为:

zscan name key_start score_start score_end limit
  - name: 列表的标识
  - key_start: 分页遍历列表时, 上一次遍历到的最大(score)的一条数据 key
  - score_start: 上一次遍历到的数据的排序权重值最大值
  - score_end: 想要遍历的数据的排序权重值最大值
  - limit: 分页返回一次的数据条数

假设购物网站中有这样的一个商品表:

id, title, price, update_time

展示商品列表时, 有时需要按价格 price 排序, 有时需要按更新时间 update_time 排序, 用 SSDB 怎么解决? 那就需要建两个 zset:

#zset 1
key = id
score = price

#zset 2
key = id
score = update_time

这就是 NoSQL 的常用设计模式, 将带有 N 字段的关系数据库表分解成 N-1 个每个只有 2 个字段的数据库表, 这样每个表对应一个 SSDB 的 zset.

Comments are closed.