Стратегия отслеживания пользователя недавнее действие

Уменьшение массива в сочетании с For in для циклического перебора ключей объектов в них получит то, что вы хотите.

a = [ { JavaScript: 41837, Batchfile: 47 },
  { 'C#': 7484 },
  { Batchfile: 110 },
  { Scala: 50597 },
  { Java: 18180 },
  { Java: 55689 } ]

  result = {}

  b = a.reduce((result, item) => {
    for (let eachKey in item) {
      const curSum = result[eachKey] || 0;;
      result[eachKey] = curSum + item[eachKey];
    }
    return result;
  }, result)
10
задан niton 18 April 2015 в 21:28
поделиться

11 ответов

Наше решение состоит в том, чтобы поддержать таблицу "Transaction" (который следует за тем, что было сделано), в дополнение к нашей таблице "Session" (который следует, кто был здесь). ОБНОВЛЕНИЕ, ВСТАВЬТЕ и УДАЛИТЕ инструкции, все управляются через объект "Транзакции" и каждый из этих, инструкция SQL хранится в таблице "Transaction", после того как это было успешно выполнено на базе данных (в зависимости от обновленных таблиц: у нас есть возможность конкретно следовать за некоторыми таблицами и проигнорировать других). Эта таблица "Transaction" имеет другие поля, такие как transactiontType (я для ВСТАВКИ, D для УДАЛЯЮ, U для ОБНОВЛЕНИЯ), transactionDateTime, и т.д., и внешний ключ "sessionId", говоря нам наконец, кто отправил инструкцию. Даже возможно через некоторый код, определить, кто сделал, какой и когда (Gus создал запись в понедельник, Tim изменил Цену за единицу товара во вторник, Liz добавила особую скидку в четверг, и т.д.).

Профессионалы для этого решения:

  1. Вы можете сказать "что кто и когда" и показать его Вашим пользователям! (Вам будет нужен некоторый код для анализа SQL-операторов),
  2. если Ваши данные копируются, и сбои репликации, можно восстановить базу данных через эту таблицу

Недостатки

  1. 100 000 обновлений данных в месяц означают 100 000 записей в Tbl_Transaction
  2. Наконец, эта таблица имеет тенденцию быть 99% Вашего объема базы данных

Наш выбор: все записи, более старые, чем 90 дней, автоматически удаляются каждое утро

5
ответ дан 4 December 2019 в 02:27
поделиться

Я видел, что стратегия 1 работает прежде. Конечно, сайт был маленьким.

2
ответ дан 4 December 2019 в 02:27
поделиться

Интересно, как сайт как stackoverflow делает это?

Они должны предназначаться для определенного события, когда я просто оснастил вокруг сайта, смотрите на мой профиль, и все еще говорит что-то как последний, замеченный 8 минут назад.

1
ответ дан 4 December 2019 в 02:27
поделиться

Я просто отбросил бы таблицу записи журнала в дб.

Интервал UserId FK
Символ действия (3) ('в' или)
Время DateTime

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

0
ответ дан 4 December 2019 в 02:27
поделиться

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

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

0
ответ дан 4 December 2019 в 02:27
поделиться

Если у Вас есть данные сессии, просто используют это. Большинство систем сессии уже имеет метки времени, таким образом, они могут истечь сессии, не используемые в течение x минут.

0
ответ дан 4 December 2019 в 02:27
поделиться

Единственная проблема с решением для веб-приложения - Вы, часто не знают, когда кто-то выписывается. Очевидно, если у Вас есть вход в систему / требование аутентификации, можно получить, когда человек входит в систему, и как часть кода доступа к данным, можно зарегистрироваться, когда человек поражает базу данных. Но необходимо будет признать, что будет на надежном способе получить, когда человек выйдет из системы - многие просто переедут от сайта, не принимая меры "выхода".

0
ответ дан 4 December 2019 в 02:27
поделиться

[ПРАВОВАЯ ОГОВОРКА 1---решение для Java]

Если каждому значимому пользователю дают Сессию, то Вы могли записать свою собственную реализацию SessionListener для отслеживания каждой сессии, которая была создана и уничтожена.

[ПРАВОВАЯ ОГОВОРКА 2---Код, не протестированный или скомпилированный]

public class ActiveSessionsListener implements HttpSessionListener {
    public void sessionCreated(HttpSessionEvent e) {
        ServletContext ctx = e.getSession().getServletContext();
        synchronized (ctx) {
            Integer count = ctx.getAttribute("SESSION_COUNT");
            if (count == null) { count = new Integer(0); }
            ctx.setAttribute("SESSION_COUNT", new Integer(count.intValue() + 1);
        }
    }
    public void sessionDestroyed(HttpSessionEvent e) {
        ... similar for decrement ...    
    }
}

И зарегистрируйте это в своем web.xml:

<listener-class>com.acme.ActiveSessionsListener</listener-class>

Надеюсь, это поможет.

0
ответ дан 4 December 2019 в 02:27
поделиться

С веб-приложением понятие "онлайн" немного туманно. Лучшее, которое можно действительно сделать, "выполнено запрос в последнем X минут" или возможно "аутентифицируемое в последнем X минут".

Выберите ряд событий (выполненный запрос, выполненное обновление, аутентифицируемое...), и зарегистрируйте их к Таблице базы данных.

Зарегистрируйте их к таблице в отдельном DB

0
ответ дан 4 December 2019 в 02:27
поделиться

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

0
ответ дан 4 December 2019 в 02:27
поделиться

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

Все это зависит от точно when/how/what, Вы пытаетесь отследить. Если необходимо отследить несколько сессий, я буду обычно видеть людей, которые используют систему сессии, связанную с учетной записью пользователя, и затем к определенному прошедшему времени, когда сессия является consiered мертвыми.

Если Вы действительно ищете в настоящее время онлайн, Ваш первый вариант является наилучшим.

0
ответ дан 4 December 2019 в 02:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: