在etcd 3.0.x中,引入了一个新的API,我只是在阅读它。在RangeRequest
对象中,有一件事我不清楚。在description of the property range_end
中,它说:
如果range_end比给定键大一点, 然后范围请求获得带有前缀(给定密钥)的所有密钥。
这是完整的文字,提供一些背景信息:
// key is the first key for the range. If range_end is not given, the request only looks up key.
bytes key = 1;
// range_end is the upper bound on the requested range [key, range_end).
// If range_end is '\0', the range is all keys >= key.
// If the range_end is one bit larger than the given key,
// then the range requests get the all keys with the prefix (the given key).
// If both key and range_end are '\0', then range requests returns all keys.
bytes range_end = 2;
我的问题是:
是什么意思如果range_end比给定的键大一点
?这是否意味着range_end
比key
长1位?这是否意味着当解释为整数时它必须是key+1
?如果是后者,在哪个编码?
答案 0 :(得分:1)
有一个PR可以解决这种混乱。
如果range_end是关键加一(例如," aa" +1 ==" ab"," a \ xff" +1 ==&#34 ; b&#34), 然后范围请求获取所有以键为前缀的键。
更新:
var key = "/aaa"
var range_end = "/aa" + String.fromCharCode("a".charCodeAt(2) + 1);
答案 1 :(得分:0)
比key
的最后一个字节大一点。
例如,如果key
为“09903x”,则range_end
应为“09903y”。
发送到etcd服务器时只有字节流,所以你应该关心驱动程序的序列化,并确定range_end
的值。
答案 2 :(得分:0)
一个很棒的TypeScript示例:https://github.com/mixer/etcd3/blob/7691f9bf227841e268c3aeeb7461ad71872df878/src/util.ts#L25
使用TextEncoder / TextDecoder的工作js示例:
function endRangeForPrefix(value) {
let textEncoder = new TextEncoder();
let encodeValue = textEncoder.encode(value);
for (let i = encodeValue.length - 1; i >= 0; i--) {
if (encodeValue[i] < 0xff) {
encodeValue[i]++;
encodeValue = encodeValue.slice(0, i + 1);
let textDecoder = new TextDecoder();
let decode = textDecoder.decode(encodeValue);
return decode;
}
}
return '';
}