【问题标题】:does kyoto cabinet support key range search?京都内阁是否支持关键范围搜索?
【发布时间】:2017-03-23 17:56:49
【问题描述】:

京都内阁是否支持搜索一系列密钥? 如果是这样,哪些类型的键支持范围搜索? 我可以对长(64 位)键进行范围搜索吗?

谢谢 RG

【问题讨论】:

  • 如果您知道另一个键值存储 a) 支持二进制键和值 b) 支持键范围搜索,请告诉我

标签: nosql key-value tokyo-cabinet kyotocabinet


【解决方案1】:

它支持键前缀查询,但是前缀查询的效率取决于内部存储结构是什么。如果您使用的是 hashdb,这可能不是一个好主意,因为键和值分散在下划线文件中。

【讨论】:

    【解决方案2】:

    是的,对于整数。

    B+树数据库支持key的顺序访问,实现了字符串的前向匹配搜索和整数的范围搜索-来自docs

    【讨论】:

      【解决方案3】:

      是的,你可以,你只需要向前跳跃。

      使用 C 的示例。使用 64 位键(从 1 到 5)存储 5 条记录,然后应用过滤器(从 2 到 4):

      #include <kclangc.h>
      #include <inttypes.h>
      
      int main(void)
      {
          KCDB *db;
          KCCUR *cur;
          char *kbuf;
          size_t ksiz, vsiz;
          const char *cvbuf;
          int64_t i, val, min, max;
          int64_t keys[] = {1, 2, 3, 4, 5};
          const char *values[] = {"one", "two", "three", "four", "five"};
          char i64[8]; /* A buffer to store byte sequences */
      
          /* create the database object */
          db = kcdbnew();
          /* open the database */
          if (!kcdbopen(db, "db64.kct", KCOWRITER | KCOCREATE)) {
              fprintf(stderr, "open error: %s\n", kcecodename(kcdbecode(db)));
          }
          /* store records */
          for (i = 0; i < 5; i++) {
              memcpy(i64, &keys[i], 8);
              if (!kcdbset(db, i64, 8, values[i], strlen(values[i]))) {
                  fprintf(stderr, "set error: %s\n", kcecodename(kcdbecode(db)));
                  exit(EXIT_FAILURE);
              }
          }
          /* traverse records */
          min = 2;
          max = 4;
          printf("Range from %" PRId64 " to %" PRId64 "\n", min, max);
          memcpy(i64, &min, 8);
          cur = kcdbcursor(db);
          kccurjumpkey(cur, i64, 8);
          while ((kbuf = kccurget(cur, &ksiz, &cvbuf, &vsiz, 1)) != NULL) {
              memcpy(&val, kbuf, 8);
              if (val > max) {
                  break;
              }
              printf("Found %s\n", cvbuf);
              kcfree(kbuf);
          }
          kccurdel(cur);
          /* close the database */
          if (!kcdbclose(db)) {
              fprintf(stderr, "close error: %s\n", kcecodename(kcdbecode(db)));
          }
          /* delete the database object */
          kcdbdel(db);
          return 0;
      }
      

      【讨论】:

        【解决方案4】:

        LevelDB 支持二进制键和范围查询。

        编辑:我忘了提到,为了使范围查询起作用,二进制值需要以可比较的方式打包。对于您的长示例,您需要确保它是大端编码的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多