Что за бред? зачем его выложили если его нельзя закончить??? Тогда уберите бесплатность курса! Или надо жаловаться администрации сайта на вас? |
За пределами структур данных
Несмотря на то, что пять структур данных формируют основу 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