Я досить новачка до NoSQL, але мені завжди подобалася ідея. Я подивився Редісі отримали кілька запитань про кращі способи зберігання та отримання декількох hashes
.
Припускаючи наступний сценарій:
Store a list of objects (redis "Hashes") and select them by their timestamp.
Щоб архівувати це в SQL
, для цього знадобиться одна таблиця і два простих запиту (INSERT & SELECT).
Спроба зробити це в Redis
, Я закінчив створення наступної структури:
- Ключ
object:$id
(хеш) що міститьobject
- Ключ
index:timestamp:$id
(відсортований набір)score
дорівнюєtimestamp
іvalue
включає в себеid
Хоча я можу жити з додатковою роботою по обслуговуванню двох ключів замість однієї таблиці (SQL), Мені цікаво про процес вибір декількох об'єктів:
ZRANGEBYSCORE index:timestamp:$id timestampStart timestampEnd
Це повертає array
всіх ідентифікаторів, створених між ними timestampStart
і timestampEnd
. Щоб отримати сам об'єкт, я прошу кожного:
GET object:$id
- Це правильний спосіб зробити це?
- У порівнянні з базою даних SQL: чи вона все ще помітно швидше або може навіть повільніше, викликана високою кількістю
GET
с?
Відповіді:
3 для відповіді № 1А. ZRANGEBYSCORE
витрати O(log(N) + M)
де N=|items in your set|
і M=|items you"re selecting|
. Отже, роблячи ZRANGEBYSCORE
а потім M GET
операцій просто O(long(N)+M+M)
= O(log(N)+M)
і щонайбільше буде вдвічі повільніше. Мережа вперед і назад могла б бути серйозним уповільненням, але, оскільки кожен з ваших результатів є незалежною операцією, ви можете просто їх прокладати. Ви також можете покласти все це в сценарій Lua і просто мати одну і туди-назад, яка була б найбільш оптимальною. Я б сказав з 99% впевненістю, що це буде швидше, ніж робити те ж саме в SQL.
Крім того, якщо це дуже часто для вас операція, ви можете отримати ще більше прискорення, просто зберігаючи весь об'єкт у вашому відсортованому наборі замість просто id. Ви б мали key = object encoded as json
, score = timestamp
. Це врятує вас O(M)
на вашу операцію з точки зору не потрібно робити GET
с
Чи це хороший спосіб робити речідійсно залежить від вашого використання. Скільки потрібно швидкості, і наскільки важливі для вас інші особливості традиційної бази даних? Пам'ятайте, що Redis - це набагато більше просто структура даних, доступна клієнтам, ніж традиційна база даних, і вона повинна зберігати все в оперативній пам'яті. Щоб дізнатися, чи правильно це для вас, нам потрібна додаткова інформація.