Опубликован: 12.03.2016 | Доступ: свободный | Студентов: 465 / 3 | Длительность: 01:23:00
Лекция 5:

За пределами структур данных

< Лекция 4 || Лекция 5 || Лекция 6 >

Несмотря на то, что пять структур данных формируют основу Redis, в системе также есть команды, не относящиеся к структурам данных. Мы уже видели некоторые из них: info, select, flushdb, multi, exec, discard, watch и keys. В этой главе мы рассмотрим несколько других подобных команд.

Срок Существования Ключей

Redis позволяет назначать ключам срок существования. Вы можете использовать \linebreak абсолютные значения времени в формате Unix (Unix timestamp, количество секунд, \linebreak прошедших с 1 января 1970 года) или оставшееся время существования в секундах. Эта команда оперирует ключами, поэтому неважно, какая структура данных при этом используется.

expire pages:about 30
expireat pages:about 1356933600

Первая команда удалит ключ (и ассоциированное с ним значение) по истечении 30 секунд. Вторая сделает то же самое в 12:00, 31 декабря 2012 года.

Это делает Redis идеальным движком для кеширования. Вы можете узнать, сколько еще будет существовать заданный элемент, с помощью команды ttl, а также удалить срок существования с помощью команды persist:

ttl pages:about
persist pages:about

Наконец, есть специальная строковая команда setex, позволяющая создавать строковые значения с указанием времени существования одной атомарной операцией (в большей степени только для удобства):

setex pages:about 30 '<h1>about us</h1>....'

(обновление значения по ключу сотрет информацию о сроке существования, поэтому эту информацию также необходимо обновлять - прим. перев.)

Публикация Сообщений и Подписка

Над списками в Redis опеределены команды blpop и brpop, которые возвращают и удаляют, соответственно, первый и последний элементы списка, или же блокируют список, пока указанные элементы в нем не появятся. Это может быть использовано для создания простой очереди.

Более того, Redis поддерживает публикацию сообщений и подписку на каналы как на объекты первого класса (То есть эти объекты можно создавать, изменять, удалять и т.д. - прим. перев.). Вы можете сами попробовать это, запустив вторую копию redis-cli в другом окне. В первом окне подпишемся на канал (назовем его warnings):

subscribe warnings

Ответом будет информация о подписке. Теперь, в другом окне, опубликуем сообщение в канал warnings:

publish warnings "it's over 9000!"

Если вы вернетесь в первое окно, вы должны увидеть сообщение, полученное через канал warnings.

Можно подписываться на несколько каналов (subscribe channel1 channel2 channel3 ...) или на каналы, названия которых соответствуют шаблону (psubscribe warnings:*), и использовать команды unsubscribe и punsubscribe для прекращения подписки на один или более канал.

Наконец, обратите внимание, что команда publish вернула значение 1. Это значение показывает число клиентов, получивших сообщение.

Мониторинг и Журнал Медленных Запросов

Команда monitor позволяет вам увидеть, что Redis собирается сделать. Этот отличный инструмент отладки дает вам понимание того, как ваше приложение взаимодействует с Redis. В одном из окон redis-cli (если одна из копий все еще подписана на канал, вы можете использовать команду unsubscribe или же закрыть окно и открыть новое) введите команду monitor. В другом запустите команду другого типа (например, get или set). Вы должны увидеть эти команды вместе с их параметрами в первом окне.

Не следует запускать команду monitor на "боевом" сервере, это действительно только средство отладки и разработки. Кроме этого, ничего более об этой команде сказать нельзя. Это просто очень удобный инструмент.

Помимо monitor, Redis имеет команду slowlog, которая служит отличным инструментом для профилирования (Измерения производительности - прим. перев.). Она записывает в журнал все команды, выполнение которых заняло больше времени, чем указанное число микросекунд. В следующем разделе мы кратко рассмотрим, как конфигурировать Redis, а сейчас вы можете настроить систему на журналирование всех команд, введя:

config set slowlog-log-slower-than 0

Далее, запустите несколько команд. Теперь вы можете получить все записи журнала или только самые последние, введя:

slowlog get
slowlog get 10

Вы также можете получить число записей в журнале медленных запросов, введя slowlog len

Для каждой введенной вами команды вы должны увидеть четыре параметра:

  • Автоинкрементирующийся идентификатор
  • Время (в формате Unix), когда команда была выполнена
  • Продолжительность выполнения команды в микросекундах
  • Саму команду с параметрами

Журнал медленных запросов поддерживается в памяти, поэтому его ведение на рабочем сервере даже с низким порогом журналирования не должно создавать проблем. По \linebreak умолчанию в журнале будут храниться последние 1024 записи.

Сортировка

Одна из наиболее мощных команд в Redis - sort. Она позволяет сортировать значения в списке, множестве или упорядоченном множестве (элементы упорядоченных множеств упорядочены по значению своих весовых коэффициентов, а не по хранящимся значениям). В самой простой форме, эта команда позволяет сделать следующее:

rpush users:leto:guesses 5 9 10 2 4 10 19 2
sort users:leto:guesses

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

sadd friends:ghanima leto paul chani jessica alia duncan
sort friends:ghanima limit 0 3 desc alpha

Команда выше показывает, сколько значений выводить (с помощью limit), как получать результат в порядке убывания (посредством desc), и как упорядочивать по алфавиту, а не по числовым значениям (посредством alpha).

Реальная мощь sort состоит в способности сортировать на основании объектов по ссылкам. Ранее мы видели, что списки, множества и упорядоченные множества часто используются для указания ссылок на другие объекты Redis. Команда sort может получать значения по этим ссылкам и сортировать их. Например, у нас есть система отслеживания ошибок (баг-трекер), позволяющая пользователям следить за статусами ошибок. Мы можем \linebreak использовать множество для поддержания списка ошибок, за которыми ведется \linebreak наблюдение:

sadd watch:leto 12339 1382 338 9338

Удобно будет сортировать по идентификатору (что по умолчанию и произойдет), но нам также хотелось бы сортировать по критичности ошибки. Чтобы это сделать, мы указываем Redis, по какому шаблону проводить сортировку. Сначала, давайте добавим больше данных, чтобы увидеть значимые результаты:

set severity:12339 3
set severity:1382 2
set severity:338 5
set severity:9338 4

Чтобы отсортировать ошибки по критичности от более важных к менее важным, введите следующее:

sort watch:leto by severity:* desc

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

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

hset bug:12339 severity 3
hset bug:12339 priority 1
hset bug:12339 details "{id: 12339, ....}"

hset bug:1382 severity 2
hset bug:1382 priority 2
hset bug:1382 details "{id: 1382, ....}"

hset bug:338 severity 5
hset bug:338 priority 3
hset bug:338 details "{id: 338, ....}"

hset bug:9338 severity 4
hset bug:9338 priority 2
hset bug:9338 details "{id: 9338, ....}"

Теперь все не только лучше организовано, и мы имеем возможность сортировать по \linebreak параметрам severity (критичность) и priority (приоритет), но также можем указать \linebreak команде sort, значения каких полей извлекать:

sort watch:leto by bug:*->priority get bug:*->details

Подстановка значений осталась прежней, но теперь Redis также распознает \linebreak последовательности \to и будет использовать их для обращения к определенному полю хеша. Мы также включили параметр get, который используется в подстановке и поиске значения поля, для извлечения подробных сведений (details) об ошибке.

На больших множествах sort может быть медленной. К счастью, возвращаемое командой sort значение может быть сохранено:

sort watch:leto by bug:*->priority get bug:*->details store watch_by_priority:leto

Комбинирование возможности сохранения (параметр store) команды sort с указанием срока существования, который обсуждался выше, будет отличным решением.

В Этой Главе

Эта глава посвящена командам, не связанным со структурами данных. Как и везде, их использование ситуативно. Не так уж редки случаи построения приложений, не \linebreak использующих указание срока существования, публикации сообщений и подписки, \linebreak сортировки. Но полезно знать, что такие возможности существуют. Кроме того, мы рассмотрели лишь несколько команд. Кроме них есть и другие, и когда вы усвоите материал этой книги, имеет смысл ознакомиться с полным списком.

\clearpage
< Лекция 4 || Лекция 5 || Лекция 6 >
Александр Прокофьев
Александр Прокофьев

Что за бред? зачем его выложили если его нельзя закончить???

Тогда уберите бесплатность курса! Или надо жаловаться администрации сайта на вас?

Ups Shelest
Ups Shelest

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

Уровень курса - обзорная статья на хабре. Платить за такое - просто нельзя.

Так как же, все таки, завершить обучение в этом курсе?

Евгений Гавриш
Евгений Гавриш
Россия, Москва
Леонид Рисков
Леонид Рисков
Россия, Екатеринбург, Уральский федеральный университет, 2006