php Redis :: hscan Получить все хэши с подстановочными именами и условиями - PullRequest
2 голосов
/ 29 апреля 2020

Итак, у меня есть куча (тысячи) хешей с такими именами:

state:city:street

И внутри каждого есть что-то вроде:

signId => 10,
damaged => 1

Я, по сути, хочу сделать некоторую хитрость, в которой я не уверен, что это возможно.

Я хочу получить все значения для signId, но только если запись signId существует, но запись damaged не существует ...

Для всех хэшей, которые попадают в подстановочный знак state:city:*

И все в PHP / Laravel / Predis

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Нет встроенной функции или функции, чтобы сделать их в Redis. Я не рекомендую вам использовать keys в производстве. Как указано в Redis документации ;

keys следует использовать в производственной среде с особой осторожностью. Это может привести к снижению производительности при выполнении в больших базах данных.

Я рекомендую три варианта:

  • scan - лучшая альтернатива keys, так как он не блокирует сервер надолго. время. На уровне приложения вы можете выполнить ключи ha sh, соответствующие вашему шаблону, а затем дважды нажать HGET (O (1)) и сделать сравнение. HGETALL - это еще один вариант, если ваши ключи ha sh не имеют много полей.

  • Другой вариант - отслеживать, какие ваши ключи ha sh соответствуют шаблону в отдельном наборе / списке. Всякий раз, когда вы звоните HMSET или HSET, вы также набираете sh этот ключ в наборе / списке. Отслеживая ключи, вам больше не нужно использовать scan позже. Вы можете просто получить их в разбивке по страницам для выполнения связанных команд ha sh. Как рекомендация, это также требует запросов уровня приложения вместо запросов уровня данных.

  • Поскольку вам необходимо выполнять запросы с несколькими условиями, может быть лучше хранить их в реляционной базе данных (postgresql, mysql и др. c). Redis хорош для обслуживания ваших хэшей, но когда вам нужно запросить ваши хэши так, как вы хотите сделать запрос, лучше пересобрать ваши данные.

0 голосов
/ 29 апреля 2020

Сначала вам нужно будет получить ключи как keys state:city:*

Затем вам нужно будет сделать HGETALL state:city:{name} один за другим, т. Е. По всем oop.

...