HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>В современном мире разработки каждый проект собирает аналитику. На основе данных можно лучше понимать пользователей и их потребности. Одна из часто встречающихся задач в этой сфере - подсчет уникальных посещений веб-страниц.</p>
1 <p>В современном мире разработки каждый проект собирает аналитику. На основе данных можно лучше понимать пользователей и их потребности. Одна из часто встречающихся задач в этой сфере - подсчет уникальных посещений веб-страниц.</p>
2 <p>Представим, что разрабатывается популярный медиаресурс. Посещаемость веб-сайта примерно равна 500 млн. уникальных посетителей в сутки. Перед нами стоит задача: кэшировать количество посещений каждой страницы с возможностью быстрой записи/чтения и получения общей статистики по нескольким страницам. Каждое уникальное посещение определяется IP адресом.</p>
2 <p>Представим, что разрабатывается популярный медиаресурс. Посещаемость веб-сайта примерно равна 500 млн. уникальных посетителей в сутки. Перед нами стоит задача: кэшировать количество посещений каждой страницы с возможностью быстрой записи/чтения и получения общей статистики по нескольким страницам. Каждое уникальное посещение определяется IP адресом.</p>
3 <h3>Redis Sets</h3>
3 <h3>Redis Sets</h3>
4 <p>Для начала можно использовать встроенную в Redis структуру данных Sets. Sets хранят набор уникальных значений, а также имеют функции для подсчета пересечений.</p>
4 <p>Для начала можно использовать встроенную в Redis структуру данных Sets. Sets хранят набор уникальных значений, а также имеют функции для подсчета пересечений.</p>
5 <p>Кажется, что структура данных Sets хорошо подходит под задачу и полностью ее решает. Но это не совсем так. Redis Sets решает задачу подсчета уникальных посетителей на маленьких и средних сайтах. С учетом того, что в задаче указано 500 млн. посещений в сутки, ресурс нагруженный. Чтобы хранить все эти данные в Sets, потребуется много оперативной памяти. Также время чтения будет высоким, потому что при подсчете пересечений Redis придется перебирать сотни миллионов значений.</p>
5 <p>Кажется, что структура данных Sets хорошо подходит под задачу и полностью ее решает. Но это не совсем так. Redis Sets решает задачу подсчета уникальных посетителей на маленьких и средних сайтах. С учетом того, что в задаче указано 500 млн. посещений в сутки, ресурс нагруженный. Чтобы хранить все эти данные в Sets, потребуется много оперативной памяти. Также время чтения будет высоким, потому что при подсчете пересечений Redis придется перебирать сотни миллионов значений.</p>
6 <h2>Redis HyperLogLog</h2>
6 <h2>Redis HyperLogLog</h2>
7 <p>В Redis есть структура данных HyperLogLog для хранения огромного количества уникальных событий, которая занимает постоянный объем памяти. HyperLogLog - это вероятностная структура, что означает, при большом наборе данных подсчет количества элементов может иметь ошибку до 0.81%. Например, подсчет 10 миллионов событий может иметь погрешность до 81 тыс. Допустимость такой ошибки зависит от проекта.</p>
7 <p>В Redis есть структура данных HyperLogLog для хранения огромного количества уникальных событий, которая занимает постоянный объем памяти. HyperLogLog - это вероятностная структура, что означает, при большом наборе данных подсчет количества элементов может иметь ошибку до 0.81%. Например, подсчет 10 миллионов событий может иметь погрешность до 81 тыс. Допустимость такой ошибки зависит от проекта.</p>
8 <p>HyperLogLog подходит только для подсчета количества событий и их пересечений.</p>
8 <p>HyperLogLog подходит только для подсчета количества событий и их пересечений.</p>
9 <h3>Запись</h3>
9 <h3>Запись</h3>
10 <p>Для записи данных в HyperLogLog используется команда pfadd key [element [element ...]]:</p>
10 <p>Для записи данных в HyperLogLog используется команда pfadd key [element [element ...]]:</p>
11 <p>При успешной записи новых значений возвращается 1. Если попытаться вставить существующее значение, то вернется 0:</p>
11 <p>При успешной записи новых значений возвращается 1. Если попытаться вставить существующее значение, то вернется 0:</p>
12 <h3>Чтение</h3>
12 <h3>Чтение</h3>
13 <p>Чтобы получить количество уникальных посетителей, используется команда pfcount key [key ...]:</p>
13 <p>Чтобы получить количество уникальных посетителей, используется команда pfcount key [key ...]:</p>
14 <p>Рассчитать количество уникальных посетителей нескольких страниц можно командой pfmerge destkey sourcekey [sourcekey ...]:</p>
14 <p>Рассчитать количество уникальных посетителей нескольких страниц можно командой pfmerge destkey sourcekey [sourcekey ...]:</p>
15 <p>Команда pfmerge сливает несколько HyperLogLog ключей в один. В примере выше результат сохранился в ключе<em>articles</em>.</p>
15 <p>Команда pfmerge сливает несколько HyperLogLog ключей в один. В примере выше результат сохранился в ключе<em>articles</em>.</p>
16 <h2>Резюме</h2>
16 <h2>Резюме</h2>
17 <ul><li>Redis Sets подходит для подсчета уникальных событий, но не используется при большом количестве данных</li>
17 <ul><li>Redis Sets подходит для подсчета уникальных событий, но не используется при большом количестве данных</li>
18 <li>Redis HyperLogLog - вероятностная структура данных, которая эффективно хранит и читает большое количество уникальных событий</li>
18 <li>Redis HyperLogLog - вероятностная структура данных, которая эффективно хранит и читает большое количество уникальных событий</li>
19 <li>для добавления данных в HyperLogLog используется команда pfadd</li>
19 <li>для добавления данных в HyperLogLog используется команда pfadd</li>
20 <li>подсчет событий в HyperLogLog осуществляется командой pfcount</li>
20 <li>подсчет событий в HyperLogLog осуществляется командой pfcount</li>
21 <li>слить несколько HyperLogLog структур в одну можно с помощью команды pfmerge</li>
21 <li>слить несколько HyperLogLog структур в одну можно с помощью команды pfmerge</li>
22 </ul>
22 </ul>