public async Task <T> GetOrSetAsync <T>(string key, TimeSpan?timeToLive, Func <Task <T> > createAsync)
        {
            var item = await this.GetAsync <CacheWrapper <T> >(key).ConfigureAwait(false);

            if (item != null)
            {
                return(item.Value);
            }

            var value = await createAsync().ConfigureAwait(false);

            await this.SetAsync(key, CacheWrapper <T> .For(value), timeToLive).ConfigureAwait(false);

            return(value);
        }
 public async Task SetAsync <T>(string key, T value, TimeSpan?timeToLive)
 {
     await this.RawSetAsync(key, CacheWrapper <T> .For(value), timeToLive).ConfigureAwait(false);
 }