Range方法

Range方法从键值存储中获取范围内的key.

  1. rpc Range(RangeRequest) returns (RangeResponse) {}

注意没有操作单个key的方法,即使是存取单个key,也是需要使用 Range 方法的。

消息体

请求的消息体是RangeRequest:

  1. message RangeRequest {
  2. enum SortOrder {
  3. NONE = 0; // 默认, 不排序
  4. ASCEND = 1; // 正序,低的值在前
  5. DESCEND = 2; // 倒序,高的值在前
  6. }
  7. enum SortTarget {
  8. KEY = 0;
  9. VERSION = 1;
  10. CREATE = 2;
  11. MOD = 3;
  12. VALUE = 4;
  13. }
  14. // key是range的第一个key。如果 range_end 没有给定,请求仅查找这个key
  15. bytes key = 1;
  16. // range_end 是请求范围的上限[key, range_end)
  17. // 如果 range_end 是 '\0',范围是大于等于 key 的所有key。
  18. // 如果 range_end 比给定的key长一个bit, 那么范围请求获取所有带有前缀(给定的key)的key
  19. // 如果 key 和 range_end 都是'\0',则范围查询返回所有key
  20. bytes range_end = 2;
  21. // 请求返回的key的数量限制
  22. int64 limit = 3;
  23. // 修订版本是用于范围的键值对存储的时间点。
  24. // 如果 revision 小于或等于零,范围是在最新的键值对存储上。
  25. // 如果修订版本已经被压缩,返回 ErrCompacted 作为应答
  26. int64 revision = 4;
  27. // 指定返回结果的排序顺序
  28. SortOrder sort_order = 5;
  29. // 用于排序的键值字段
  30. SortTarget sort_target = 6;
  31. // 设置范围请求使用串行化成员本地读(serializable member-local read)。
  32. // 范围请求默认是线性化的;线性化请求相比串行化请求有更高的延迟和低吞吐量,但是反映集群当前的一致性。
  33. // 为了更好的性能,以可能脏读为交换,串行化范围请求在本地处理,无需和集群中的其他节点达到一致。
  34. bool serializable = 7;
  35. // 设置仅返回key而不需要value
  36. bool keys_only = 8;
  37. // 设置仅仅返回范围内key的数量
  38. bool count_only = 9;
  39. }

应答的消息体是 RangeResponse:

  1. message RangeResponse {
  2. ResponseHeader header = 1;
  3. // kvs是匹配范围请求的键值对列表
  4. // 当请求数量时是空的
  5. repeated mvccpb.KeyValue kvs = 2;
  6. // more代表在被请求的范围内是否还有更多的key
  7. bool more = 3;
  8. // 被请求范围内key的数量
  9. int64 count = 4;
  10. }

mvccpb.KeyValue 的消息体:

  1. message KeyValue {
  2. // key是bytes格式的key。不容许key为空。
  3. bytes key = 1;
  4. // create_revision 是这个key最后创建的修订版本
  5. int64 create_revision = 2;
  6. // mod_revision 是这个key最后修改的修订版本
  7. int64 mod_revision = 3;
  8. // version 是key的版本。删除会重置版本为0,而任何key的修改会增加它的版本。
  9. int64 version = 4;
  10. // value是key持有的值,bytes格式。
  11. bytes value = 5;
  12. // lease是附加给key的租约id。
  13. // 当附加的租约过期时,key将被删除。
  14. // 如果lease为0,则没有租约附加到key。
  15. int64 lease = 6;
  16. }