对keys的扫描操作

key在一个bucket里面按照byte-sorted有序排序的,所以对于keys的扫描操作,在NutsDB里是很高效的。

前缀扫描

对于前缀的扫描,我们可以用PrefixScan 方法, 使用参数 limitNum 来限制返回的结果的数量,比方下面例子限制100个entries:

  1. if err := db.View(
  2. func(tx *nutsdb.Tx) error {
  3. prefix := []byte("user_")
  4. // 限制 100 entries 返回
  5. if entries, err := tx.PrefixScan(bucket, prefix, 100); err != nil {
  6. return err
  7. } else {
  8. keys, es := nutsdb.SortedEntryKeys(entries)
  9. for _, key := range keys {
  10. fmt.Println(key, string(es[key].Value))
  11. }
  12. }
  13. return nil
  14. }); err != nil {
  15. log.Fatal(err)
  16. }

范围扫描

对于范围的扫描,我们可以用 RangeScan 方法.

例子:

  1. if err := db.View(
  2. func(tx *nutsdb.Tx) error {
  3. // 假设用户key从 user_0000000 to user_9999999.
  4. // 执行区间扫描类似这样一个start和end作为主要参数.
  5. start := []byte("user_0010001")
  6. end := []byte("user_0010010")
  7. bucket:= []byte("user_list)
  8. if entries, err := tx.RangeScan(bucket, start, end); err != nil {
  9. return err
  10. } else {
  11. keys, es := nutsdb.SortedEntryKeys(entries)
  12. for _, key := range keys {
  13. fmt.Println(key, string(es[key].Value))
  14. }
  15. }
  16. return nil
  17. }); err != nil {
  18. log.Fatal(err)
  19. }