とても簡単だと思います。
解決策1(劣る、推奨されない)
ZSCAN MySet 0 MATCH Id:92 count 1
の方法 保存された文字列が"{\"Id\":\"92\"...
であるため、うまくいきませんでした "{\"Id:92\"...
ではありません 。文字列が別の形式に変更されました。したがって、MATCH Id\":\"64
を使用してみてください または、redisのjsonシリアル化データと一致するようなもの。私はjson.netに精通していないので、実際の文字列はあなたが発見できるように残されています。
ちなみに、ZSCAN MySet 0 MATCH Id:92 count 1
カーソルを返しますか? ZSCAN
を使用したと思われます 間違った方法で。
解決策2(より良い、強くお勧めします)
ZSCAN
ソートされたセットが大きくなく、RedisのLuaトランザクションによってネットワークラウンドトリップ時間を節約する方法を知っている場合に適しています。これでも「IDで検索」操作O(n)になります。したがって、より良い解決策は、次の方法でデータモデルを変更することです。
ソートされたセットを変更する
# Score Value
0 1443476076 {"Id":"92","Ref":"7ADT","DTime":1443476076,"ATime":1443901554,"ExTime":0,"SPName":"7ADT33CFSAU6","StPName":"7ADT33CFSAU6"}
1 1443482969 {"Id":"11","Ref":"DAJT","DTime":1443482969,"ATime":1443901326,"ExTime":0,"SPName":"DAJTJTT4T02O","StPName":"DAJTJTT4T02O"}
に
# Score Value
0 1443476076 Id:92
1 1443482969 Id:11
残りの詳細データを別のハッシュタイプキーのセットに移動します:
# Key field-value field-value ...
0 Id:92 Ref-7ADT DTime-1443476076 ...
1 Id:11 Ref-7ADT DTime-1443476076 ...
次に、hgetall id:92
を実行して、IDで検索します。 。日付による範囲クエリについては、ZRANGEBYSCORE sortedset mindate maxdate
を実行する必要があります 次にhgetall
すべてのIDを1つずつ。これらのコマンドを1つにまとめるには、luaを使用する方がよいでしょう。それでも、超高速です!
NoSqlデータベースのデータは、上記のように冗長な方法で整理する必要があります。これにより、通常の操作に複数のコマンドとラウンドトリップが含まれる場合がありますが、redisのlua機能で対処できます。 redisのlua機能を強くお勧めします。コマンドを1つのネットワークラウンドトリップにラップします。これらはすべてredisサーバー側で実行され、アトミックで超高速です!
わからないことがあれば返信してください