2013-04-23 3 views
2

Я планирую использовать redis как кэш для уже существующей базы данных (MS SQL). Я хотел бы использовать данные redis для ввода в front end.I будет иметь дело с огромными количество данных около 100 ГБ в день. В основном будет таблица, содержащая значение времени и некоторое значение счетчика (около 10-100 столбцов). Как бы redis выполнить, если я собираюсь сделать агрегацию на этих больших данных на основе часа, дня и т. Д. (Например, на основе столбца времени.) Правильно ли это сделать, или есть ли альтернатива? Я не знаю, насколько хорош nosql, когда речь идет об аггрегации по сравнению с РСУБД. И как MonogoDB справится с таким сценарием?Redis как кеш для СУБД

Благодаря

+1

Вы собираетесь сбросить все данные в Redis (возможно, плохую идею) или написать обертку, которая помещает некоторые данные в Redis и истекает через некоторое время. Кроме того, я жду ответов на вопрос, если Redis - лучший способ сделать это. – rizwaniqbal

+0

Я буду хранить данные за максимальное время 1 месяца. –

+1

Имейте в виду, что вам нужно поместить все данные, хранящиеся в redis, в оперативную память –

ответ

4

Если вам нужно хранить 100GB и вы не ожидать, что ваши данные будут расти намного дальше, начните с 3 REDIS экземпляров, каждый с 64 Гб оперативной памяти, общей 192Gb, более чем достаточно держите свой набор данных и увеличивайте пространство.

Каждый экземпляр redis будет мастером, поэтому ваши данные будут разделены между экземплярами одинаково. Вы должны будете шард по экземплярам от уровня приложений с использованием простого алгоритма хэширования, например ...

(from your application layer) 
shardKey = "redis" + getShardKey(cacheKey); 
redisConnection = getRedisConnectionByShardKey(shardKey); 
//do work with redisConnection here 

Функция getShardKey(string) принимает cacheKey, преобразует его в целое число, то моды его число экземпляров redis, возвращающих либо 0, 1, либо 2. Настройте пул соединений для каждого экземпляра redis, дайте каждому из них имя типа redis0, redis1 и т. д. после вызова хэш-функции используйте клавишу осколка, чтобы получить соединение для экземпляра target redis. После того, как у вас есть необходимые данные, выполните агрегацию в своем прикладном уровне.

Это простой подход; он распределяет данные поровну между экземплярами redis (более или менее) и избегает наложения всего на один экземпляр redis. Redis однопоточен, поэтому, если вы делаете много ввода-вывода, вы будете связаны тем, насколько быстро ваш процессор может обслуживать запросы; использование нескольких экземпляров распределяет эту нагрузку.

Это решение ломается, когда ваш набор данных превышает 180 ГБ. Если вы добавите другой экземпляр redis для размещения большего набора данных, хеш-функцию нужно обновить, чтобы отображать по модулю 4, а не 3, и вам придется перемещать большую часть ваших данных, это становится уродливым, поэтому используйте этот подход, только если вы на 100% уверены, что набор данных останется ниже 150 ГБ.

+2

+1 для ввода: 'Существуют методы, позволяющие сохранить пространство в redis.В нашей фирме мы храним данные в основном по парам строк/значений и отсортированным наборам; в обоих случаях мы используем MessagePack для сериализации данных перед сохранением в redis. Основываясь на наших тестах, 1 Гб данных сжимается до 250 МБ в redis с MessagePack.' – brainOverflow

+0

Благодарим вас за эту информацию, @brainOverflow –

Смежные вопросы