/ / Redis: Získať všetky kľúče z frontu, ktorých hodnota sa rovná niektorým kritériám - ruby, redis

Redis: Získajte všetky kľúče z frontu, ktoré majú hodnotu rovnú niektorým kritériám - ruby, redis

Mám veľa pracovných miest, ktoré ukladám na redis, každýidentifikovaný špeciálnym kľúčom, s hodnotou hash ako ich hodnotou, ktorá obsahuje niektoré informácie. Tieto úlohy sú vyzdvihnuté, vypočítané a akonáhle sú hotové, majú success pole, ktoré je nastavené na true ak bol výpočet úspešne dokončený. Chcem vyplniť zoznam všetkých kľúčov, ktoré majú success zadajte hodnotu hash nastavenú na true.

napr. nové úložisko:

foo_key_1 => {bar_hash_key: bar_value, baz_hash_key: baz_value, success: true}
foo_key_2 => {bar_hash_key: bar_value, baz_hash_key: baz_value, success: false}

S vyššie uvedeným príkladom by som chcel jednoduchý a efektívny spôsob prehľadávania všetkých kľúčov v redis a poľa ich úspechu a nakoniec skončil s [foo_key_1] ako výsledok.

V súčasnej dobe môj prístup je nasledujúci (v rubínovom pseudokódu):

# redis is a connection to my redis server
all_keys = redis.keys                      # list of all keys in redis
for i in all_keys do                       # iterate through all keys in redis
if (redis.hgetall i)["success"] == true  # if that key has success = true attrib
completed_keys.append(i)               # append that key to a new list
end
end

Problém, ako by ste asi uhádli, je veľa kľúčov na opakovanie, a to, aj keď O (N) vvýkon je pomerne pomalý, pokiaľ ide o výkon, kvôli jeho iteračnej povahe. Prešiel som cez redis dokumenty / príkazy, ale nič mi nevyskočilo ako potenciálny kandidát na vyriešenie tohto problému efektívnejšie, Nie som žiadny redis guru, ale zdá sa to celkom jednoduché, vložíte veci a vyberiete veci. Existujú nejaké možné vektorové operácie, ktoré som mohol prehliadnuť?

Veľká vďaka.

odpovede:

2 pre odpoveď č. 1

Nemôžete to urobiť bez opakovania všetkýchkeys, pretože redis podporuje iba načítanie kľúčov. Túto zložitosť môžete znížiť, ak náhodou poznáte vzor pre klávesy, ktoré musíte hľadať, a to aj v tomto prípade opätovné načítanie všetkých kľúčov na pozadí (s určitými optimalizáciami, pretože ich načíta v dávkach). http://www.rubydoc.info/github/redis/redis-rb/Redis:scan). Niečo ako:

$redis.scan_each(match: "foo*").to_a

Ako môžete napísať svoj vlastný vzor nájdete tu https://redis.io/commands/KEYS

Ak však môžete ovládať, aké hodnoty berú klávesy, môžete ich prinútiť, aby pri tomto vyhľadávaní pomohli určitej hodnote, napríklad:

  • urobme z tohto kľúča každý kľúč "foo # {your_number}: # {success_bool}"
  • pri vyhľadávaní použite tento vzorec „foo *: 1“

1 pre odpoveď č. 2

Aby ste to dosiahli efektívne iba pomocou Redisu, musíte mať aktualizované „Redis-queryable“, SET alebo LIST of success / dokončené kľúče.

Na základnej úrovni to znie ako to, čo ste vyskutočne tu je front úloh (a druhý front úloh pre úspešné prvé úlohy). Pokiaľ to konkrétne nechcete implementovať sami, pozerali ste sa na implementáciu frontov úloh?