Уменьшение массива в сочетании с 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)
Наше решение состоит в том, чтобы поддержать таблицу "Transaction" (который следует за тем, что было сделано), в дополнение к нашей таблице "Session" (который следует, кто был здесь). ОБНОВЛЕНИЕ, ВСТАВЬТЕ и УДАЛИТЕ инструкции, все управляются через объект "Транзакции" и каждый из этих, инструкция SQL хранится в таблице "Transaction", после того как это было успешно выполнено на базе данных (в зависимости от обновленных таблиц: у нас есть возможность конкретно следовать за некоторыми таблицами и проигнорировать других). Эта таблица "Transaction" имеет другие поля, такие как transactiontType (я для ВСТАВКИ, D для УДАЛЯЮ, U для ОБНОВЛЕНИЯ), transactionDateTime, и т.д., и внешний ключ "sessionId", говоря нам наконец, кто отправил инструкцию. Даже возможно через некоторый код, определить, кто сделал, какой и когда (Gus создал запись в понедельник, Tim изменил Цену за единицу товара во вторник, Liz добавила особую скидку в четверг, и т.д.).
Профессионалы для этого решения:
Недостатки
Наш выбор: все записи, более старые, чем 90 дней, автоматически удаляются каждое утро
Я видел, что стратегия 1 работает прежде. Конечно, сайт был маленьким.
Интересно, как сайт как stackoverflow делает это?
Они должны предназначаться для определенного события, когда я просто оснастил вокруг сайта, смотрите на мой профиль, и все еще говорит что-то как последний, замеченный 8 минут назад.
Я просто отбросил бы таблицу записи журнала в дб.
Интервал UserId FK
Символ действия (3) ('в' или)
Время DateTime
Можно отбросить новую запись в таблице, когда кто-то входит в систему или или альтернативно обновите последнюю запись для пользователя.
Можно увеличить глобальную переменную каждый раз, сеанс пользователя создается, и постепенно уменьшите его, когда он уничтожается. Таким образом, Вы будете всегда знать, сколько пользователей онлайн в любой данный момент.
Если Вы хотите контролировать его со временем, с другой стороны, я думаю, регистрируя сессию, запускаются и заканчиваются к базе данных, наилучший вариант, и Вы вычисляете пользовательское действие после факта с простым запросом.
Если у Вас есть данные сессии, просто используют это. Большинство систем сессии уже имеет метки времени, таким образом, они могут истечь сессии, не используемые в течение x минут.
Единственная проблема с решением для веб-приложения - Вы, часто не знают, когда кто-то выписывается. Очевидно, если у Вас есть вход в систему / требование аутентификации, можно получить, когда человек входит в систему, и как часть кода доступа к данным, можно зарегистрироваться, когда человек поражает базу данных. Но необходимо будет признать, что будет на надежном способе получить, когда человек выйдет из системы - многие просто переедут от сайта, не принимая меры "выхода".
[ПРАВОВАЯ ОГОВОРКА 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>
Надеюсь, это поможет.
С веб-приложением понятие "онлайн" немного туманно. Лучшее, которое можно действительно сделать, "выполнено запрос в последнем X минут" или возможно "аутентифицируемое в последнем X минут".
Выберите ряд событий (выполненный запрос, выполненное обновление, аутентифицируемое...), и зарегистрируйте их к Таблице базы данных.
Зарегистрируйте их к таблице в отдельном DB
Я предположил бы, что использование триггера будет разумной опцией, которая устранила бы Вас от необходимости смешать с любыми логическими различиями между сетью и невеб-средой (или любой другой средой в этом отношении). Однако это только получает изменения в среде и ничего не делает, когда избранные операторы сделаны. Это, однако, может быть преодолено, если все Ваши команды из Ваших приложений выполняются через хранимые процедуры.
Я работал со многими системами, которые использовали первый метод, который Вы перечислили, с небольшим тщательным планированием его может быть сделан способом, который действительно не имеет большую часть эффекта.
Все это зависит от точно when/how/what, Вы пытаетесь отследить. Если необходимо отследить несколько сессий, я буду обычно видеть людей, которые используют систему сессии, связанную с учетной записью пользователя, и затем к определенному прошедшему времени, когда сессия является consiered мертвыми.
Если Вы действительно ищете в настоящее время онлайн, Ваш первый вариант является наилучшим.