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ď č. 1Nemôž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?