2015-05-27 5 views
1

Это вопрос с 2 частями.Redis, ключи частичного совпадения с концом строки

У меня есть REDIS дБ хранения элементов со следующими ключами:

тип записи 1: "site_id: 1_item_id: 3"

тип записи 2: «site_id: 1_item_id: 3_user_id: 6"

Я использую KEYS site_id:1_item_id:*, чтобы захватить записи типа 1 элементов (в данном случае для сайта 1)

К сожалению, он возвращает все элементы типа 1 и типа 2.

Каков наилучший способ захвата всех записей типа "site_id: 1_item_id: 3"? Не избегая тех, которые включают user_id? Можно ли использовать EOL?

Во-вторых, я читал, используя KEYS - плохой выбор, может ли кто-нибудь порекомендовать другой подход здесь? Я открыт для редактирования имен ключей, если нужно.

ответ

1

Прежде всего: если вы не являетесь единственным пользователем redis на вашей локальной машине разработки, вы правы, используя KEYS, является неправильным. Он блокирует экземпляр redis до завершения, поэтому любой, кто запрашивает его при использовании ключей, должен будет дождаться завершения запроса ключей. Вместо этого используйте SCAN.

SCAN будет перебирать записи не блокируемым образом, и вы гарантированно получите все из них. Я не знаю, какой язык вы используете для запроса, но в python довольно легко запросить ключи с проверкой и фильтровать их на лету.

Но, допустим, вы все равно хотите использовать ключи. Мне кажется, что он делает KEYS site_id:1_item_id:? или KEYS site_id:1_item_id:3 делает трюк. Если вы хотите, чтобы клавиши заканчивались «3» или нет (я не уверен, что полностью понял ваш вопрос здесь).

Вот пример, который я попробовал на моей локальной машине:

redis 127.0.0.1:6379> flushall 
OK 
redis 127.0.0.1:6379> set site_id:1_item_id:3 a 
OK 
redis 127.0.0.1:6379> set site_id:1_item_id:3_user_id:6 b 
OK 
redis 127.0.0.1:6379> set site_id:1_item_id:4 c 
OK 

// ok so we have got the database cleaned and set up 
redis 127.0.0.1:6379> keys * 
1) "site_id:1_item_id:3" 
2) "site_id:1_item_id:4" 
3) "site_id:1_item_id:3_user_id:6" 

// gets all the keys like site_id:1_item_id:X 
redis 127.0.0.1:6379> keys site_id:1_item_id:? 
1) "site_id:1_item_id:3" 
2) "site_id:1_item_id:4" 

// gets all the keys like site_id:1_item_id:3 
redis 127.0.0.1:6379> keys site_id:1_item_id:3 
1) "site_id:1_item_id:3" 

Не забывайте, что Redis КЛЮЧИ использует шаблон GLOB стиль, который не так же, как регулярное выражение. Вы можете проверить keys documentation examples, чтобы убедиться, что вы понимаете

+0

Спасибо за ответ Арно! Но не будет? не работает, если идентификатор больше 1 цифры? – Elliot

+1

Действительно - используйте звездочку ('*') вместо этого, но обратите внимание, что она также будет соответствовать шаблонам, таким как 'site_id: 1_item_id: 3: foobar' –

+1

Вы правы,"? " не будет работать с двумя или более цифрами. Поскольку спецификация «диапазон» для шаблонов или шаблон типа «+» регулярных выражений, я думаю, если у вас есть более одной цифры, вам лучше использовать SCAN. Но лучше использовать сканирование, несмотря ни на что. –

0

Правильный подход здесь - использовать указатель ключей - поддерживается вами. Redis не следует запрашивать в каком-либо обычном смысле.

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