Почему в Redis нет упорядоченного hashmap?

Типы данных Redis включают отсортированный набор и другие необходимые структуры данных для хранения значения ключа. Но мне интересно, почему у него нет отсортированной карты, как у Java TreeMap или C++ std::map, Я думаю, что базовая структура данных будет в основном похожа на отсортированный набор, поскольку оба должны быть сбалансированным бинарным деревом поиска.

Должны быть некоторые случаи использования, когда мы должны хранить пару ключ-значение в определенном порядке в соответствии с ключом. Но текущий отсортированный набор служит только для сохранения ключа в соответствии с оценкой.

1 ответ

Решение

Должны быть некоторые случаи использования, когда мы должны хранить пару ключ-значение в определенном порядке в соответствии с ключом

Поскольку ключи Redis являются двоичными строками, я предполагаю, что конкретный порядок, который вы упомянули, является лексикографическим порядком (в частности, ключи сравниваются с memcmp функция). В этом случае вы можете легко реализовать C++ std::map с SORTED SET, Вы можете достичь этого за 2 шага:

Сборка std::set с помощью отсортированного набора Redis

Если 2 элемента в SORTED SET имеют одинаковую оценку, они упорядочены в лексикографическом порядке. Таким образом, чтобы построить std::setДай всем членам в SORTED SET с таким же счетом:

zadd std::set 0 c
zadd std::set 0 a
zadd std::set 0 b

// since all these members have the same score,
// the result is lexicographical ordered:
// a b c
zrange std::set 0 -1

// the following command will fail, since 'c' already exists.
zadd std::set 0 c

Начиная с Redis 2.8, он поддерживает некоторые команды для работы в лексикографических диапазонах, так что вы можете создать что-то похожее на std::set::lower_bound, или же std::set::upper_bound

// something similar to lower_bound: find all members not less than b
zrangebylex std::set [b +
// something similar to upper_bound: find all members greater than b
zrangebylex std::set (b +

Сопоставьте каждый ключ в наборе со значением

Так как вы уже получаете std::set, затем сопоставьте ключ со значением, вы можете получить std::map,

set a value_a
set b value_b
set c value_c

Объедините эти 2 шага вместе

Вы можете обернуть всю работу в скрипт lua, чтобы иметь встроенный std::map, И используйте это так:

redis-cli --eval map.lua map_name , key value
Другие вопросы по тегам