Muszę przechowywać listę danych w pamięci podręcznej.

Czasami potrzebuję pełnej listy, a czasami wystarczy zapytanie o wyniki i zwrócenie jednego elementu z listy.

Aktualna logika dla jednego elementu jest następująca:

User result;
var cachedUsers = _cache.Get<List<User>>(Constants.Cache.UsersKey);
if( cachedUsers != null)
{
    result = cachedUsers.FirstOrDefault(u => u.UserID == userID);

    if (result != null)
        return result;
}

result = GetUserFromDb(userID);

if (cachedUsers != null)
{
    cachedUsers.Add(result);
    _cache.Store(StoreMode.Set, Constants.Cache.UsersKey, cachedUsers);
}

return result;

Czy mogę uzyskać dostęp do jednego elementu bezpośrednio z pamięci podręcznej bez wczytywania pełnej listy użytkowników? Potrzebowałbym również logiki, aby dodać użytkownika do pamięci podręcznej bez ładowania pełnej listy i nadpisywania jej.

EDYCJA: Mam możliwość przechowywania elementów oddzielnie od listy lub pisania pamięci podręcznej od zera z innym podejściem.

Jaki jest najlepszy sposób na zaimplementowanie tej logiki?

2
Fedor Hajdu 29 sierpień 2012, 14:41

2 odpowiedzi

Najlepsza odpowiedź

Najbardziej szczegółową czynnością, jaką możesz wykonać, jest pobranie określonego klucza. Jeśli przechowujesz listę przedmiotów pod tym kluczem, otrzymasz listę. Aby otrzymać dokładnie jeden przedmiot, musisz przechowywać przedmiot na klucz.

Istnieją różne strategie, ale należy pamiętać, że atomowość jest na kluczowym poziomie, więc wykonywanie działań na wielu klawiszach może spowodować wyścig.

Osobiście dodałbym niestandardową serializację twojej listy (zamiast polegać na domyślnej serializacji .NET), ponieważ będzie to dość szybkie. Ale zależy to od tego, ile razy „czasami” jest mowa o aktualizowaniu pojedynczych kluczy lub żądaniu pojedynczych kluczy. Zdrowy rozsądek „przechowuj to tak, jak będziesz go używać”.

Do niestandardowej serializacji używamy Protobuf-net i przechowujemy wynikowy byte[] do pamięci podręcznej ręcznie - tak jak w pamięci podręcznej pobiera i daje byte[] i robimy serializację ręcznie.

2
Adam Houldsworth 29 sierpień 2012, 17:28

Krótka odpowiedź brzmi: nie. Zbuforowałeś całą listę, a pamięć podręczna to dumb, nie wie, co buforowałeś, tylko że zbuforowałeś blok danych. Musisz to wszystko wycofać.

Jednak kiedyś udało mi się to obejść, buforując poszczególne elementy z ustawionym wzorcem klucza, a następnie osobno buforując indeks listy. Jednak zarządzanie było dość żmudne, a następnie masz wiele obiektów z własnym czasem życia pamięci podręcznej.

1
Lloyd 29 sierpień 2012, 14:45