Пример кеширования статичными переменными


2 0

В прошлой заметке мы рассмотрели теоретический пример, а теперь перейдем к практическому. У меня на сайте клиента есть система подсчета профиля, чтобы узнать, что больше любит посетитель. Например, на ozon это может выглядеть как - просмотрел страничку с книжкой, получи один поинт в пользу книголюба. Просмотрел косметику, получи один поинт в пользу гламурного падонка.

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

Но разные действия стоят разных поинтов. Например, если я просто посмотрел товар на сайте, то можно дать 1 поинт, а если я его положил в карзину, то 5, а если еще и купил, то 10.

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

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

Создаем статичные переменные для основных действий (их же немного, у меня их всего 7, хотя я вам показал только три и я решил объявить их явно):

public static ProfileAction ProductView;
public static ProfileAction AddWishList;
public static ProfileAction AddToCart;

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

class MemberProfileAction
{
   public static ProfileAction ProductView;
   public static ProfileAction AddWishList;
   public static ProfileAction AddToCart;

   static MemberProfileAction() {
       ProductView = LoadProfileAction("PV");
       AddWishList = LoadProfileAction("ADDWL");
       AddToCart = LoadProfileAction("ADDCART");
   }
 
  // Дальше идут методы в которых я раздаю поинты и т.д.
 }

LoadProfileAction - это статиичная функция, которая загружает нужный класс по аббревиатуре, которую я передаю в качестве параметра.

Один раз при первом обращении загружаются все параметры действий и после этого база данных вообще не тревожится по таким мелочам.


Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым


Комментарии

Zergatul

09 Ноября 2012

Вместо того, что бы делать 2 запроса (считать запись с ProfileAction, а потом изменить количество поинтов), делается один запрос (на апдейт поинтов). Такая оптимизация не особо поможет в этом случае.


Михаил Фленов

09 Ноября 2012

делается один запрос (на апдейт поинтов


1. Обновить на сколько - 1 поинт, 2, 3, 10? Это информация хранится в ProfileAction. Искать количество поинтов в ProfileAction прямо во время вставки, все равно ненужная нагрузка. Да, небольшая, но это нагрузка. Когда сайт посещают 10-ки тысяч пользователей в час, эта нагрузка серьезная и на фиг не нужная.

2. Кстати, обновления нет, есть только вставка данных в базу

3. В моем случае есть еще дополнительные параметры, в зависимости от действия и мне нужно в приложении знать, сколько поинтов я дал. Мне даже нужно знать до, того как я дал.

4. Писать одним запросом - жесткая привязанность, которую я избегаю в своем коде.

Это же всего лишь общий пример.


Добавить Комментарий

Еще что-нибудь

Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне