Redis поддерживает 5 типов данных: string (строка), hash (хэш), list (список), set (коллекция) и zset (отсортированный набор: упорядоченный набор). Когда использовать Redis?
Давайте сначала разберемся, как эти разные типы данных описываются в системе управления внутренней памятью Redis с помощью рисунка:
Прежде всего, Redis использует объект redisObject для представления всех ключей и значений.Основная информация о redisObject показана на рисунке выше: тип представляет собой конкретный тип данных объекта значения, а кодирование — это метод хранения различных типов данных в redis, например: type=string означает, что хранимое значение является обычной строкой, тогда соответствующая кодировка может быть raw или int, если это int, это означает, что фактическое внутреннее хранилище redis и представление строки в соответствии с числовым тип, конечно, помещение это Сама строка может быть представлена числовым значением, например: "123" "456" таких строк.
Здесь нам нужно конкретно объяснить поле vm. Только когда функция виртуальной памяти Redis включена, это поле фактически выделяет память. Эта функция по умолчанию отключена. Из приведенного выше рисунка видно, что Redis использует redisObject для представления всех данных типа «ключ-значение», что является пустой тратой памяти.Конечно, эти затраты на управление памятью в основном связаны с обеспечением унифицированного интерфейса управления для различных типов данных Redis. фактический автор также предоставляет Существуют различные способы помочь нам минимизировать использование памяти, которые мы подробно обсудим позже.
1. строка
stringЯвляется самым базовым типом Redis, его можно понимать как тот же тип, что и Memcached, ключ соответствует значению. На самом деле value — это не только String, но и число. Строковый тип является двоично-безопасным. Означает, что строка redis может содержать любые данные. Например, изображения в формате jpg или сериализованные объекты. Строковый тип является самым основным типом данных Redis, и значение строкового типа может хранить до 512 МБ.
Общие команды: get, set, incr, decr, mget и т. д.
Сценарий применения: String является наиболее часто используемым типом данных, и обычное хранилище ключей/значений может быть отнесено к этой категории, то есть текущие функции Memcached могут быть полностью реализованы, а эффективность выше. Вы также можете наслаждаться сохраняемостью Redis по времени, журналами операций и функциями репликации. В дополнение к таким же операциям get, set, incr, decr и другим, что и Memcached, Redis также предоставляет следующие операции:
- получить длину строки
- добавить содержимое в строку
- Установить и получить раздел строки
- Установите и получите немного строки
- Пакетный набор содержимого серии строк
Сценарий использования: обычное приложение кэширования ключ-значение. Регулярный подсчет: подсчет Weibo, подсчет подписчиков. Метод реализации: строка, хранящаяся в redis, по умолчанию является строкой, на которую ссылается redisObject.При возникновении операций incr, decr и других она будет преобразована в числовой тип для вычисления.В настоящее время поле кодирования redisObject внутр.
redis 127.0.0.1:6379> SET name "runoob"
"OK" redis 127.0.0.1:6379> GET name
"runoob"
В приведенном выше примере мы использовали RedisSET и GET Заказ. Ключ — это имя, а соответствующее значение —runoob. **Примечание.** Ключ может хранить до 512 МБ.
2. Хэш
Hashпредставляет собой набор пар ключ-значение (ключ => значение). Хэш Redis — это таблица сопоставления поля и значения строкового типа, а хэш особенно подходит для хранения объектов. Общие команды: hget, hset, hgetall и т. д. Сценарий приложения: Кратко опишем сценарий применения Hash на примере.Например, мы хотим хранить данные объекта информации о пользователе, включая следующую информацию:
Идентификатор пользователя является ключом поиска, а пользовательский объект хранимого значения содержит такую информацию, как имя, возраст, день рождения и т. д. Если он хранится в общей структуре ключ/значение, в основном существуют следующие два метода хранения:
Первый метод использует идентификатор пользователя в качестве ключа поиска, а другую информацию инкапсулирует в объект и сохраняет ее в сериализованном виде. Недостаток этого метода заключается в том, что он увеличивает накладные расходы на сериализацию/десериализацию и требует изменения одного из Когда информация извлечена, необходимо получить весь объект, а операция модификации должна защитить параллелизм и создать сложные проблемы, такие как CAS.
Второй метод состоит в том, чтобы хранить столько пар ключ-значение, сколько имеется в объекте информации о пользователе, и использовать идентификатор пользователя + имя соответствующего атрибута в качестве уникального идентификатора для получения значения соответствующего атрибута, несмотря на накладные расходы на сериализацию и проблемы параллелизма. удаляются. , но идентификатор пользователя сохраняется повторно. Если таких данных много, потери памяти все равно очень значительны.
Тогда хеш, предоставленный Redis, очень хорошо решает эту проблему.Хеш Redis на самом деле является HashMap с внутренним хранимым значением и предоставляет интерфейс для прямого доступа к членам этой карты, как показано на следующем рисунке:
То есть ключ по-прежнему является идентификатором пользователя, значением является карта, ключ этой карты является именем атрибута члена, а значение является значением атрибута, так что изменение и доступ к данным могут напрямую передаваться через ключ его внутренней карты (в Redis ключ внутренней карты называется полем), то есть соответствующими данными атрибута можно манипулировать через ключ (идентификатор пользователя) + поле (метка атрибута), что не требуют повторного хранения данных, а также не обеспечивают сериализацию и параллельный контроль модификации.проблема решена очень хорошо.
В то же время следует отметить, что Redis предоставляет интерфейс (hgetall), который может напрямую получить все атрибутивные данные, но если членов внутренней карты много, то он включает операцию обхода всей внутренней карты. В однопоточной модели Redis эта операция обхода может занимать много времени, а запросы других клиентов вообще не отвечают, что требует особого внимания. Сценарий использования: Храните некоторые измененные данные, например информацию о пользователе. Метод реализации: как упоминалось выше, Redis Hash, соответствующий Value, на самом деле является HashMap. Фактически, здесь будет две разные реализации. Когда количество членов этого Hash относительно невелико, Redis будет использовать одномерный массив, подобный метод сохранения памяти для компактного хранения вместо будет использоваться реальная структура HashMap, а кодировка соответствующего значения redisObject - zipmap.При увеличении количества членов он будет автоматически преобразован в настоящий HashMap, а кодировка ht .
redis> HSET myhash field1 "Hello" field2 "World"
"OK" redis> HGET myhash field1
"Hello" redis> HGET myhash field2
"World"
В примере мы используем RedisHMSET, HGET Заказ,HMSETУстанавливаются две пары поле=>значение, и HGET получает соответствующийfield соответствующий value. Каждый хэш может хранить 232-1 пары ключ-значение (4 миллиарда+).
Три, список
listСписки — это простые списки строк, отсортированные по порядку вставки. Вы можете добавить элемент в начало (слева) или хвост (справа) списка.
Распространенные команды: lpush (добавить левый элемент), rpush, lpop (удалить первый элемент слева), rpop, lrange (получить фрагмент списка, клавиша LRANGE start stop) и т.д.
Сценарии применения: существует множество сценариев применения списка Redis, и это также одна из наиболее важных структур данных Redis.Например, список подписчиков в Твиттере, список поклонников и т. д. могут быть реализованы со структурой списка Redis.
Список — это связанный список, и я считаю, что любой, кто хоть немного разбирается в структурах данных, должен понять его структуру. Используя структуру списка, мы можем легко реализовать такие функции, как ранжирование последних новостей. Еще одним применением List является очередь сообщений. Вы можете использовать операцию PUSH списка, чтобы сохранить задачу в списке, а затем рабочий поток использует операцию POP, чтобы взять задачу для выполнения. Redis также предоставляет API для управления определенным сегментом в списке.Вы можете напрямую запрашивать и удалять элементы определенного сегмента в списке.
Метод реализации: список Redis реализован в виде двусвязного списка, который может поддерживать обратный поиск и обход, что более удобно в работе, но приводит к дополнительным затратам памяти.Также используются многие внутренние реализации Redis, включая буферные очереди отправки. этой структуры данных.
Список Redis представляет собой двусвязный список, в котором каждый дочерний элемент имеет тип String. Вы можете добавлять или удалять элементы из головы или хвоста списка с помощью операций push и pop, чтобы список можно было использовать как стек или очередь. . Приближение элементов к обоим концам происходит быстрее, но доступ по индексу будет медленнее.
используемые сцены: Система очередей сообщений: вы можете построить систему очередей, используя список, и даже систему очередей с приоритетом, используя отсортированный набор. Например, использование Redis в качестве сборщика журналов на самом деле представляет собой очередь: несколько конечных точек записывают информацию журнала в Redis, а затем рабочий процесс единообразно записывает все журналы на диск.
Операция извлечения последних N данных: запишите список идентификаторов пользователей первых N последних входов в систему, и превышение диапазона может быть получено из базы данных.
//把当前登录人添加到链表里
ret = r.lpush("login:last_login_times", uid) //保持链表只有N位
ret = redis.ltrim("login:last_login_times", 0, N-1) //获得前N个最新登陆的用户Id列表
last_login_list = r.lrange("login:last_login_times", 0, N-1)
Например, Вейбо: В Redis наш последний идентификатор Weibo использует постоянный кэш, который всегда обновляется. Но мы установили ограничение в 5000 идентификаторов, поэтому наша функция получения идентификатора всегда будет запрашивать Redis. Только когда параметр start/count превышает этот диапазон, необходимо получить доступ к базе данных. Наша система не «сбрасывает» кеш, как обычно, информация в экземпляре Redis всегда непротиворечива. Базы данных SQL (или другие типы баз данных на жестком диске) запускаются только тогда, когда пользователю нужно получить данные, которые находятся «далеко», а домашняя страница или первая страница комментариев не беспокоят базу данных на жестком диске.
redis 127.0.0.1:6379> lpush runoob redis
(integer) 1 redis 127.0.0.1:6379> lpush runoob mongodb
(integer) 2 redis 127.0.0.1:6379> lpush runoob rabitmq
(integer) 3 redis 127.0.0.1:6379> lrange runoob 0 10
1) "rabitmq"
2) "mongodb"
3) "redis" redis 127.0.0.1:6379>
Список может хранить до 232- 1 элемент (4294967295, каждый список может хранить более 4 миллиардов).
Четыре, набор
setпредставляет собой неупорядоченный набор строкового типа. Наборы реализуются с помощью хэш-таблиц. Принципы аналогичны наборам в математике. Их можно пересекать, объединять и вычитать. Элементы в наборе не упорядочены. Таким образом, сложность добавления, удаления и поиска составляет O(1).
Команда *sadd: *Добавить строковый элемент в набор set, соответствующий ключу, успешно вернуть 1, вернуть 0, если элемент уже есть в наборе, и вернуть ошибку, если набор, соответствующий ключу, не существует.
Общие команды: sadd, spop, smembers, sunion и т. д.
Сценарий приложения: Функция, предоставляемая Redis для внешнего мира, аналогична функции list, которая представляет собой функцию списка. Особенностью является то, что набор может быть автоматически переупорядочен. Когда вам нужно сохранить список данных и выполнить не хотите дублировать данные, set — очень полезный инструмент.Хороший выбор, и set предоставляет важный интерфейс для определения того, находится ли элемент в наборе коллекции, который также не предоставляется списком.
Набор — это набор, а концепция набора — это комбинация неповторяющихся значений. Используя структуру данных Set, предоставляемую Redis, можно хранить некоторые агрегированные данные.
Случай: в Weibo все подписчики пользователя могут храниться в наборе, и все подписчики пользователя могут храниться в наборе. Redis также предоставляет такие операции, как пересечение, объединение и различие для множеств, что может быть очень удобно для реализации таких функций, как общее внимание, общие предпочтения, друзья второй степени и т. д. Для всех вышеперечисленных операций над множествами также можно использовать разные команды, чтобы выбрать, следует ли вернуть результат клиенту или сохранить набор в новый набор.
Метод реализации: внутренняя реализация set — это HashMap, значение которого всегда равно null.Фактически, он используется для быстрого упорядочивания весов путем вычисления хэша, поэтому set может дать суждение о том, находится ли элемент в наборе.
используемые сцены: ①Пересечение, Объединение, Разность: (Набор)
//book表存储book名称
set book:1:name ”The Ruby Programming Language”
set book:2:name ”Ruby on rail”
set book:3:name ”Programming Erlang” //tag表使用集合来存储数据,因为集合擅长求交集、并集
sadd tag:ruby 1 sadd tag:ruby 2 sadd tag:web 2 sadd tag:erlang 3
//即属于ruby又属于web的书?
inter_list = redis.sinter("tag.web", "tag:ruby") //即属于ruby,但不属于web的书?
inter_list = redis.sdiff("tag.ruby", "tag:web") //属于ruby和属于web的书的合集?
inter_list = redis.sunion("tag.ruby", "tag:web")
②Получить значение дедупликации всех данных за определенный период времени Эта структура данных набора с использованием Redis является наиболее подходящей. Вам нужно только продолжать вбрасывать данные в набор. Набор означает набор, поэтому он автоматически упорядочит веса.
sadd key member
redis 127.0.0.1:6379> sadd runoob redis
(integer) 1 redis 127.0.0.1:6379> sadd runoob mongodb
(integer) 1 redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 1 redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 0 redis 127.0.0.1:6379> smembers runoob
1) "redis"
2) "rabitmq"
3) "mongodb"
**Примечание.** В приведенном выше примере rabitmq добавляет дважды, но второй вставленный элемент будет проигнорирован в соответствии с уникальностью элемента в коллекции. Максимальное количество участников в наборе 232- 1 (4294967295, каждая коллекция может хранить более 4 миллиардов элементов).
Пять, зсет
zsetКак и множество, это также коллекция элементов строкового типа, в которой не допускается дублирование членов. Команда *zadd: *Добавить элемент в коллекцию и обновить соответствующую оценку, если элемент существует в коллекции. Общие команды: zadd, zrange, zrem, zcard и др.
Сценарий использования. Сценарий использования отсортированного набора Redis аналогичен сценарию использования набора, разница в том, что набор не упорядочивается автоматически, в то время как отсортированный набор может сортировать элементы, предоставляя пользователю дополнительный параметр приоритета (оценку), и это вставлены по порядку, т. е. автоматическая сортировка. Если вам нужен упорядоченный и неповторяющийся список, вы можете выбрать структуру данных отсортированного набора.Например, общедоступная временная шкала Twitter может быть сохранена со временем публикации в качестве оценки, чтобы она автоматически сортировалась по времени, когда она получается. По сравнению с СетомОтсортированный набор связан с оценкой параметра веса двойного типа., так что элементы в наборе можно сортировать по баллам, а Redis сортирует элементы набора от меньшего к большему по баллам. Члены zset уникальны, но счет может повторяться. Например, в отсортированном наборе, в котором хранятся оценки всего класса, значением набора может быть номер учащегося одноклассника, а результатом может быть результат теста, так что при вставке данных в набор естественный проведена сортировка. Кроме того, Sorted Set также можно использовать в качестве взвешенной очереди.Например, оценка обычных сообщений равна 1, а оценка важных сообщений — 2. Затем рабочий поток может выбрать получение рабочих задач в обратном порядке оценки. Ставьте приоритеты перед важными задачами.
Метод реализации: Отсортированный набор Redis использует внутри себя HashMap и SkipList для обеспечения хранения и упорядочения данных. структуру таблицы переходов можно использовать для получения относительно высокой эффективности поиска, и ее относительно просто реализовать.
zadd key score member
redis 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1 redis 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1 redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 1 redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 0 redis 127.0.0.1:6379> > ZRANGEBYSCORE runoob 0 1000
1) "mongodb"
2) "rabitmq"
3) "redis"
Сценарии применения каждого типа данных:
тип | Введение | характеристика | Сцены |
---|---|---|---|
Строка (строка) | бинарный сейф | Может содержать любые данные, такие как изображения в формате jpg или сериализованные объекты, ключ может хранить до 512 МБ | --- |
Хэш (словарь) | Набор пар ключ-значение, тип карты в языках программирования. | Он подходит для хранения объектов и может изменять только определенное значение атрибута, например, обновлять атрибут в базе данных (Memcached должен извлечь всю строку, десериализовать ее в объект, а затем сериализовать и сохранить обратно). | Храните, читайте и изменяйте пользовательские атрибуты |
Список (список) | Связанный список (двухсвязный список) | Быстрое добавление и удаление, предоставляет API для управления определенным сегментом элементов. | 1. Рейтинг последних новостей и другие функции (например, хронология круга друзей) 2. Очередь сообщений |
Сет (коллекция) | Реализация хеш-таблицы, элементы не повторяются | 1. Сложность добавления, удаления и поиска составляет O(1) 2. Предоставляет такие операции, как пересечение, объединение и разность для множеств | 1. Общие друзья 2. Использовать уникальность для подсчета всех независимых IP, которые заходят на сайт 3. При рекомендации друзей найти пересечение по тегу, если оно больше определенного порога, его можно рекомендовать |
Сортированный набор | Добавьте оценку параметра веса к элементам в наборе, и элементы будут упорядочены по количеству баллов. | Когда данные вставляются в коллекцию, они естественным образом отсортированы. | 1. Таблица лидеров 2. Взвешенная очередь сообщений |
Практические сценарии применения Redis
Redis отличается от других решений для баз данных несколькими способами: он использует память в качестве основного хранилища и только жесткий диск в качестве постоянного хранилища; его модель данных уникальна и однопоточна. Еще одно большое отличие состоит в том, что вы можете использовать функциональность Redis в среде разработки, но вам не нужно переходить к Redis.
Переход на Redis, безусловно, желателен, и многие разработчики выбирают Redis в качестве базы данных с самого начала; но представьте, если ваша среда разработки уже настроена и приложение уже запущено в ней, то изменить структуру базы данных, очевидно, не так просто. . Кроме того, в некоторых приложениях, требующих больших наборов данных, Redis не подходит, поскольку его наборы данных не превысят объем доступной памяти системы. Поэтому, если у вас есть приложение для работы с большими данными и в основном шаблон доступа для чтения, то Redis — не лучший выбор.
Что мне нравится в Redis, так это то, что вы можете интегрировать его в свою систему, что может решить многие проблемы, например, задачи, которые ваша существующая база данных обрабатывает медленно. Вы можете использовать Redis для оптимизации или создания новых функций для приложения. В этой статье я хочу изучить, как добавить Redis в существующую среду и использовать его примитивные команды и другие функции для решения некоторых распространенных проблем, возникающих в традиционных средах. Ни в одном из этих примеров Redis не используется в качестве предпочтительной базы данных.
1. Показать последний список проектовСледующая инструкция часто используется для отображения последних элементов. Чем больше данных, тем медленнее и медленнее будет выполняться запрос.
SELECT * FROM foo WHERE ... ORDER BY time DESC LIMIT 10
Запросы типа «список последних ответов» очень распространены в приложениях микроблогов, что часто приводит к проблемам с масштабируемостью. Это расстраивает, потому что элементы создаются в этом порядке, но для вывода в этом порядке их необходимо отсортировать.
Подобные проблемы можно решить с помощью Redis. Например, одно из наших приложений для микроблогов хочет получить список последних 20 комментариев, оставленных пользователями. Рядом с последним комментарием у нас есть ссылка «показать все», нажмите на нее, чтобы получить больше комментариев.
Мы предполагаем, что каждый отзыв в базе данных имеет уникальное увеличивающееся поле идентификатора. Мы можем использовать разбивку на страницы, чтобы создать домашнюю страницу и страницу комментариев, используя шаблон Redis, и каждый раз, когда публикуется новый комментарий, мы добавляем его идентификатор в список Redis:
LPUSH latest.comments <ID>
Мы обрезаем список до указанной длины, поэтому Redis нужно сохранить только последние 5000 комментариев:
LTRIM latest.comments 0 5000
Каждый раз, когда нам нужно получить область проекта последнего комментария, мы вызываем для этого функцию (в псевдокоде):
FUNCTION get_latest_comments(start, num_items):
id_list = redis.lrange("latest.comments",start,start+num_items - 1)
IF id_list.length < num_items
id_list = SQL_DB("SELECT ... ORDER BY time LIMIT ...")
END
RETURN id_list
END
То, что мы делаем здесь, очень просто. В Redis наш последний идентификатор использует резидентный кеш, который всегда обновляется. Но мы установили ограничение в 5000 идентификаторов, поэтому наша функция получения идентификатора всегда будет запрашивать Redis. Только когда параметр start/count превышает этот диапазон, необходимо получить доступ к базе данных. Наша система не «сбрасывает» кеш, как обычно, информация в экземпляре Redis всегда непротиворечива. Базы данных SQL (или другие типы баз данных на жестком диске) запускаются только тогда, когда пользователю нужно получить данные, которые находятся «далеко», а домашняя страница или первая страница комментариев не беспокоят базу данных на жестком диске.
2, удалить и отфильтровать
Мы можем использовать LREM для удаления комментариев. Если удаления минимальны, другой вариант — просто пропустить запись для записи комментария, сообщив, что комментарий больше не существует.
redis 127.0.0.1:6379> LREM KEY_NAME COUNT VALUE
Иногда вы хотите прикрепить разные фильтры к разным спискам. Если количество фильтров ограничено, вы можете просто использовать разные списки Redis для каждого отдельного фильтра. В конце концов, в списке всего 5000 элементов, а Redis может обрабатывать миллионы элементов, используя очень мало памяти.
3. Рейтинг, связанный с
Другим очень распространенным требованием является то, что данные различных баз данных не хранятся в памяти, поэтому производительность базы данных не идеальна для функций, которые необходимо обновлять почти каждую секунду, таких как сортировка по количеству баллов и обновление в реальном времени. Типичным примером являются списки лидеров таких онлайн-игр, как игра на Facebook, основанные на счете, который вы обычно хотите получить:
- Список 100 лучших бомбардиров
- Список текущего глобального рейтинга пользователя
Эти операции просты для Redis, и даже если у вас есть миллионы пользователей, каждую минуту будут появляться миллионы новых оценок. Шаблон такой: каждый раз, когда мы получаем новую оценку, мы используем такой код:
ZADD leaderboard <score> <username>
Вы можете заменить имя пользователя на userID, в зависимости от того, как вы его разработали.
Попасть в топ-100 самых результативных пользователей легко: таблица лидеров ZREVRANGE 0 99.
Глобальный рейтинг пользователей тоже похож, просто нужно: таблица лидеров ZRANK.
4. Сортировка по голосам пользователей и времени
Обычный вариант списков лидеров, таких как те, которые используются Reddit или Hacker News, заключается в том, что новости сортируются по количеству очков в соответствии с формулой, аналогичной следующей:
score = points / time^alpha
Поэтому голос пользователя откопает новость соответственно, но время похоронит новость по определенному показателю. Ниже представлена наша выкройка, алгоритм конечно на ваше усмотрение.
Шаблон таков: начните с просмотра элементов, которые могут быть последними, например, 1000 новостей на главной странице являются кандидатами, поэтому мы сначала игнорируем остальные, что легко реализовать.
Каждый раз, когда публикуется новая новость, мы добавляем идентификатор в список, используем LPUSH + LTRIM и следим за тем, чтобы извлекались только последние 1000 элементов.
Существует фоновая задача, которая получает этот список и постоянно вычисляет окончательный балл для каждой из 1000 историй. Результаты расчета заносятся в сформированный список командой ZADD в новом порядке, а старые новости очищаются. Ключевая идея здесь заключается в том, что сортировка выполняется фоновыми задачами.
5. Работа с просроченными товарами
Другой распространенный порядок элементов — по времени. Мы можем использовать unix-время в качестве оценки. Схема выглядит следующим образом:
- Каждый раз, когда в нашу базу данных, отличную от Redis, добавляется новый элемент, мы добавляем его в отсортированную коллекцию. В настоящее время мы используем атрибуты времени current_time и time_to_live.
- Другая фоновая задача использует запрос ZRANGE...SCORES для сортировки коллекции и извлечения последних 10 элементов. Если время unix истекло, запись удаляется из базы данных.
6. Подсчет
Redis — хороший счетчик благодаря INCRBY и другим подобным командам. Я уверен, что вы много раз пытались добавить новые счетчики в свою базу данных, чтобы получить статистику или отобразить новую информацию, только для того, чтобы в конечном итоге отказаться от них из-за чувствительности к записи. Теперь вам больше не нужно беспокоиться об использовании Redis. С атомарными приращениями вы можете безопасно добавлять различные счетчики, сбрасывать их с помощью GETSET или удалять их. Например, сделайте это:
INCR user:<id> EXPIRE
user:<id> 60
Вы можете подсчитать количество последних просмотров страниц, когда пользователи останавливались между страницами не более чем на 60 секунд, и когда количество достигает, скажем, 20, вы можете показывать какие-то баннеры или что угодно.
7. Конкретный проект в конкретное время
Еще одна вещь, которая сложна для других баз данных, но с которой легко справляется Redis, — это подсчет того, сколько конкретных пользователей обращались к определенному ресурсу в течение определенного периода времени. Например, я хочу знать, сколько конкретных зарегистрированных пользователей или IP-адресов посетили определенную статью. Каждый раз, когда я получаю новый просмотр страницы, мне просто нужно сделать это:
SADD page:day1:<page_id> <user_id>
Конечно, вы можете заменить day1 временем unix, например, time()-(time()%3600*24) и так далее.
Хотите узнать количество конкретных пользователей? просто используйтеSCARD page:day1:<page_id>
Нужно проверить, посещал ли конкретный пользователь эту страницу?
SISMEMBER page:day1:<page_id>
8. Анализ происходящего в режиме реального времени, для статистики данных и предотвращения спама и т. д.
Мы сделали только несколько примеров, но если вы изучите набор команд Redis и объедините их, вы можете получить множество эффективных и очень экономичных методов анализа в реальном времени. Использование примитивных команд Redis упрощает внедрение систем фильтрации спама или других систем отслеживания в реальном времени.
9. Паб/Саб
Pub/Sub для Redis очень, очень прост, стабилен и быстр. Поддерживает сопоставление с образцом и может подписываться и отменять каналы в режиме реального времени.
10. Очередь
Вы должны были заметить, что такие команды Redis, как list push и list pop, могут быть очень удобными для выполнения операций с очередью, но они могут делать больше: Redis также имеет вариант всплывающего списка, который может блокироваться, когда очередь пуста.
Современные интернет-приложения широко используют очереди сообщений (Messaging). Очереди сообщений используются не только для связи между компонентами внутри системы, но и для взаимодействия между системой и другими службами. Использование очередей сообщений может повысить масштабируемость, гибкость и удобство работы с системой. Система, не основанная на очереди сообщений, работает так же быстро, как и самый медленный компонент в системе (примечание: эффект короткой доски). На основе очередей сообщений различные компоненты в системе могут быть разделены, чтобы система больше не была привязана к самому медленному компоненту, и каждый компонент мог работать асинхронно, чтобы быстрее выполнять свою работу.
Кроме того, когда сервер выполняет операции с высокой степенью параллелизма, например частые записи в файлы журналов. Асинхронная обработка может быть достигнута с помощью очередей сообщений. Это обеспечивает высокую производительность параллельных операций.
11. Кэш
Кэширующая часть Redis заслуживает отдельной статьи, поэтому я просто кратко коснусь ее здесь. Redis — это замена memcached, позволяющая вашему кешу перейти от простого хранения данных к возможности обновлять данные, поэтому вам больше не нужно каждый раз регенерировать данные.