2016-05-09 3 views
0
***Just for learning purpose*** 

Недавно я только что знал механизм кеша и кеш-слова и, как правило, понимаю, что механизм кэширования - это хорошая вещь для производительности системы и уменьшения числа взаимодействий с базой данных.Механизм кэша для .NET.

И, основываясь на разговоре с кем-то другим, они рассказали мне общую идею о том, что мы можем создать независимую библиотеку и кэшировать данные, извлекаемые из базы данных, и как только это нам понадобится в нашем бизнес-слое, мы можем получить ее из кэш-памяти.

И они также поделились чем-то, но не очень подробным, что база данных может автоматически обновлять уровень кэша при обновлении данных в базе данных, таких как обновление, добавление и удаление.

Итак, возникают вопросы, как база данных знает и обновляет уровень кэша проактивно и автоматически? Может ли кто-нибудь поделиться со мной? или существуют ли какие-либо существующие рамки, решения с открытым исходным кодом?

Буду признателен за вашу любезную помощь. Я с нетерпением жду встречи с тобой, мой друг.

+0

Я бы сказал, что вам нужно другое назначение с вашим другом, так что он может ответить на ваши вопросы, основываясь на своем опыте :-) Будут ли ваши пользователи признавать, что они работают с кэшированными (неживыми) данными? Операции с базой данных, которые усложняют кэширование, улучшат общую производительность. Вам нужно подумать обо всех минусах и плюсах, прежде чем задавать детали реализации. –

+0

@PeterBons, спасибо за ваше быстрое предложение. Предположим, что мы сделали анализ, и мы настаиваем на использовании механизма кэширования, есть ли какие-либо решения для рекомендаций, только для целей обучения, если он нам понадобится в один прекрасный день. – Jacob

+0

Управление кэшем должно выполняться на уровне абстракции данных. Вместо того, чтобы запрашивать данные непосредственно из базы данных, переполненной по всему вашему коду, у вас есть своего рода класс провайдера, который обрабатывает данные. Часть этого поиска - управление кешем. Тогда все запросы данных в вашем коде используют этот класс провайдера и альта! – itsme86

ответ

0

Jacob,

Позвольте мне дать вам пример ...

В слое данных, когда мы собираемся, чтобы получить список объектов, которые должны быть кэшированными из базы данных мы могли бы что-то вроде этого ,

if (!CacheHelper.Get("AllRoles", out entities)) 
{ 
var items = _context.Set<Roles>().ToList(); 
entities = items; 
var cachableEntities = entities.ToList(); 
CacheHelper.Add(cachableEntities, "AllRoles"); 
} 

return entities; 

Вы заметите, что у меня есть помощник кэша, который будет искать кэш для ключевого «AllRoles», если он находит кэш будет возвращать объекты из кэша. Если он не сможет найти его, он получит данные из базы данных и создаст кэш с ключом.

Кроме того, каждый раз, когда мы добавляем/удаляем/или изменяем элемент в этой таблице, мы можем просто уничтожить этот кеш.

CacheHelper.Clear(CacheKey); 

Так, отвечая на вопрос, в данном примере база данных не знает, когда воссоздать кэш, логика приложения делает.

Вот образец кэша Помощников вы можете использовать ....

using System; 
using System.Collections.Generic; 
using System.Web; 

namespace Core.Helpers 
{ 
    public static class CacheHelper 
    { 
     public static List<string> GetCacheKeys() 
     { 
      List<string> keys = new List<string>(); 
      // retrieve application Cache enumerator 
      var enumerator = System.Web.HttpRuntime.Cache.GetEnumerator(); 

      while (enumerator.MoveNext()) 
      { 
       keys.Add(enumerator.Key.ToString()); 
      } 

      return keys; 
     } 

     /// <summary> 
     /// Insert value into the cache using 
     /// appropriate name/value pairs 
     /// </summary> 
     /// <typeparam name="T">Type of cached item</typeparam> 
     /// <param name="o">Item to be cached</param> 
     /// <param name="key">Name of item</param> 
     public static void Add<T>(T o, string key) 
     { 
      // NOTE: Apply expiration parameters as you see fit. 
      // I typically pull from configuration file. 

      // In this example, I want an absolute 
      // timeout so changes will always be reflected 
      // at that time. Hence, the NoSlidingExpiration. 
      if (HttpContext.Current != null) 
      HttpContext.Current.Cache.Insert(
       key, 
       o, 
       null, 
       DateTime.Now.AddMinutes(1440), 
       System.Web.Caching.Cache.NoSlidingExpiration); 
     } 

     /// <summary> 
     /// Remove item from cache 
     /// </summary> 
     /// <param name="key">Name of cached item</param> 
     public static void Clear(string key) 
     { 
      if (HttpContext.Current != null) 
      HttpContext.Current.Cache.Remove(key); 
     } 

     /// <summary> 
     /// Check for item in cache 
     /// </summary> 
     /// <param name="key">Name of cached item</param> 
     /// <returns></returns> 
     public static bool Exists(string key) 
     { 
      var exists= HttpContext.Current != null && HttpContext.Current.Cache[key] != null; 
      return exists; 
     } 

     /// <summary> 
     /// Retrieve cached item 
     /// </summary> 
     /// <typeparam name="T">Type of cached item</typeparam> 
     /// <param name="key">Name of cached item</param> 
     /// <param name="value">Cached value. Default(T) if 
     /// item doesn't exist.</param> 
     /// <returns>Cached item as type</returns> 
     public static bool Get<T>(string key, out T value) 
     { 
      try 
      { 
       if (!Exists(key)) 
       { 
        value = default(T); 
        return false; 
       } 

       value = (T)HttpContext.Current.Cache[key]; 
      } 
      catch 
      { 
       value = default(T); 
       return false; 
      } 

      return true; 
     } 
    } 
} 
+0

Большое спасибо @Pmeyer, можно ли поделится со мной кодом? Мой прогноз - [email protected] – Jacob

+0

@Jacob Просто добавил помощник кеша к моим ответам .... – pmeyer

Смежные вопросы