-
Notifications
You must be signed in to change notification settings - Fork 55
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
sorted set 기능 검토 및 개발 #480
Comments
하시는 분이 없다면 제가 진행해보도록 하겠습니다. |
Sorted set 기능이 필요한 이유를 남깁니다. 먼저, b+tree collection은
대부분의 응용들에서 b+tree 기능이 활용도가 매우 높지만, 몇 개 응용에서 부족한 기능이 있습니다.
활용 예를 들면, 아래와 같습니다.
좀 더 넓게 설명하면, 이는 RDBMS에서 테이블에 어떤 index를 두는 것과 같은 문제입니다.
마지막으로, sorted set 개념을 외부에는 어떻게 제공할 것인가 입니다.
|
상세한 설명 정말로 감사합니다.
b+tree와는 다른 간단한 구조의 index를 가질 수 있는 자료구조를 생성하여, sorted set을 구현하는게 맞나요?
전자의 방식을 먼저 고려해 보신다는게 sorted set 개념을 b+ tree collection 의 옵션과 같은 형태로 사용할 수 있게 제공한다는 뜻인가요? |
@dongwooklee96
|
sorted set을 지원하는 Redis에서 어떻게 구현하였는지를 보았는데, skip list 라는 자료구조를 이용하여 구현되었습니다. 조금 변형하기는 하였지만 기본 아이디어는 같습니다. [참고자료] |
@dongwooklee96 |
@dongwooklee96 redis에서 sorted set 구현을 위해 아래 2가지 data structure를 사용합니다.
Arcus에서 sorted set 개념을 제공하려면, 아래와 같이 hash table을 구현해야 합니다.
b+tree에 있는 모든 element의 value에 대해 ARCUS에서 sorted set 개념을 어떻게 제공할 지는 별도 이슈로 생각하면 좋겠습니다.
따라서, 작업은 아래와 같이 나누는 것이 좋을 것 같습니다.
검토 바랍니다. |
set 속성은, attribute에 추가하려고 하는데, 어떻게 생각하시나요? bop insert를 할 때, 중복된 값이 있을 경우 클라이언트에게 어떤 response_string을 전달해야 할지 또 bop가 제공하는 다른 연산의 경우 어떻게 동작하는지에 대한 설계는 제가 생각해보고 검토를 통해 합의되면 설계대로 개발하면 될까요?
저도 이 부분에 동의합니다. btree의 추가 속성을 제공하는 형태로 제공하는 것이 더 알맞을 것 같습니다. 제가 혹시 놓친 부분이 있다면 알려주시면 감사하겠습니다 |
그 외는 개발하면서 논의 사항이 생기면, 그 때 논의하면 될 것 같습니다. |
@jhpark816 그런데 제가 아직 해시테이블에 대한 이해가 부족하여,
|
|
@jhpark816 답변 주셔서 감사합니다!
static ENGINE_ERROR_CODE do_set_elem_link(set_meta_info *info, set_elem_item *elem,
const void *cookie)
{
assert(info->root != NULL);
set_hash_node *node = info->root;
set_elem_item *find;
int hidx = -1;
/* set hash value */
elem->hval = genhash_string_hash(elem->value, elem->nbytes);
// 하위 해시 테이블을 가지고 있다면, 노드를 하위 해시 테이블로 변경
while (node != NULL) {
hidx = SET_GET_HASHIDX(elem->hval, node->hdepth);
if (node->hcnt[hidx] >= 0) /* set element hash chain */
break;
node = node->htab[hidx];
}
assert(node != NULL);
assert(hidx != -1);
// 해시 체인을 모두 순회하면서 중복된 값을 가지는지 검사
for (find = node->htab[hidx]; find != NULL; find = find->next) {
if (set_hash_eq(elem->hval, elem->value, elem->nbytes,
find->hval, find->value, find->nbytes))
break;
}
// 모두 순회하지 못했다면 중복된 값을 가지고 있다는 뜻이므로, 에러 코드 리턴
if (find != NULL) {
return ENGINE_ELEM_EEXISTS;
}
if (node->hcnt[hidx] >= SET_MAX_HASHCHAIN_SIZE) {
set_hash_node *n_node = do_set_node_alloc(node->hdepth+1, cookie);
if (n_node == NULL) {
return ENGINE_ENOMEM;
}
...
|
이해 안 되면, 다시 알려주세요 |
ARCUS는 현재 sorted set 기능을 지원하지 않는다.
응용에서 ARCUS를 활용하는 데 있어 sorted set 기능이 필요한 경우도 있으므로,
이를 설계하고 개발한다.
The text was updated successfully, but these errors were encountered: