ideawu / ssdb

SSDB - A fast NoSQL database, an alternative to Redis
http://ssdb.io/
BSD 3-Clause "New" or "Revised" License
8.19k stars 1.4k forks source link

zset和hset是否会支持scan? #683

Closed yuikns closed 9 years ago

yuikns commented 9 years ago

目前使用scan方法只能遍历key-value类型的key list. 但我现在需要存储一些zset,zset的数量很多,我希望能以prefix批量删除. 比如

name      key     value
a00         00      0
a01         00      1
a01         02      2
b01         00      1

如上是一个zset的数据集,我想要删掉所有name为a开头的.

ideawu commented 9 years ago

你说的是 zrembyscan, 不计划增加这个命令. 目前你只能在客户端做:

keys = zscan(z);
multi_zdel(z, keys);
yuikns commented 9 years ago

在贵文档中,我若设值如下:

zset a00 01 10 文档对其命名为: zset: 命令 a00: name 01: key 10 : value

我只找到zscan api如下 URL: http://ssdb.io/docs/zh_cn/php/content.html#m-zscan

zscan

说明

列出 zset 中处于区间 (key_start+score_start, score_end] 的 key-score 列表. 如果 key_start 为空, 那么对应权重值大于或者等于 score_start 的 key 将被返回. 如果 key_start 不为空, 那么对应权重值大于 score_start 的 key, 或者大于 key_start 且对应权重值等于 score_start 的 key 将被返回.

也就是说, 返回的 key 在 (key.score == score_start && key > key_start || key.score > score_start), 并且 key.score <= score_end 区间. 先判断 score_start, score_end, 然后判断 key_start.

("", ""] 表示整个区间.

参数

name - zset 的名字. key_start - score_start 对应的 key. score_start - 返回 key 的最小权重值(可能不包含, 依赖 key_start), 空字符串表示 -inf. score_end - 返回 key 的最大权重值(包含), 空字符串表示 +inf. limit - 最多返回这么多个元素.

返回值

如果出错则返回 false, 否则返回包含 key-score 的关联数组.

示例

$ssdb->zscan('z', '', 1, 100, 10);

我的理解是,假定我已经知道zset的name(也就是,我已经知道name是a00了),查询里面的key.

但现在需求是,若我只知道name的prefix(我实际上只知道name的prefix为a,而不是确定的值a00 ),我是否可以找到对应所有的zset的name?


在redis中,set中的key和zset的name是同级的,因此我scan会遍历所有的key-value中的key和所有zset的name.但在ssdb中,zset的name和key-value中的key完全不是一个系统,不知是否我太不细心,以至于没有找到对应的api.

ideawu commented 9 years ago

zlist

yuikns commented 9 years ago

多谢.是这个.