title | tags | description |
---|---|---|
Tarantool Arch |
tarantool, trainings |
- Пользователь хотел бы сократить ссылку:
- Чтобы вместить её в смс или в твиттер
- Сохранить в QR код
- Или даже расположить в печатной продукции
- Необходимо хранение соответствий
- Настроить хранилище Tarantool
- Настроить репликацию
- Настроить масштабирование
- Запустить http-сервер
- Конфигурация базы данных
- Схема хранения
- Запросы
init.lua
box.cfg{}
- Инициализация файлов
Для решение задачи сделаем спейс со следующими полями:
-
оригинальная ссылка
-
сокращённая ссылка
-
создание спейса
box.schema.space.create('redirector', { if_not_exists=true })
Флаг if_not_exists подавляет ошибку в случае существования спейса.
Укажем поля и типы полей для спейса:
box.space.redirector:format({
{ name='source', type='string' }, -- исходная сслылка
{ name='short', type='string' }, -- сокращенная ссылка
})
Для просто хранения данных нам нужен первичный индекс.
Сделаем первичный ключ по полю с оригинальной ссылкой.
box.space.redirector:create_index(
'primary',
{
parts = { 'source' },
if_not_exists = true,
}
)
В случае, когда пользователь переходит по сокращенной ссылке, нам надо найти оригинальную.
box.space.redirector:create_index(
'short',
{
parts = { 'short' },
if_not_exists = true,
}
)
Для вставки новой ссылки сделаем сокращённый хеш ссылки:
$ echo -n "https://go.mail.ru/search\?q\=tarantool" | shasum | head -c 10
Cоздадим запрос на вставку
box.space.redirector:insert({"https://go.mail.ru/search?q=tarantool", "0f74d9fd75"})
Если теперь сделать повторную вставку даже с другим url — получим ошибку по индексу по полю с сокращенной ссылкой.
box.space.redirector:insert({"https://habr.com", "0f74d9fd75"})
Duplicate key exists in unique index
Вставим некоторое множество ссылок:
box.space.redirector:insert({"http://google.com/?q=tarantool", "9da443d847"})
box.space.redirector:insert({"https://www.tarantool.io/en/doc/latest/", "e5b1f259a8"})
box.space.redirector:insert({"https://db-engines.com/en/system/Tarantool", "ad0e253828"})
box.space.redirector:insert({"https://mcs.mail.ru", "47bfb2302e"})
box.space.redirector:insert({"https://github.com/tarantool/tarantool/", "c1ceeaaf95"})
Для поиска оригинальной ссылки по сокращенной воспользуемся итератором по индексу:
box.space.redirector.index.short:get("0f74d9fd75")
Такой запрос можно сделать несколькими способами:
for _, tuple in box.space.redirector.index.short:pairs() do
print(tuple)
end