2017-10-03 8 views
0

I 含む種々の数(非繰り返し)(リスト、ソートセット、多分単純な文字列をすることができる)何かを持っている必要があり、私は、例えば、いくつかのRedisのは、値を切り替えるアトミック

を切り替えできるようにする必要があります

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

私のスイッチを行う:すなわち

MULTI 

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

EXEC 

最終結果:

をリストがと
LRANGE todo:20 0 -1 => "5" "2" "6" "7" 

私はこれをもっと簡単な(またはより良い)方法で行うことができますか、それともREDISの「制限」ですか?

答えて

1

SORTコマンドを使用できます。

これらのインデックスをSETに格納し、各インデックスに対応するスコア/重みを格納し、それによってソートします。スコアキーはハッシュにすることができ、多くの異なるスコアセットを持つことができます。

例は次のとおりです。 3つのパラメータ、挿入時間、実行に要する時間、および優先度を指定したリストです。

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 

各1によっ​​てソートされたリストを取得するには:あなたもこのハッシュまたは同じRedisのDBに他のキーでタスク自身(またはその他のデータ)を保存する場合

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" 

を、あなたはあなたが複数のキーにアクセスしているとして、SORTコマンドはRedisのクラスタでは動作しないこと

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" 

注:オプションのGET引数と同じ単一の呼び出しでそれを得ることができます。そして、このコマンドの時間の複雑さは非常に高くなる可能性があります。特に、使用法や設定されたサイズが拡大する場合は、慎重に使用してください。

0

あなたはそれを行うLuaスクリプトを書いて、それをあなたのトランザクションの代わりに呼び出すことができます。また、モジュールを使用することもできますが、要求が単純な場合は、過剰な処理になる可能性があります。