Введение в Redis

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

Показывать лекцию целиком

Несмотря на то, что пять структур данных формируют основу 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
    
    Вернуться к учебному плану