xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

CloudStructures now supports .NET Standard!!

Grani 時代から Redis 操作ライブラリとして長く愛用してきた CloudStructures ですが、残念ながらこれまで .NET Core に対応していませんでした。ただ、こればっかりはさすがの @neuecc 先生もあれもこれもメンテするのは難しいので仕方ない!.NET Core 対応済みの王道ライブラリは StackExchange.Redis だと思いますが、余りにプリミティブ過ぎて使い勝手が良いとは言えません。もはや CloudStructures がないと生きていけない体にされてしまった...(罪深い

f:id:xin9le:20190228223150p:plain

と言うことで意を決して .NET Core 対応をしようと思い立ち、2018 年 6 月頃から勝手に Fork (コピー) してヒッソリと作業を始めました。半年以上プライベートで使っていたのですが、.NET Core 3.0 のリリースも近づいている今、より盛り上げるためにも本家に入れてもらえるように @neuecc 先生に話をして承認いただき、ついに正式に .NET Standard 版となりました!

主な変更点

使用感としてはそこまで変わらないのですが、以前のバージョンと比べるとかなりの破壊的変更が加わっています。リリース当時から比べると Managed な Redis でクラスター環境が提供されるようになったり、依存していたライブラリやフレームワークの環境も相当に変化していて、そういった補完していた部分だったりを今風に適応/アレンジしました。また、近年は C#/.NET もパフォーマンス最適化が命題となってきているので、その辺りにも最大限気を配ってみました。

リファクタリング系

  • RedisSettings / RedisGroupRedisConnection に一本化
  • RedisString に含まれていた Bit 関連のコマンドを RedisBit として切り出し
  • Geo 関連コマンドを RedisGeo として新設
  • RedisClass を削除
    • Grani の中でもほとんど使われてなかった
  • RedisSubject を削除
    • これは元々別パッケージとして提供されていたので一旦削除
    • 今後対応を考えるかも
  • IServerSelector を削除
    • 自前でロードバランスするのではなく Cluster 化された Managed Redis を使う方が時代に即してそう
  • TraceHelper を削除
  • app.config / web.config からの設定読み込み機能を削除
  • Glimpse サポートを削除
    • Glimpse が .NET Core に対応していないため

パフォーマンス改善系

  • RedisString などを class から struct に変更
    • ほとんどのケースでインスタンスの生存期間が非常に短くスコープも狭いため、ヒープアロケーションを避けるべきと判断
  • ラムダ式の変数キャプチャを完全に排除
  • ボックス化を完全に排除
    • 特に ValueConverter 周りの仕組みを思い切り改善

まとめ

CloudStructures を隅から隅まで全部読んで書き換えたこともあって、だいぶ理解が深まりました。パフォーマンス改善関連もすでに世の中で実現されているテクニックのいくつかを真似しているだけですが、そういったところに細心の注意を払うってすごく地道だし大変って実感しました。ほんと、すごく勉強になりました。

あとライブラリの Contributor にしていただいたので、何かあれば Pull Request などいただければ!.NET で Redis を扱うときには是非 CloudStructures を使ってみてくださいね!