边缘缓存模式(Cache-Aside Pattern),即按需将数据从数据存储加载到缓存中。此模式最大的作用就是提高性能减少不必要的查询。

1 模式

  1. 先从缓存查询数据
  2. 如果没有命中缓存则从数据存储查询
  3. 将数据写入缓存
  代码形如:
复制代码
        public async Task<MyEntity> GetMyEntityAsync(int id)         {             // Define a unique key for this method and its parameters.              var key = string.Format("StoreWithCache_GetAsync_{0}", id);             var expiration = TimeSpan.FromMinutes(3);             bool cacheException = false;             try             {                 // Try to get the entity from the cache.                    var cacheItem = cache.GetCacheItem(key);                 if (cacheItem != null)                 {                     return cacheItem.Value as MyEntity;                 }             }             catch (DataCacheException)             {                 // If there is a cache related issue, raise an exception                      // and avoid using the cache for the rest of the call.                    cacheException = true;             }             // If there is a cache miss, get the entity from the original store and cache it.               // Code has been omitted because it is data store dependent.                var entity = ...;             if (!cacheException)             {                 try                 {                     // Avoid caching a null value.                          if (entity != null)                     {                         // Put the item in the cache with a custom expiration time that                                  // depends on how critical it might be to have stale data.                                cache.Put(key, entity, timeout: expiration);                     }                 }                 catch (DataCacheException)                 {                     // If there is a cache related issue, ignore it                           // and just return the entity.                    }             }             return entity;         }          public async Task UpdateEntityAsync(MyEntity entity)         {             // Update the object in the original data store              await this.store.UpdateEntityAsync(entity).ConfigureAwait(false);             // Get the correct key for the cached object.              var key = this.GetAsyncCacheKey(entity.Id);             // Then, invalidate the current cache object              this.cache.Remove(key);         }          private string GetAsyncCacheKey(int objectId)         {             return string.Format("StoreWithCache_GetAsync_{0}", objectId);         }