2015-06-22 3 views
2

Я хочу хранить данные корзины покупок в Redis.Тележки для покупок в Redis

У меня есть такие данные:

{ user_X (unique) 

product_id1, product_name1, product_price1 

product_id2, product_name2, product_price2 

... } example of a shopping cart 

{ user_Y (unique) 

product_id1, product_name1, product_price1 

product_id2, product_name2, product_price2 

... } example of another shopping cart 

Какой тип данных следует использовать?

+0

Что относительно количества? Может ли тот же продукт появляться более одного раза (с той же или другой ценой) в данной корзине? Какие типы шаблонов доступа к данным вам нужно обслуживать - это тележки, созданные по строкам или навалом? Вам нужно обновлять продукты в корзине? Нужно ли вам брать одну тележку за раз на основе идентификатора пользователя или вы хотите сделать агрегирование содержимого на нескольких тележках? Суть в том, что существует множество способов моделирования данных - для определения правильного требуется информация о том, что вы хотите с ним делать. –

+0

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

ответ

2

Ваши данные, похоже, хорошо вписываются в тип данных Hash. Используйте имена ключей, составленные из идентификатора пользователя (соглашение Redis заключается в разделении элементов в имени ключа с использованием двоеточия, символ::). Имена полей в каждой корзине Hash должны быть идентификаторами продуктов.

Поскольку хэши Redis (и все другие типы данных в этом отношении) не поддерживают вложенность, единственным возможным типом данных для значения поля Hash является String. Самый простой способ сохранить имя и цену вашего продукта в String - просто объединить два и использовать разделитель для разделения. Таким образом, приведенный выше пример будет храниться в Redis похож на ниже:

HSET cart:X id1 "name1:price1" 
HSET cart:X id2 "name2:price2" 

HMSET cart:Y id1 "name1:price1" id2 "name2:price2" 

Чтобы получить телегу пользователя, сделать HGETALL на ключ или использовать HSCAN, если у вас есть действительно большие тележки.

+0

Хорошо! Я думаю, что это умно, таким образом, когда я получаю данные, я могу проанализировать строку с помощью «:», чтобы отличить имя от цены. А если у меня есть несколько «:»? Таким образом, я не могу принять «:» по названию или цене, не так ли? –

+1

Верно, но вы можете легко обойти его, выбирая другой разделитель (строки Redis бинарно безопасны, поэтому вы даже можете использовать \ x00) или создать escape-последовательность (например, «\:»), которая будет использоваться для демаркации значений цели: P –

+2

И BTW, вы также можете найти раздел о тележках от Redis in Action: https://redislabs.com/academy/redis-in-action/part-1-getting-started/chapter-2 -anatomy-оф-а-Redis-веб-приложения/2-2-магазины-тележек-в-Redis –