Ключи Redis являются двоичными, это означает, что вы можете использовать любую двоичную последовательность в качестве
key, от строки типа «foo» до содержимого файла JPEG.
Пустая строка также является допустимым ключом.
Еще несколько правил о ключах:
- Очень длинные клавиши — не лучшая идея.Например, ключ размером 1024 байта — это плохо.
идея не только с точки зрения памяти, но и потому, что поиск ключа в
набор данных может потребовать нескольких дорогостоящих сравнений ключей. Даже когда задача под рукой
должен соответствовать существованию большого значения, хешируя его (например,
с SHA1) — лучшая идея, особенно с точки зрения памяти
и пропускная способность.
- Очень короткие клавиши — зачастую не лучшая идея. Нет смысла писать
«u1000flw» в качестве ключа, если вы можете вместо этого написать «пользователь: 1000: подписчики».Последний
более читабелен, а добавленное пространство незначительно по сравнению с пространством, используемым
сам ключевой объект и объект значения. В то время как короткие клавиши, очевидно, будут
потребляйте немного меньше памяти, ваша задача — найти правильный баланс.
- Попробуйте придерживаться схемы. Например, «object-type: id» — хороший
идея, как в «пользователь: 1000». Для многословных слов часто используются точки или тире.
поля, как в «comment: 1234: reply.to» или «comment: 1234: reply-to».
- Максимально допустимый размер ключа — 512 МБ.
* строки Redis
Тип Redis String — это простейший тип значения, с которым можно ассоциировать
ключ Redis. Это единственный тип данных в Memcached, поэтому он также очень естественен.
для новичков, чтобы использовать его в Redis.
Поскольку ключи Redis являются строками, когда мы также используем строковый тип как значение,
мы сопоставляем строку с другой строкой.Строковый тип данных полезен
для ряда случаев использования, таких как кеширование фрагментов HTML или страниц.
Давайте немного поиграем с типом строки, используя redis-cli
(все примеры
будет выполняться через redis-cli
в этом руководстве).
> установить mykey somevalue
Ok
> получить mykey
"некоторая ценность"
Как видите, с помощью команд SET и GET мы устанавливаем
и получить строковое значение.Обратите внимание, что SET заменит любое существующее значение
уже сохранены в ключе, в случае, если ключ уже существует, даже если
ключ связан с нестроковым значением. Итак, SET выполняет присваивание.
Значения могут быть строками (включая двоичные данные) любого типа, например, вы
может хранить изображение jpeg внутри значения. Значение не может быть больше 512 МБ.
У команды SET есть интересные опции, которые предоставляются в качестве дополнительных
аргументы.Например, я могу попросить SET об отказе, если ключ уже существует,
или наоборот, что он будет успешным, только если ключ уже существует:
> установить mykey newval nx
(ноль)
> установить mykey newval xx
Ok
Даже если строки являются основными значениями Redis, есть интересные операции
с ними можно выступать. Например, одно атомное приращение:
> установить счетчик 100
Ok
> счетчик инкр.
(целое число) 101
> счетчик инкр.
(целое число) 102
> счетчик инкрби 50
(целое число) 152
Команда INCR анализирует строковое значение как целое число,
увеличивает его на единицу и, наконец, устанавливает полученное значение как новое значение.Есть и другие похожие команды, например INCRBY,
ОВЦС и ОВЦС. Внутренне это
всегда одна и та же команда, действующая несколько иначе.
Что означает атомарность INCR?
Что даже несколько клиентов, выписывающих INCR против
тот же ключ никогда не войдет в состояние гонки. Например, никогда не будет
случается, что клиент 1 читает «10», клиент 2 одновременно читает «10», оба
увеличьте до 11 и установите новое значение на 11.Окончательное значение всегда будет
12, и операция чтения-инкремента-установки выполняется, в то время как все остальные
клиенты не выполняют команду одновременно.
Есть ряд команд для работы со строками. Например
команда GETSET устанавливает для ключа новое значение, возвращая старое значение как
результат. Вы можете использовать эту команду, например, если у вас есть
система, которая увеличивает ключ Redis с помощью INCR
каждый раз, когда на ваш сайт приходит новый посетитель.Вы можете захотеть собрать это
информация один раз в час, не теряя ни единого приращения.
Вы можете ПОЛУЧИТЬ ключ, присвоив ему новое значение «0» и прочитав
старое значение обратно.
Возможность установки или получения значения нескольких ключей в одном
Команда также полезна для уменьшения задержки. По этой причине есть
команды MSET и MGET:
> мсет а 10 б 20 в 30
Ok
> mget a b c
1) «10»
2) «20»
3) «30»
При использовании MGET Redis возвращает массив значений.
* Изменение и запрос ключевого пространства
Есть команды, которые не определены для определенных типов, но полезны
для взаимодействия с пространством клавиш и, таким образом, может использоваться с
ключи любого типа.
Например, команда EXISTS возвращает 1 или 0, чтобы сигнализировать, что данный ключ
существует или нет в базе данных, а команда DEL удаляет ключ
и связанное значение, независимо от значения.
> установить mykey hello
Ok
> существует mykey
(целое число) 1
> дель майкей
(целое число) 1
> существует mykey
(целое число) 0
Из примеров вы также можете увидеть, как сам DEL возвращает 1 или 0 в зависимости от того,
ключ был удален (он существовал) или нет (такого ключа не было с этим
имя).
Есть много команд, связанных с ключевыми пробелами, но две вышеупомянутые
основные вместе с командой TYPE, которая возвращает вид
значения, хранящегося в указанном ключе:
> установить mykey x
Ok
> введите mykey
нить
> дель майкей
(целое число) 1
> введите mykey
никто
* Срок действия Redis истекает: ключи с ограниченным сроком действия
Прежде чем перейти к более сложным структурам данных, мы должны обсудить
еще одна функция, которая работает независимо от типа значения и является
называется Redis истекает .В основном вы можете установить тайм-аут для ключа, который
ограниченное время, чтобы жить. Когда время жизни истекает, ключ
автоматически уничтожается, как если бы пользователь вызвал команду DEL
с ключом.
Краткая информация об истечении срока действия Redis:
- Их можно установить с точностью до секунд или миллисекунд.
- Однако разрешение времени истечения всегда составляет 1 миллисекунду.
- Информация об истечении срока действия реплицируется и сохраняется на диске, время практически проходит, когда ваш сервер Redis остается остановленным (это означает, что Redis сохраняет дату истечения срока действия ключа).
Установка срока действия тривиальна:
> установить ключ какое-то значение
Ok
> срок действия ключа 5
(целое число) 1
> получить ключ (немедленно)
"некоторая ценность"
> получить ключ (через некоторое время)
(ноль)
Ключ пропал между двумя вызовами GET, поскольку второй вызов был
задерживается более 5 секунд.В приведенном выше примере мы использовали EXPIRE в
чтобы установить срок действия (его также можно использовать для установки другого
истекает срок действия ключа, который уже есть, например, PERSIST можно использовать в порядке
чтобы удалить срок действия и сделать ключ постоянным навсегда). Однако мы
также может создавать ключи с истечением срока действия с помощью других команд Redis. Например
с использованием опций SET:
> установить ключ 100 пр.10
Ok
> ключ ttl
(целое число) 9
В приведенном выше примере задается ключ со строковым значением 100
, срок действия которого истекает.
десять секунд.Позже вызывается команда TTL для проверки
осталось жить по ключу.
Для установки и проверки истекает в миллисекундах, проверьте PEXPIRE и
команды PTTL и полный список опций SET.
* списки Redis
Чтобы объяснить тип данных List, лучше начать с небольшой теории,
поскольку термин Список часто неправильно используется в информационных технологиях.
близкие.Например, «Списки Python» — это не то, что можно предположить по названию (Связано
Списки), а скорее массивы (тот же тип данных называется в
На самом деле Руби).
С очень общей точки зрения список — это просто последовательность упорядоченных
элементы: 10,20,1,2,3 — это список. Но свойства списка, реализованные с использованием
Массив сильно отличается от свойств списка, реализованного с использованием Связанный список .
Списки Redis реализованы через связанные списки. Это означает, что даже если у вас
миллионы элементов внутри списка, операция добавления нового элемента в
начало или конец списка выполняется в постоянное время . Скорость добавления
новый элемент с командой LPUSH в начало списка с десятью
elements — это то же самое, что добавить элемент в заголовок списка с 10
миллион элементов.
В чем обратная сторона? Доступ к элементу по индексу осуществляется очень быстро в списках.
реализован с помощью массива (индексированный доступ с постоянным временем) и не так быстро в
списки, реализованные связанными списками (где операция требует количества
работают пропорционально индексу доступного элемента).
Списки Redis реализованы со связанными списками, потому что для системы баз данных это
крайне важен для быстрого добавления элементов в очень длинный список.Еще одно сильное преимущество, как вы вскоре увидите, состоит в том, что списки Redis могут быть
сняты на постоянной длине в постоянное время.
Когда важен быстрый доступ к середине большой коллекции элементов,
можно использовать другую структуру данных, называемую отсортированными наборами.
Сортированные наборы будут рассмотрены позже в этом руководстве.
* Первые шаги со списками Redis
Команда LPUSH добавляет новый элемент в список на
слева (в голове), а команда RPUSH добавляет новый
элемент в список справа (в хвосте).Наконец
Команда LRANGE извлекает диапазоны элементов из списков:
> rpush mylist A
(целое число) 1
> rpush mylist B
(целое число) 2
> сначала lpush mylist
(целое число) 3
> lrange mylist 0-1
1) «первый»
2) «А»
3) «Б»
Обратите внимание, что LRANGE принимает два индекса, первый и последний.
элемент возвращаемого диапазона. Оба индекса могут быть отрицательными, сообщает Redis
чтобы начать отсчет с конца: значит -1 — последний элемент, -2 —
предпоследний элемент списка и так далее.
Как видите, RPUSH добавил элементы справа от списка, в то время как
последний LPUSH добавил элемент слева.
Обе команды являются вариативными командами , что означает, что вы можете нажимать
несколько элементов в списке за один вызов:
> rpush mylist 1 2 3 4 5 "foo bar"
(целое число) 9
> lrange mylist 0-1
1) «первый»
2) «А»
3) «Б»
4) «1»
5) «2»
6) «3»
7) «4»
8) «5»
9) "фу бар"
Важной операцией, определенной в списках Redis, является возможность выталкивать элементы .Выталкивание элементов — это операция извлечения элемента из списка,
и одновременно исключив его из списка. Вы можете вставлять элементы
слева и справа, аналогично тому, как вы можете толкать элементы в обе стороны
списка:
> rpush mylist a b c
(целое число) 3
> rpop мой список
"c"
> rpop мой список
"б"
> rpop мой список
"а"
Мы добавили три элемента и выдвинули три элемента, поэтому в конце этого
последовательность команд список пуст и больше нет элементов для
поп.Если мы попытаемся выдвинуть еще один элемент, мы получим следующий результат:
> rpop mylist
(ноль)
Redis вернул значение NULL, чтобы сигнализировать об отсутствии элементов в
список.
* Типичные варианты использования списков
Списки полезны для ряда задач, два очень репрезентативных варианта использования.
следующие:
- Помните последние обновления, размещенные пользователями в социальной сети.
- Связь между процессами с использованием шаблона потребитель-производитель, когда производитель помещает элементы в список, а потребитель (обычно работник ) потребляет эти элементы и выполняет действия. Redis имеет специальные команды списка, чтобы сделать этот вариант использования более надежным и эффективным.
Например, популярные библиотеки Ruby resque и
sidekiq использует скрытые списки Redis, чтобы
реализовать фоновые задания.
Популярная социальная сеть Twitter принимает последние твиты
размещены пользователями в списках Redis.
Чтобы шаг за шагом описать типичный вариант использования, представьте, что на вашей домашней странице отображаются последние
фотографии, опубликованные в социальной сети для обмена фотографиями, и вы хотите ускорить доступ.
- Каждый раз, когда пользователь публикует новую фотографию, мы добавляем ее идентификатор в список с помощью LPUSH.
- Когда пользователи посещают домашнюю страницу, мы используем
LRANGE 0 9
, чтобы получить последние 10 опубликованных элементов.
* Ограниченные списки
Во многих случаях мы просто хотим использовать списки для хранения последних элементов ,
какими бы они ни были: обновления социальных сетей, журналы или что-то еще.
Redis позволяет нам использовать списки как ограниченную коллекцию, запоминая только последние
N элементов и отбрасывание всех самых старых элементов с помощью команды LTRIM.
Команда LTRIM аналогична LRANGE, но вместо отображения
указанный диапазон элементов он устанавливает этот диапазон как новое значение списка.Все
элементы вне заданного диапазона удаляются.
Поясним на примере:
> rpush mylist 1 2 3 4 5
(целое число) 5
> ltrim mylist 0 2
Ok
> lrange mylist 0-1
1) «1»
2) «2»
3) «3»
Приведенная выше команда LTRIM сообщает Redis, что нужно брать только элементы списка из индекса.
От 0 до 2, все остальное будет отброшено. Это позволяет сделать очень простой, но
полезный шаблон: выполнение операции отправки списка + операция обрезки списка вместе
чтобы добавить новый элемент и отбросить элементы, превышающие предел:
LPUSH mylist <некоторый элемент>
LTRIM мой список 0 999
Приведенная выше комбинация добавляет новый элемент и занимает только 1000
самые новые элементы в списке.С LRANGE вы можете получить доступ к лучшим элементам
без необходимости запоминать очень старые данные.
Примечание: хотя LRANGE технически является командой O (N), доступ к небольшим диапазонам
к началу или к концу списка — это операция с постоянным временем.
* Блокировка операций по спискам
Списки имеют специальную функцию, которая делает их пригодными для реализации очередей,
и в целом как строительный блок для систем межпроцессного взаимодействия:
блокировка операций.
Представьте, что вы хотите поместить элементы в список одним процессом и использовать
другой процесс, чтобы действительно поработать с этими
Предметы. Это обычная настройка производителя / потребителя, и ее можно реализовать.
следующим простым способом:
- Чтобы поместить элементы в список, производители вызывают LPUSH.
- Чтобы извлечь / обработать элементы из списка, потребители вызывают RPOP.
Однако возможно, что иногда список пуст и нет ничего
для обработки, поэтому RPOP просто возвращает NULL. В этом случае потребитель вынужден ждать
некоторое время и повторите попытку с помощью RPOP. Это называется опросом и не является
хорошая идея в данном контексте, потому что у нее есть несколько недостатков:
- Заставляет Redis и клиентов обрабатывать бесполезные команды (все запросы, когда список пуст, фактически не выполняются, они просто возвращают NULL).
- Добавляет задержку к обработке элементов, так как после того, как работник получает NULL, он ждет некоторое время. Чтобы уменьшить задержку, мы могли бы меньше ждать между вызовами RPOP с эффектом усиления проблемы номер 1, то есть большего количества бесполезных вызовов Redis.
Итак, Redis реализует команды BRPOP и BLPOP, которые являются версиями
RPOP и LPOP, которые можно заблокировать, если список пуст: они вернутся в
вызывающий только тогда, когда новый элемент добавляется в список, или когда указанный пользователем
время ожидания истекло.
Это пример вызова BRPOP, который мы могли бы использовать в worker:
> брпоп задачи 5
1) «задачи»
2) "do_something"
Это означает: «ждать элементов в списке задач
, но вернуть, если через 5 секунд
элемент недоступен ».
Обратите внимание, что вы можете использовать 0 как тайм-аут, чтобы ждать элементов вечно, и вы можете
также укажите несколько списков, а не один, чтобы ждать несколько
списки одновременно, и получать уведомления, когда первый список получает
элемент.
Несколько замечаний о BRPOP:
- Клиенты обслуживаются упорядоченным образом: первый клиент, который заблокировал ожидание списка, обслуживается первым, когда элемент передается другим клиентом, и так далее.
- Возвращаемое значение отличается от RPOP: это двухэлементный массив, поскольку он также включает имя ключа, поскольку BRPOP и BLPOP могут блокировать ожидание элементов из нескольких списков.
- Если время ожидания истекло, возвращается NULL.
Есть еще кое-что, что вам следует знать о списках и блокирующих операциях. Мы
Предлагаем вам прочитать больше о следующем:
- С помощью LMOVE можно создавать более безопасные очереди или чередующиеся очереди.
- Существует также блокирующий вариант команды, называемый BLMOVE.
* Автоматическое создание и удаление ключей
До сих пор в наших примерах нам никогда не приходилось создавать пустые списки перед нажатием
элементы или удаление пустых списков, когда в них больше нет элементов.Redis отвечает за удаление ключей, когда списки остаются пустыми, или за создание
пустой список, если ключ не существует и мы пытаемся добавить элементы
к нему, например, с ЛПУШ.
Это не относится к спискам, это относится ко всем типам данных Redis.
состоит из нескольких элементов — потоков, наборов, сортированных наборов и хэшей.
В основном мы можем резюмировать поведение с помощью трех правил:
- Когда мы добавляем элемент к агрегатному типу данных, если целевой ключ не существует, перед добавлением элемента создается пустой агрегатный тип данных.
- Когда мы удаляем элементы из агрегированного типа данных, если значение остается пустым, ключ автоматически уничтожается. Тип данных Stream — единственное исключение из этого правила.
- Вызов команды только для чтения, такой как LLEN (которая возвращает длину списка), или команды записи, удаляющей элементы с пустым ключом, всегда дает тот же результат, как если бы ключ содержал пустой агрегатный тип типа команда ожидает найти.
Примеры правила 1:
> мой список
(целое число) 1
> lpush mylist 1 2 3
(целое число) 3
Однако мы не можем выполнять операции с неправильным типом, если ключ существует:
> установить панель foo
Ok
> lpush foo 1 2 3
(ошибка) WRONGTYPE Операция с ключом, содержащим неверное значение
> введите foo
нить
Пример правила 2:
> lpush mylist 1 2 3
(целое число) 3
> существует мой список
(целое число) 1
> lpop mylist
«3»
> lpop mylist
«2»
> lpop mylist
«1»
> существует мой список
(целое число) 0
Ключ больше не существует после того, как все элементы вытянуты.
Пример правила 3:
> мой список
(целое число) 0
> llen mylist
(целое число) 0
> lpop mylist
(ноль)
* хэши Redis
хэшей Redis выглядят именно так, как можно было бы ожидать, «хэш» с парами «поле-значение»:
> пользователь hmset: 1000 имя пользователя antirez год рождения 1977 проверено 1
Ok
> Пользователь hget: имя пользователя 1000
"антирез"
> Пользователь hget: 1000 год рождения
«1977»
> Пользователь hgetall: 1000
1) "имя пользователя"
2) «антирез»
3) «год рождения»
4) «1977»
5) «проверено»
6) «1»
Хотя хэши удобны для представления объектов , на самом деле количество полей, которые вы можете
помещенный внутри хеша не имеет практических ограничений (кроме доступной памяти), поэтому вы можете использовать
хеши внутри вашего приложения разными способами.
Команда HMSET устанавливает несколько полей хэша, а HGET извлекает
одно поле. HMGET похож на HGET, но возвращает массив значений:
> пользователь hmget: имя пользователя 1000 год рождения без такого поля
1) «антирез»
2) «1977»
3) (ноль)
Есть команды, которые могут выполнять операции с отдельными полями
также как HINCRBY:
> пользователь hincrby: 1000 год рождения 10
(целое число) 1987
> Пользователь hincrby: 1000 год рождения 10
(целое число) 1997
Полный список хэш-команд можно найти в документации.
Стоит отметить, что небольшие хэши (то есть несколько элементов с маленькими значениями)
закодированы в памяти особым образом, что делает их очень эффективными с точки зрения памяти.
* Наборы Redis
Redis Sets — это неупорядоченные наборы строк. В
Команда SADD добавляет в набор новые элементы. Также возможно
для выполнения ряда других операций с наборами, таких как проверка, если данный элемент
уже существует, выполняя пересечение, объединение или различие между
несколько сетов и т. д.
> садд мисет 1 2 3
(целое число) 3
> пачкает myset
1. 3
2. 1
3. 2
Здесь я добавил три элемента в свой набор и сказал Redis вернуть все
элементы. Как видите, они не отсортированы — Redis может вернуть
элементы в любом порядке при каждом вызове, поскольку нет контракта с
пользователь о порядке элементов.
Redis имеет команды для проверки членства.Например, проверка наличия элемента:
> sismember myset 3
(целое число) 1
> sismember myset 30
(целое число) 0
«3» входит в набор, а «30» — нет.
Наборы хороши для выражения отношений между объектами.
Например, мы можем легко использовать наборы для реализации тегов.
Простой способ смоделировать эту проблему — создать набор для каждого объекта, который мы
хочу пометить.Набор содержит идентификаторы тегов, связанных с объектом.
Одна иллюстрация — теги к новостным статьям.
Если идентификатор статьи 1000 помечен тегами 1, 2, 5 и 77, набор
может связать эти идентификаторы тегов с новостью:
> sadd новости: 1000: теги 1 2 5 77
(целое число) 4
Мы также можем захотеть иметь обратную связь: список
всех новостей с тегами данного тега:
> sadd тег: 1: новости 1000
(целое число) 1
> тег sadd: 2: новости 1000
(целое число) 1
> тег sadd: 5: новости 1000
(целое число) 1
> тег sadd: 77: новости 1000
(целое число) 1
Получить все теги для данного объекта несложно:
> новости: 1000: теги
1.5
2. 1
3. 77
4. 2
Примечание: в этом примере мы предполагаем, что у вас есть другая структура данных, например
хеш Redis, который сопоставляет идентификаторы тегов с именами тегов.
Есть и другие нетривиальные операции, которые все же легко реализовать.
используя правильные команды Redis. Например, нам может понадобиться список всех
объекты с тегами 1, 2, 10 и 27 вместе. Мы можем сделать это, используя
команда SINTER, которая выполняет пересечение между разными
наборы.Мы можем использовать:
> sinter tag: 1: news tag: 2: news tag: 10: news tag: 27: новости
... результаты здесь ...
Кроме перекрестка можно также выполнить
союзы, различия, извлечение случайного элемента и т. д.
Команда для извлечения элемента называется SPOP и удобна для моделирования.
определенные проблемы. Например, чтобы реализовать покер в Интернете,
вы можете представить свою колоду набором.Представьте, что мы используем один символ
префикс для (C) смазок, (D) ромбов, (H) ушей, (S) падов:
> опорная дека C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 CJ CQ CK
D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 DJ DQ DK h2 h3 h4
h5 H5 H6 H7 H8 H9 h20 HJ HQ HK S1 S2 S3 S4 S5 S6
S7 S8 S9 S10 SJ SQ SK
(целое число) 52
Теперь мы хотим предоставить каждому игроку по 5 карт. Команда SPOP
удаляет случайный элемент, возвращая его клиенту, так что это
идеальная работа в этом случае.
Однако, если мы коллируем его напрямую против нашей колоды, в следующей розыгрыше
нам нужно будет снова заполнить колоду карт, что может не быть
идеальный. Итак, для начала мы можем сделать копию набора, хранящегося в колоде , ключ
в игру : 1: колода ключ
.
Это достигается с помощью SUNIONSTORE, который обычно выполняет
объединяет несколько наборов и сохраняет результат в другом наборе.Однако, поскольку объединение одного набора само по себе, я могу скопировать свою колоду
с:
> sunionstore игра: 1: колода колода
(целое число) 52
Теперь я готов предоставить первому игроку пять карт:
> игра spop: 1: колода
«C6»
> Spop Game: 1: колода
«CQ»
> Spop Game: 1: колода
«D1»
> Spop Game: 1: колода
"СиДжей"
> Spop Game: 1: колода
"SJ"
Одна пара валетов, не очень хорошо…
Это хорошее время, чтобы ввести команду set, которая предоставляет номер
элементов внутри набора. Это часто называют мощностью набора .
в контексте теории множеств команда Redis называется SCARD.
> разыгрывать карты: 1: колода
(целое число) 47
По математике получается: 52 — 5 = 47.
Когда нужно просто получить случайные элементы, не удаляя их из
установлен, есть подходящая для задачи команда SRANDMEMBER.Он также имеет
возможность возвращать как повторяющиеся, так и неповторяющиеся элементы.
* Сортированные наборы Redis
Сортированные наборы — это тип данных, который похож на смесь между набором и
Хеш. Как и наборы, отсортированные наборы состоят из уникальных, неповторяющихся
строковые элементы, поэтому в некотором смысле отсортированный набор также является набором.
Однако, хотя элементы внутри наборов не упорядочены, каждый элемент в
отсортированный набор связан со значением с плавающей запятой, называемым , оценка (вот почему тип также похож на хеш, поскольку каждый элемент
сопоставляется со значением).
Кроме того, элементы в отсортированном наборе взяты в порядке (поэтому они не
заказывается по запросу, порядок — это особенность структуры данных, используемой для
представляют собой отсортированные множества). Их заказывают по следующему правилу:
- Если A и B — два элемента с разными оценками, то A> B, если A.score> B.score.
- Если A и B имеют одинаковую оценку, то A> B, если строка A лексикографически больше строки B.Строки A и B не могут быть равными, поскольку в отсортированных наборах есть только уникальные элементы.
Давайте начнем с простого примера, добавив несколько избранных имен хакеров как
отсортированные элементы набора с указанием года их рождения в качестве «оценки».
> zadd hackers 1940 "Алан Кей"
(целое число) 1
> zadd hackers 1957 "Софи Уилсон"
(целое число) 1
> zadd hackers 1953 "Ричард Столлман"
(целое число) 1
> zadd hackers 1949 "Анита Борг"
(целое число) 1
> zadd hackers 1965 "Юкихиро Мацумото"
(целое число) 1
> zadd hackers 1914 "Хеди Ламарр"
(целое число) 1
> zadd hackers 1916 "Клод Шеннон"
(целое число) 1
> zadd hackers 1969 "Линус Торвальдс"
(целое число) 1
> zadd hackers 1912 "Алан Тьюринг"
(целое число) 1
Как видите, ZADD похож на SADD, но принимает один дополнительный аргумент.
(помещается перед добавляемым элементом), который является результатом.ZADD также является вариативным, поэтому вы можете указать несколько значений оценки.
пары, даже если это не используется в приведенном выше примере.
С отсортированными наборами тривиально вернуть список хакеров, отсортированный по их
год рождения потому что на самом деле уже отсортировано .
Примечание по реализации: Сортированные наборы реализуются через
двухпортовая структура данных, содержащая как список пропусков, так и хеш-таблицу, поэтому
каждый раз, когда мы добавляем элемент, Redis выполняет операцию O (log (N)).Это
хорошо, но когда мы просим отсортированные элементы, Redis не нужно выполнять какую-либо работу с
все, это уже все отсортировано:
> хакеры zrange 0-1
1) «Алан Тьюринг»
2) «Хеди Ламарр»
3) «Клод Шеннон»
4) «Алан Кей»
5) «Анита Борг»
6) «Ричард Столмен»
7) «Софи Уилсон»
8) «Юкихиро Мацумото»
9) «Линус Торвальдс»
Примечание: 0 и -1 означает от индекса элемента 0 до последнего элемента (-1 работает
здесь так же, как и в случае с командой LRANGE).
Что, если я захочу расположить их в обратном порядке, от младшего к старшему?
Используйте ZREVRANGE вместо ZRANGE:
> zrevrange хакеры 0-1
1) «Линус Торвальдс»
2) «Юкихиро Мацумото»
3) «Софи Уилсон»
4) «Ричард Столмен»
5) «Анита Борг»
6) «Алан Кей»
7) «Клод Шеннон»
8) «Хеди Ламарр»
9) «Алан Тьюринг»
Также можно вернуть оценки, используя аргумент WITHSCORES
:
> zrange хакеры 0-1 withscores
1) «Алан Тьюринг»
2) «1912 год»
3) «Хеди Ламарр»
4) «1914 год»
5) «Клод Шеннон»
6) «1916 год»
7) «Алан Кей»
8) «1940»
9) «Анита Борг»
10) «1949 год»
11) «Ричард Столмен»
12) «1953 год»
13) «Софи Уилсон»
14) «1957»
15) «Юкихиро Мацумото»
16) «1965»
17) «Линус Торвальдс»
18) «1969»
* Работа в диапазонах
Сортированные наборы более эффективны, чем это.Они могут работать на диапазонах.
Возьмем всех лиц, родившихся до 1950 года включительно. Мы
используйте для этого команду ZRANGEBYSCORE:
> zrangebyscore хакеры -inf 1950
1) «Алан Тьюринг»
2) «Хеди Ламарр»
3) «Клод Шеннон»
4) «Алан Кей»
5) «Анита Борг»
Мы попросили Redis вернуть все элементы с оценкой между отрицательными
бесконечность и 1950 (включены обе крайности).
Также возможно удалить диапазоны элементов. Удалим все
хакеров 1940-1960 годов рождения из отсортированного набора:
> zremrangebyscore хакеры 1940 1960
(целое число) 4
ZREMRANGEBYSCORE, пожалуй, не лучшее название команды,
но это может быть очень полезно и возвращает количество удаленных элементов.
Еще одна чрезвычайно полезная операция, определенная для элементов отсортированного набора.
— это операция получения ранга.Можно спросить, что это за
позиция элемента в наборе упорядоченных элементов.
> zrank хакеры "Анита Борг"
(целое число) 4
Команда ZREVRANK также доступна для получения ранга, учитывая
элементы отсортированы по убыванию.
* Лексикографические оценки
С последними версиями Redis 2.8 была представлена новая функция, которая позволяет
получение диапазонов лексикографически, предполагая, что все элементы в отсортированном наборе
вставлены с одинаковой одинаковой оценкой (элементы сравниваются с буквой C memcmp
, поэтому гарантируется, что нет сопоставления, и каждый
Экземпляр Redis ответит тем же выводом).
Основные команды для работы с лексикографическими диапазонами: ZRANGEBYLEX,
ZREVRANGEBYLEX, ZREMRANGEBYLEX и ZLEXCOUNT.
Например, давайте снова добавим наш список известных хакеров, но на этот раз
используйте нулевую оценку для всех элементов:
> zadd hackers 0 "Алан Кей" 0 "Софи Уилсон" 0 "Ричард Столлман" 0
"Анита Борг" 0 "Юкихиро Мацумото" 0 "Хеди Ламарр" 0 "Клод Шеннон"
0 "Линус Торвальдс" 0 "Алан Тьюринг"
Из-за правил упорядочивания наборов отсортированных, они уже отсортированы
лексикографически:
> хакеры zrange 0-1
1) «Алан Кей»
2) «Алан Тьюринг»
3) «Анита Борг»
4) «Клод Шеннон»
5) «Хеди Ламарр»
6) «Линус Торвальдс»
7) «Ричард Столмен»
8) «Софи Уилсон»
9) «Юкихиро Мацумото»
Используя ZRANGEBYLEX, мы можем запросить лексикографические диапазоны:
> хакеры zrangebylex [B [P
1) «Клод Шеннон»
2) «Хеди Ламарр»
3) «Линус Торвальдс»
Диапазоны могут быть включающими или исключающими (в зависимости от первого символа),
также бесконечная строка и минус бесконечность указываются соответственно с
строки +
и -
.См. Документацию для получения дополнительной информации.
Эта функция важна, потому что она позволяет нам использовать отсортированные наборы в качестве общего
показатель. Например, если вы хотите индексировать элементы 128-битным беззнаковым
целочисленный аргумент, все, что вам нужно сделать, это добавить элементы в отсортированный
установлен с той же оценкой (например, 0), но с 16-байтовым префиксом
состоящий из , 128-битного числа с прямым порядком байтов . Поскольку цифры в большом
endian, когда они упорядочены лексикографически (в порядке необработанных байтов), на самом деле
упорядочены также численно, вы можете запросить диапазоны в 128-битном пространстве,
и получить значение элемента без префикса.
Если вы хотите увидеть эту функцию в контексте более серьезной демонстрации,
проверьте демонстрацию автозаполнения Redis.
* Обновление счета: таблицы лидеров
Последнее замечание о сортированных наборах перед переходом к следующей теме.
Очки отсортированных сетов могут быть обновлены в любое время. Просто звоню ZADD против
элемент, уже включенный в отсортированный набор, обновит свой счет
(и положение) с временной сложностью O (log (N)).Таким образом, подходят отсортированные наборы.
когда есть масса обновлений.
Из-за этой характеристики обычным вариантом использования являются доски лидеров.
Типичное приложение — это игра для Facebook, в которой вы объединяете возможность
отсортировать пользователей по их наивысшему баллу, а также по операции получения ранга по порядку
, чтобы показать первых N пользователей и рейтинг пользователя в таблице лидеров (например, «вы
здесь # 4932 лучший результат «).
* растровые изображения
Растровые изображения — это не фактический тип данных, а набор битовых операций.
определен для типа String.Поскольку строки являются двоичными безопасными BLOB-объектами и их
максимальная длина 512 Мб, их можно установить до 2 32 разных
биты.
Битовые операции делятся на две группы: однобитовые с постоянным временем
операции, такие как установка бита в 1 или 0 или получение его значения, и
операции над группами битов, например подсчет количества установленных
бит в заданном диапазоне бит (например, подсчет населения).
Одним из самых больших преимуществ растровых изображений является то, что они часто предоставляют
чрезвычайная экономия места при хранении информации. Например в системе
где разные пользователи представлены инкрементными идентификаторами пользователей, возможно
для запоминания однобитовой информации (например, зная,
пользователь хочет получать информационный бюллетень) о 4 миллиардах пользователей, использующих всего 512 МБ памяти.
Биты устанавливаются и извлекаются с помощью команд SETBIT и GETBIT:
> ключ setbit 10 1
(целое число) 1
> ключ getbit 10
(целое число) 1
> ключ getbit 11
(целое число) 0
Команда SETBIT принимает в качестве первого аргумента номер бита, а в качестве второго
аргумент значение для установки бита, равное 1 или 0.Команда
автоматически увеличивает строку, если адресный бит находится за пределами
текущая длина строки.
GETBIT просто возвращает значение бита по указанному индексу.
Биты вне диапазона (адресация бита, выходящего за пределы длины строки
хранятся в целевом ключе) всегда считаются равными нулю.
Есть три команды, работающие с группой битов:
- BITOP выполняет побитовые операции между разными строками.Предоставляемые операции: AND, OR, XOR и NOT.
- BITCOUNT выполняет подсчет населения, сообщая количество битов, равное 1.
- BITPOS находит первый бит, имеющий указанное значение 0 или 1.
И BITPOS, и BITCOUNT могут работать с байтовыми диапазонами
строка, вместо того, чтобы работать на всю длину строки. Следующий
это тривиальный пример вызова BITCOUNT:
> ключ setbit 0 1
(целое число) 0
> ключ setbit 100 1
(целое число) 0
> битовый ключ
(целое число) 2
Общие варианты использования растровых изображений:
- Аналитика в реальном времени всех видов.
- Хранение рациональной, но высокопроизводительной логической информации, связанной с идентификаторами объектов.
Например, представьте, что вы хотите узнать самую длинную серию ежедневных посещений
пользователи вашего веб-сайта. Вы начинаете отсчет дней с нуля, то есть
день, когда вы сделали свой веб-сайт общедоступным, и каждый раз устанавливали бит с помощью SETBIT
пользователь посещает веб-сайт. В качестве битового индекса вы просто берете текущий unix
время, вычтите начальное смещение и разделите на количество секунд в дне.
(обычно 3600 * 24).
Таким образом, для каждого пользователя у вас есть небольшая строка, содержащая визит
информация на каждый день. С BITCOUNT можно легко получить
количество дней, в течение которых данный пользователь посещал веб-сайт, а с
несколько вызовов BITPOS или просто выборка и анализ растрового изображения на стороне клиента,
можно легко вычислить самую длинную полосу.
Растровые изображения легко разделить на несколько ключей, например для
ради сегментирования набора данных и потому, что в целом лучше
избегайте работы с большими клавишами.Чтобы разделить растровое изображение по разным ключам
вместо того, чтобы устанавливать все биты в ключ, тривиальная стратегия — это просто
для хранения M бит на ключ и получения имени ключа с битовым числом / M
и
N-й бит для адресации внутри ключа с битовым числом MOD M
.
* HyperLogLogs
HyperLogLog — это вероятностная структура данных, используемая для подсчета
уникальные вещи (технически это относится к оценке мощности
комплекта).Обычно для подсчета уникальных элементов требуется определенное количество памяти.
пропорционально количеству предметов, которые вы хотите подсчитать, потому что вам нужно
чтобы запомнить элементы, которые вы уже видели в прошлом, чтобы избежать
пересчитывая их несколько раз. Однако есть набор алгоритмов, которые торгуют
память для точности: вы заканчиваете оценочной мерой со стандартной ошибкой,
что в случае реализации Redis составляет менее 1%. В
магия этого алгоритма в том, что вам больше не нужно использовать объем памяти
пропорционально количеству подсчитанных предметов, и вместо этого можно использовать
постоянный объем памяти! 12 Кбайт в худшем случае или намного меньше, если ваш
HyperLogLog (сейчас мы будем называть их просто HLL) обнаружил очень мало элементов.
HLL в Redis, хотя технически имеют другую структуру данных, закодированы
как строку Redis, поэтому вы можете вызвать GET для сериализации HLL и SET
чтобы десериализовать его обратно на сервер.
Концептуально HLL API похож на использование Set для выполнения той же задачи. Ты бы
SADD каждый наблюдаемый элемент в набор и будет использовать SCARD для проверки
количество элементов внутри набора, которые уникальны, поскольку SADD не
повторно добавить существующий элемент.
Хотя на самом деле вы не добавляете элементы в HLL, потому что структура данных
содержит только состояние, которое не включает фактические элементы, API — это
то же:
- Каждый раз, когда вы видите новый элемент, вы добавляете его в счетчик с помощью PFADD.
Каждый раз, когда вы хотите получить текущее приближение уникальных элементов , добавленных на данный момент с помощью PFADD, вы используете PFCOUNT.
> pfadd hll a b c d
(целое число) 1
> pfcount hll
(целое число) 4
Пример использования этой структуры данных — подсчет уникальных запросов.
выполняется пользователями в поисковой форме каждый день.
Redis также может выполнять объединение HLL, пожалуйста, проверьте
полная документация для получения дополнительной информации.
* Другие примечательные особенности
В Redis API есть и другие важные вещи, которые нельзя исследовать.
в контексте этого документа, но заслуживают вашего внимания:
* Подробнее
Это руководство не является полным и охватывает только основы API.Прочтите справочник по командам, чтобы узнать больше.
Спасибо за чтение и получайте удовольствие от взлома с Redis!
Ключевая роль CTCF в установлении структуры хроматина в человеческих эмбрионах
1. Fullwood, M. J. et al. Связанный с рецептором эстрогена α-связанный хроматин человека. Природа 462 , 58–64 (2009).
ADS
CAS
Статья
Google ученый
2. Атласи Й. и Стунненберг Х. Г. Взаимодействие эпигенетических меток во время дифференцировки и развития стволовых клеток. Нат. Преподобный Genet . 18 , 643–658 (2017).
CAS
Статья
Google ученый
3. Rao, S. S. et al. Трехмерная карта генома человека с разрешением в килобазы раскрывает принципы образования петель хроматина. Cell 159 , 1665–1680 (2014).
CAS
Статья
Google ученый
4. Tang, Z. et al. CTCF-опосредованная архитектура трехмерного генома человека раскрывает топологию хроматина для транскрипции. Ячейка 163 , 1611–1627 (2015).
CAS
Статья
Google ученый
5. Bonev, B. et al. Мультимасштабная трехмерная перестройка генома во время нейронного развития мыши. Cell 171 , 557–572 (2017).
CAS
Статья
Google ученый
6. Hsieh, T. H. et al. картирование укладки хромосом разрешения нуклеосом в дрожжах с помощью микро-C. Cell 162 , 108–119 (2015).
CAS
Статья
Google ученый
7. Du, Z. et al. Аллельное перепрограммирование трехмерной архитектуры хроматина во время раннего развития млекопитающих. Природа 547 , 232–235 (2017).
ADS
CAS
Статья
Google ученый
8. Ke, Y. et al. Трехмерные структуры хроматина зрелых гамет и структурное перепрограммирование во время эмбриогенеза млекопитающих. Ячейка 170 , 367–381 (2017).
CAS
Статья
Google ученый
9. Dixon, J. R. et al. Топологические домены в геномах млекопитающих, идентифицированные с помощью анализа взаимодействий хроматина. Природа 485 , 376–380 (2012).
ADS
CAS
Статья
Google ученый
10. Lieberman-Aiden, E. et al. Комплексное картирование дальнодействующих взаимодействий раскрывает принципы складывания генома человека. Наука 326 , 289–293 (2009).
ADS
CAS
Статья
Google ученый
11. Dixon, J. R. et al. Реорганизация архитектуры хроматина при дифференцировке стволовых клеток. Природа 518 , 331–336 (2015).
ADS
CAS
Статья
Google ученый
12. Giorgetti, L. et al. Структурная организация неактивной Х-хромосомы у мыши. Природа 535 , 575–579 (2016).
ADS
CAS
Статья
Google ученый
13. Li, C. et al. Репрограммирование метилирования ДНК функциональных элементов во время эмбрионального развития млекопитающих. Ячейка Discov . 4 , 41 (2018).
Артикул
Google ученый
14. Smith, Z. D. et al. Динамика метилирования ДНК доимплантационного эмбриона человека. Природа 511 , 611–615 (2014).
ADS
CAS
Статья
Google ученый
15. Guo, H. et al. Пейзаж метилирования ДНК ранних эмбрионов человека. Природа 511 , 606–610 (2014).
ADS
CAS
Статья
Google ученый
16. Jung, Y.H. et al. Состояние хроматина в сперматозоидах мышей коррелирует с регуляторными ландшафтами эмбриона и взрослого человека. Cell Rep . 18 , 1366–1382 (2017).
CAS
Статья
Google ученый
17. Баранелло, Л., Кузин, Ф. и Левенс, Д. CTCF и когезин взаимодействуют для организации трехмерной структуры генома млекопитающих. Proc. Natl Acad. Sci. США 111 , 889–890 (2014).
ADS
CAS
Статья
Google ученый
18. Нора, Э. П. и др. Направленная деградация CTCF отделяет локальную изоляцию хромосомных доменов от геномной компартментализации. Ячейка 169 , 930–944 (2017).
CAS
Статья
Google ученый
19. Хуг, К. Б., Гримальди, А. Г., Круз, К. и Вакеризас, Дж. М. Архитектура хроматина возникает во время активации зиготического генома независимо от транскрипции. Cell 169 , 216–228 (2017).
CAS
Статья
Google ученый
20. Xue, Z. et al. Генетические программы ранних эмбрионов человека и мыши, выявленные с помощью секвенирования одноклеточной РНК. Природа 500 , 593–597 (2013).
ADS
CAS
Статья
Google ученый
21. Hendrickson, P. G. et al. Консервативные роли DUX мыши и DUX4 человека в активации генов стадии расщепления и ретротранспозонов MERVL / HERVL. Нат. Genet . 49 , 925–934 (2017).
CAS
Статья
Google ученый
22. Yan, L. et al. Профилирование одноклеточной РНК-seq доимплантационных эмбрионов человека и эмбриональных стволовых клеток. Нат. Struct. Мол. Биол . 20 , 1131–1139 (2013).
CAS
Статья
Google ученый
23. Schmitt, A. D. et al. Компендиум карт контактов хроматина показывает пространственно активные области в геноме человека. Cell Rep . 17 , 2042–2059 (2016).
CAS
Статья
Google ученый
24. Wu, J. et al. Анализ хроматина в раннем развитии человека показывает эпигенетический переход во время ZGA. Природа 557 , 256–260 (2018).
ADS
CAS
Статья
Google ученый
25. Gao, L. et al. Пейзаж доступности хроматина в ранних эмбрионах человека и его связь с эволюцией. Ячейка 173 , 248–259 (2018).
CAS
Статья
Google ученый
26. Flyamer, I. M. et al. Одноядерный Hi-C обнаруживает уникальную реорганизацию хроматина при переходе ооцита в зиготу. Природа 544 , 110–114 (2017).
ADS
CAS
Статья
Google ученый
27. Рой, Т. К., Брэдли, К. К., Боуман, М.C. & McArthur, S.J. Перенос одного эмбриона витрифицированных нагретых бластоцист дает эквивалентный уровень живорождений и улучшает исходы новорожденных по сравнению со свежими переносами. Fertil. Стерил . 101 , 1294–1301 (2014).
Артикул
PubMed
Google ученый
28. Zuin, J. et al. Cohesin и CTCF по-разному влияют на архитектуру хроматина и экспрессию генов в клетках человека. Proc. Natl Acad.Sci. США 111 , 996–1001 (2014).
ADS
CAS
Статья
PubMed
Google ученый
29. Guillou, E. et al. Cohesin организует петли хроматина на фабриках репликации ДНК. Гены Дев . 24 , 2812–2822 (2010).
CAS
Статья
PubMed
PubMed Central
Google ученый
30. Ramírez, F. et al.TAD высокого разрешения выявляют последовательности ДНК, лежащие в основе организации генома мух. Нат. Коммуна . 9 , 189 (2018).
ADS
CAS
Статья
PubMed
PubMed Central
Google ученый
31. Wolff, J. et al. Galaxy HiCExplorer: веб-сервер для воспроизводимого анализа данных Hi-C, контроля качества и визуализации. Nucleic Acids Res . 46 (W1), W11 – W16 (2018).
CAS
Статья
PubMed
PubMed Central
Google ученый
32. Имакаев М. и др. Итеративная коррекция данных Hi-C выявляет признаки организации хромосом. Нат. Методы 9 , 999–1003 (2012).
CAS
Статья
PubMed
PubMed Central
Google ученый
33. Durand, N.C. et al. Соковыжималка обеспечивает систему одним щелчком для анализа экспериментов Hi-C с петлевым разрешением. Cell Syst . 3 , 95–98 (2016).
CAS
Статья
PubMed
PubMed Central
Google ученый
34. Ursu, O. et al. GenomeDISCO: оценка соответствия для экспериментов по захвату конформации хромосом с использованием случайных блужданий по графам контактных карт. Биоинформатика 34 , 2701–2707 (2018).
CAS
Статья
PubMed
PubMed Central
Google ученый
35. Gassler, J. et al. Механизм когезин-зависимой экструзии петли организует зиготическую архитектуру генома. EMBO J . 36 , 3600–3618 (2017).
CAS
Статья
PubMed
PubMed Central
Google ученый
36. Наумова Н. и др. Организация митотической хромосомы. Наука 342 , 948–953 (2013).
ADS
CAS
Статья
PubMed
PubMed Central
Google ученый
37. Heinz, S. et al. Простые комбинации факторов транскрипции, определяющих клонирование, прививают цис--регуляторных элементов, необходимых для идентичности макрофагов и В-клеток. Мол. Ячейка 38 , 576–589 (2010).
CAS
Статья
PubMed
PubMed Central
Google ученый
38. Li, G. et al. Полногеномный аномальный метилом ДНК бластоцисты человека в вспомогательных репродуктивных технологиях. J. Genet. Геном . 44 , 475–481 (2017).
CAS
Статья
Google ученый
39. Лангмид, Б., Trapnell, C., Pop, M. & Salzberg, S.L. Сверхбыстрое и эффективное с точки зрения памяти выравнивание коротких последовательностей ДНК с геномом человека. Биология генома . 10 , R25 (2009).
CAS
Статья
PubMed
PubMed Central
Google ученый
40. DePristo, M. A. et al. Структура для обнаружения вариаций и генотипирования с использованием данных секвенирования ДНК следующего поколения. Нат. Genet . 43 , 491–498 (2011).
CAS
Статья
PubMed
PubMed Central
Google ученый
41. Li, H. et al. Формат Sequence Alignment / Map и SAMtools. Биоинформатика 25 , 2078–2079 (2009).
CAS
Статья
PubMed
PubMed Central
Google ученый
42. John, S. et al. Доступность хроматина предопределяет характер связывания глюкокортикоидных рецепторов. Нат. Genet . 43 , 264–268 (2011).
CAS
Статья
PubMed
PubMed Central
Google ученый
43. Ramírez, F. et al. deepTools2: веб-сервер нового поколения для глубокого анализа данных. Nucleic Acids Res . 44 (W1), W160 – W165 (2016).
MathSciNet
CAS
Статья
PubMed
PubMed Central
Google ученый
44. Айзенберг, Э. и Леванон, Э. Ю. Гены домашнего хозяйства человека, повторное посещение. Тенденции Генет . 29 , 569–574 (2013).
CAS
Статья
PubMed
Google ученый
45. Dobin, A. et al. STAR: сверхбыстрый универсальный выравниватель RNA-seq. Биоинформатика 29 , 15–21 (2013).
CAS
Статья
Google ученый
46. Gu, Z., Gu, L., Eils, R., Schlesner, M. & Brors, B. circlize Реализует и улучшает круговую визуализацию в R. Bioinformatics 30 , 2811–2812 (2014).
CAS
Статья
PubMed
Google ученый
47. Consortium, E. P .; Консорциум проектов ENCODE. Интегрированная энциклопедия элементов ДНК в геноме человека. Природа 489 , 57–74 (2012).
ADS
CAS
Статья
Google ученый
Структурные функции
Функция | Описание |
Дубликат | Возвращает клон, также известный как глубокая копия переменной. |
IsStruct | Проверяет, является ли переменная структурой. |
StructAppend | Добавляет одну структуру к другой. |
StructClear | Удаляет все данные из структуры. |
StructCopy | Копирует структуру. |
StructCount | Подсчитывает ключи в структуре. |
StructDelete | Удаляет элемент из конструкции. |
StructEach | Перебирает элементы в структуре, обращаясь к парам «ключ-значение». |
StructFind | Определяет значение, связанное с ключом в структуре. |
StructFindKey | Рекурсивный поиск в подструктуре вложенных массивов, структур и других элементов структур, ключи которых совпадают с ключом поиска в параметре значения. |
StructFindValue | Выполняет рекурсивный поиск в подструктуре вложенных массивов, структур и других элементов структур со значениями, соответствующими ключу поиска в параметре значения. |
StructFilter | Фильтрует пары ключ-значение в структуре. |
StructGet | Возвращает значение в структуре или структуре по указанному пути. |
StructGetMetadata | Получает метаданные для ключей в структуре. |
Вставка StructInsert | Вставляет пару «ключ-значение» в структуру. |
StructIsCaseSensitive | Определяет, является ли структура чувствительной к регистру.
|
StructIsOrdered | Определяет, упорядочена структура или нет. |
StructIsEmpty | Проверяет, пуста ли структура. |
StructKeyArray | Возвращает ключи в структуре CFML в виде массива. |
StructKeyExists | Проверяет, существует ли какой-либо ключ в структуре. |
StructKeyList | Извлекает ключи из структуры CFML. |
StructMap | Обходит каждую запись структуры и вызывает функцию закрытия для работы с парой значений ключа структуры. Возвращаемое значение будет установлено для того же ключа в новой структуре, и новая структура будет возвращена. |
StructNew | Создает объект структуры. |
StructSetMetadata | Устанавливает метаданные для ключей в структуре. |
StructSort | Сортировка ключей в структуре. |
StructReduce | Обходит каждую запись структуры и вызывает закрытие для работы с парой значений ключа структуры. |
StructToSorted | Преобразует любую структуру в отсортированную структуру. |
StructUpdate | Обновляет структурный ключ значением. |
Ключевые конструктивные элементы | Эдинбургский университет
Дизайн включает ключевые структурные элементы, обеспечивающие единообразие взаимодействия с пользователем.
Ключевые элементы, используемые на сайте университета:
- Глобальный баннер
- Глобальный баннер позволяет пользователю всегда перейти на домашнюю страницу университета и страницу школ и факультетов и выполнить поиск по сайту.
- Дополнительный баннер
- Баннер дочернего сайта помогает указать, о чем этот дочерний сайт и какую информацию он содержит.
- Свяжитесь с нами
Эта ссылка переводит пользователей на страницу «Свяжитесь с нами» для сайта отдела, который они посещают.
- Навигация по сайту
Навигация находится в левой части сайта. Когда пользователи нажимают на подраздел, они могут видеть дочерние страницы этого раздела в навигации.
- Панировочные сухари
Навигатор предлагает пользователям полный путь к домашней странице университета. Все элементы являются действующими ссылками, кроме последней (страницы, которую вы посещаете в данный момент). Путь к хлебным крошкам автоматически создается EdWeb, но его можно редактировать.
- Глобальный нижний колонтитул
Ссылки в глобальном нижнем колонтитуле постоянно представлены на веб-сайте университета.
Скриншот
На изображении ниже показана типичная страница с аннотациями этих элементов, кроме глобального нижнего колонтитула.
URL
EdWeb автоматически заполнит сегмент URL на основе вашего заголовка и рекомендаций URL — целые слова в нижнем регистре, разделенные дефисами.Возможно, вам придется отредактировать его дальше, чтобы полностью соответствовать рекомендациям.
Политика именования URL-адресов ( UWP сайт)
Посмотрите наше видео о создании удобочитаемых адресов веб-сайтов в Media Hopper (часть курса «Эффективный цифровой контент»).
Ссылки по теме
EdWeb больше не использует раздел «Ссылки по теме», как это делала Polopoly. Это сделано для того, чтобы избежать длинных списков ссылок, которые находятся вне контекста внизу вашей страницы.
Вы по-прежнему можете включать релевантные ссылки внизу, но важно, чтобы они были сфокусированы.Общие заголовки, такие как «Ссылки», «Ресурсы» и «Связанные ссылки», мало что делают для информирования вашего пользователя. Подумайте, зачем нужны эти ссылки, и дайте им соответствующий заголовок. Эти ссылки могут быть даже лучше встроены в контекст вашей страницы.
Ссылки — больше о том, как работают ссылки в EdWeb
.