очень простое кеширование - это нормально техника? - PullRequest
1 голос
/ 07 апреля 2009

Я использую следующую технику для кэширования некоторых вызовов в моей базе данных - эта функция находится в моем хранилище.

Public Shared Function GetByStoreURL(ByVal StoreURL As String) As Model.Partner

        Dim key As String = StoreURL
        If Current.Cache(key) Is Nothing Then
            Dim objPartner = Model.DB.Select().From(Tables.Partner).Where(Partner.Columns.StoreURL).IsEqualTo(StoreURL.ToString).And(Partner.Columns.IsDeleted).IsNotEqualTo(1).ExecuteSingle(Of Partner)()
            Current.Cache.Add(key, objPartner, Nothing, Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(60), CacheItemPriority.NotRemovable, Nothing)
        End If

        Return DirectCast(Current.Cache(key), Model.Partner)

    End Function

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

Ответы [ 3 ]

3 голосов
/ 07 апреля 2009

Единственная проблема с этим, если вы хотите сделать кеш недействительным (из-за изменения данных) и работаете в среде с кластеризацией нагрузки. Если это возможно, вы можете добавить файловую зависимость или посмотреть на систему распределенного кэширования, такую ​​как Velocity.

Если вам не нужно этого делать, вам не нужно масштабировать и вы не против иметь потенциально «устаревшие» записи, тогда это нормально: -)

1 голос
/ 07 апреля 2009

На самом деле, здесь много чего плохого, наиболее очевидным из которых является нарушение принципа единственной ответственности . По сути, ваша функция должна выполнять только одну строго определенную задачу (то есть извлечь Partner из БД).

Далее идет многопоточность. Веб-сайты по своей сути являются многопоточными, поэтому это следует учитывать. Более конкретно, элемент может быть удален из кэша между вызовами If Current.Cache(key) Is Nothing и Return DirectCast(Current.Cache(key), Model.Partner). Для решения этой проблемы требуется блокировка, но это еще больше раздувает функцию (см. Первый абзац).

Кроме того, элемент может быть добавлен в кеш, пока выполняется код вашей БД. Это приведет к ошибке, поскольку Cache.Add не перезаписывает значения одним и тем же ключом, который уже будет там (например, многопоточность).

И, наконец, я подвергаю сомнению уникальность StoreURL.

0 голосов
/ 07 апреля 2009

Этот метод известен как ленивая инициализация . Да, он широко используется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...