/// <summary> /// Очистить кеш /// </summary> public void Clear() { for (int i = 0; i < CacheMemory.Length; i++) { CacheMemory[i] = new CachObj(); } }
/// <summary> /// Положить данные в кеш /// </summary> /// <param name="key"></param> /// <param name="value"></param> public void Put(object key, object value) { //Initializing fields int emptyIndex = 0; Boolean isSingleEntryEmpty = false; Boolean cacheUpdated = false; //Получить промежуток массива на основе Id int ID = GetHash(key); int startIndex = GetStartIndex(ID); int endIndex = GetEndIndex(startIndex); CachObj newCacheEntry = new CachObj(key, value, null, ID); newCacheEntry.AD = replacementAlgo.GetReplasmentMark(newCacheEntry); for (int i = startIndex; i <= endIndex; i++) { // Определить есть ли свободная строка в этом промежутке if (CacheMemory[i].IsEmpty && !isSingleEntryEmpty) { emptyIndex = i; isSingleEntryEmpty = true; continue; } // Обновить данные в кеше if (CacheMemory[i].Id == ID) { CacheMemory[i] = newCacheEntry; cacheUpdated = true; break; } else { continue; } } // Если не нашли еще объект в кеше и есть пуста строка, то положить объект в пустую строку if (isSingleEntryEmpty && !cacheUpdated) { CacheMemory[emptyIndex] = newCacheEntry; cacheUpdated = true; } // Если кеш не был обновлен, значит все строки заняты, почистить строку и положить туда объект if (!cacheUpdated) { int evictedIndex = replacementAlgo.GetEvictedIndex(startIndex, endIndex, CacheMemory); CacheMemory[evictedIndex] = newCacheEntry; } }
public object GetReplasmentMark(CachObj cachObj) { long milliseconds = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; return(milliseconds); }