Почему в 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