前回に引き続き今回も 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{}
これも十分に破壊的変更ですが、あるべき姿により近づくと思って導入しました。