Grani 時代から Redis 操作ライブラリとして長く愛用してきた CloudStructures ですが、残念ながらこれまで .NET Core に対応していませんでした。ただ、こればっかりはさすがの @neuecc 先生もあれもこれもメンテするのは難しいので仕方ない!.NET Core 対応済みの王道ライブラリは StackExchange.Redis だと思いますが、余りにプリミティブ過ぎて使い勝手が良いとは言えません。もはや CloudStructures がないと生きていけない体にされてしまった...(罪深い
と言うことで意を決して .NET Core 対応をしようと思い立ち、2018 年 6 月頃から勝手に Fork (コピー) してヒッソリと作業を始めました。半年以上プライベートで使っていたのですが、.NET Core 3.0 のリリースも近づいている今、より盛り上げるためにも本家に入れてもらえるように @neuecc 先生に話をして承認いただき、ついに正式に .NET Standard 版となりました!
主な変更点
使用感としてはそこまで変わらないのですが、以前のバージョンと比べるとかなりの破壊的変更が加わっています。リリース当時から比べると Managed な Redis でクラスター環境が提供されるようになったり、依存していたライブラリやフレームワークの環境も相当に変化していて、そういった補完していた部分だったりを今風に適応/アレンジしました。また、近年は C#/.NET もパフォーマンス最適化が命題となってきているので、その辺りにも最大限気を配ってみました。
リファクタリング系
RedisSettings
/RedisGroup
をRedisConnection
に一本化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 を使ってみてくださいね!