前回に引き続き今回も CloudStructures ネタです。.NET Standard 対応を行ってから来たフィードバックにお応えしたのと、反省点の修正 (?) を行いました。変更点は大きく 3 点あります。
RedisLock型の追加- 非同期メソッドとして提供しているコマンドに
Async接尾詞をつける IRedisStructuresからDefaultExpiryプロパティを切り出す
RedisLock 型の追加
Grani 時代に同僚のみっちぃ (@mitchydeath) から「DistributedLock を作れない」と言われました。完全に見落としてました...。
@xin9le
— ミッチィデス (@mitchydeath) 2019年2月28日
DistributedLockを実現するためにIDatabase.LockTake, LockReleaseを使いたいんですけど、今ってIDatabaseを直接触る手段ってない感じですかね??
ということで、それを可能にするためのコマンド群を RedisLock として追加しました。いい感じにラップすれば C# 8.0 で提供されそうな IAsyncDisposable にも対応できるんじゃないかと思います。
命名規則の変更
これまで CloudStructures は Redis コマンド関連のメソッドに Async の接尾詞をつけていませんでした。非同期メソッドだけど!これは昔の @neuecc さんの blog に書いてありますが、「悩んだけど消した」という歴史的な理由に依ります。
ですが「やっぱり付けた方がいいよね」ということで、破壊的変更 MAX ではありますが付けて回りました。非同期メソッドには Async を付けましょう!
IRedisStructureWithExpiry を新設
RedisString や RedisLock のようなコマンド型は基底インターフェースとして IRedisStructure を持っています。これまでそこに DefaultExpiry プロパティを持っていたのですが、RedisLock や RedisLua のような型では DefaultExpiry プロパティを利用していないという現実がありました。これはプロパティを持っているだけ無駄なので、DefaultExpiry プロパティを持っているインターフェースと持っていないインターフェースに分離しました。
public interface IRedisStructure { RedisConnection Connection { get; } RedisKey Key { get; } } public interface IRedisStructureWithExpiry : IRedisStructure { TimeSpan? DefaultExpiry { get } } public readonly struct RedisLock<T> : IRedisStructure{} public readonly struct RedisString<T> : IRedisStructureWithExpiry{}
これも十分に破壊的変更ですが、あるべき姿により近づくと思って導入しました。