2017-10-03 8 views
0

je dois avoir quelque chose (peut-être une liste, triée ensemble, peut-être une simple chaîne) contenant divers numéros (non-répétition) et je dois pouvoir passer certainsRedis passer les valeurs atomiquement

Par exemple avec des listes:

LRANGE todo:20 0 -1 => "2" "5" "6" "7" 

faire mon commutateur: à savoir

MULTI 

LRANGE todo:20 0 1 => "2" "5" (store them) 
LSET todo:20 0 "5" 
LSET todo:20 1 "2" 

EXEC 

résultat final:

LRANGE todo:20 0 -1 => "5" "2" "6" "7" 

Y a-t-il un moyen de le faire d'une manière plus simple (ou meilleure) ou est-ce une "limitation" de REDIS?

Répondre

1

Vous pouvez utiliser la commande SORT.

Stockez ces index dans un SET et stockez un score/poids correspondant à chaque index, et effectuez un tri par celui-ci. La clé de score peut être un hachage, et vous pouvez avoir plusieurs ensembles de scores différents.

Voici un exemple: Une liste de tâches avec 3 paramètres, l'heure d'insertion, le temps d'exécution et une priorité.

127.0.0.1:6379> SADD todos 1 2 3 
127.0.0.1:6379> HMSET todos:1 insertionTime 1 executionTime 10 priority 5 
127.0.0.1:6379> HMSET todos:2 insertionTime 2 executionTime 25 priority 1 
127.0.0.1:6379> HMSET todos:3 insertionTime 5 executionTime 4 priority 7 

Pour obtenir la liste triée par chacun:

127.0.0.1:6379> SORT todos by todos:*->insertionTime 
1) "1" 
2) "2" 
3) "3" 
127.0.0.1:6379> SORT todos by todos:*->executionTime 
1) "3" 
2) "1" 
3) "2" 
127.0.0.1:6379> SORT todos by todos:*->priority 
1) "2" 
2) "1" 
3) "3" 

Si vous enregistrez également la tâche elle-même (ou toute autre donnée) dans ce hachage ou toute autre touche de la même Redis db, vous peut obtenir dans le même appel unique avec l'argument GET en option:

127.0.0.1:6379> HSET todos:1 task "do something" 
127.0.0.1:6379> HSET todos:2 task "do something else" 
127.0.0.1:6379> HSET todos:3 task "do this other thing" 

127.0.0.1:6379> SORT todos by todos:*->priority get todos:*->task 
1) "do something else" 
2) "do something" 
3) "do this other thing" 

Notez que la commande SORT ne fonctionnera pas avec groupe Redis que vous accédez à plusieurs clés. Et cette complexité de temps de commande peut être très élevée, vous devez l'utiliser avec prudence, surtout lorsque l'utilisation et les tailles d'ensemble augmentent.

0

Vous pouvez écrire un script Lua qui le fait, puis l'appeler à la place de votre transaction. Vous pouvez également utiliser des modules mais cela peut être exagéré si la requête est simple.