(4) Команды Redis с разными типами данных
③ Set
Особенности: неповторяемость, без серийного номера Применимые сценарии: общее внимание / общие друзья / общие хобби …
④ ZSet
ZSet: набор наборов, который можно сортировать Функции: неповторяемость, возможность сортировки Применимые сценарии: рейтинг / горячие продукты …
⑤ Hash
Особенности: Структура карты Разделить кеш (каждый кеш — это карта) Если объект стал более толстым, атрибуты легко изменить Приложение: разделите пространство кеша по регионам, сохраните данные объекта, которые могут потребовать изменения поля
Предыдущая запись:Основы Linux Следующая статья:Операция Java Redis (инструмент Jedis)
Особенности¶
Redis умеет сохранять данные на диск. Можно настроить Redis так, чтобы данные вообще не сохранялись, сохранялись периодически по принципу copy-on-write, или сохранялись периодически и писались в журнал (binlog). Таким образом, всегда можно добиться требуемого баланса между производительностью и надежностью.
В основе своей использует записи вида ключ-значение. Ключи бинарнобезопасны. Это значит, что в качесте ключа может быть использована любая бинарная последовательность, полученная хоть из сроки, хоть из JPG-картинки. Максимальный размер ключа — 512 MB.
В качестве значений поддерживаются следующие структуры данных:
- Строки (strings). Это те же самые ключи, но сохранённые как значения.
- Списки (lists). Классические списки строк, упорядоченные в порядке вставки, которая возможна как со стороны головы, так и со стороны хвоста списка.
- Множества (sets). Множества строк в математическом понимании: не упорядочены, поддерживают операции вставки, проверки вхождения элемента, пересечения и разницы множеств.
- Упорядоченные множества (sorted sets). Упорядоченное множество отличается от обычного тем, что его элементы упорядочены по особому параметру «score». Позволяет выбирать группы значений из множества. Например, 10 сверху. Присутствует возможность лексических упорядоченных множеств строк, у которых поле score одинаковое.
- Хеш-таблицы (hashes). Классические хеш-таблицы или ассоциативные массивы.
- Битовые массивы (bitmaps).
- HyperLogLog. Структура данных для реализации алгоритма случайного вероятностного подсчета количества уникальных значений.
Для всех этих типов поддерживаются атомарные операции (например вставка в список или пересечение множеств).
Позволяет хранить не только строки, но и массивы (которые могут использоваться в качестве очередей или стеков), словари, множества без повторов, , а также множества, отсортированные по некой величине. Разумеется, можно работать с отдельными элементами списков, словарей и множеств. Присутствует возможность указать время жизни данных (двумя способами — «удалить тогда-то» и «удалить через …»).
Интересная особенность Redis заключается в том, что это — однопоточный сервер. Такое решение сильно упрощает поддержку кода, обеспечивает атомарность операций и позволяет запустить по одному процессу Redis на каждое ядро процессора. Разумеется, каждый процесс будет прослушивать свой порт.
В Redis есть репликация. Репликация с несколькими главными серверами не поддерживается. Каждый подчиненный сервер может выступать в роли главного для других. Репликация в Redis не приводит к блокировкам ни на главном сервере, ни на подчиненных. На репликах разрешена операция записи. Когда главный и подчиненный сервер восстанавливают соединение после разрыва, происходит полная синхронизация (resync).
Также Redis поддерживает транзакции (будут последовательно выполнены либо все операции, либо ни одной) и пакетную обработку команд (выполняем пачку команд, затем получаем пачку результатов). Притом ничто не мешает использовать их совместно.
С версии 2.6.0 добавлена поддержка Lua, позволяющего выполнять запросы на сервере. Lua позволяет атомарно совершить произвольную обработку данных на сервере и предназначена для использования в случае, когда нельзя достичь того же результата с использованием стандартных команд.
Еще одна особенность Redis — поддержка механизма publish/subscribe. С его помощью приложения могут создавать каналы, подписываться на них и помещать в каналы сообщения, которые будут получены всеми подписчиками. Что-то вроде IRC-чата.
(2) Установка и запуск Redis
1. Разархивируйте установочный пакет Redis.
tar -zxvf redis.x.tar.gz (файл .tar)
2. Компиляция и установка Redis
A. Сначала установите gcc (для работы yum install gcc: yum требуется сеть) Б. Выполните команду make в корневом каталоге Redis для компиляции.
3. Redis запускает сервер
./redis-server (Эта команда должна выполняться под bin-файлом Redis)
4. Клиент подключается к Redis.
После запуска сервера скопируйте страницу подключения клиента Выполнить в каталоге bin ./redis-cli
5. Клиент закрывает сервис.
./redis-cli shutdown
6. Загрузите указанный файл конфигурации и запустите службу.
Выполнить в каталоге bin Redis (потому что ./redis-server находится в bin?) ./redis-server… / redis.conf (файл конфигурации в корневом каталоге Redis)
Транзакции в Redis
Обычное определение транзакций для реляционных баз данных означает следующее: транзакции это группа команд с базой данных, которые должны либо полностью выполнится или в случае возникновение ошибки вернуть состояние базы данных в исходное состояние. В Redis то же есть такое понятие как транзакции. Но означает немного другое. Транзакции в Redis это просто последовательное выполнение ранее записаных команд без возможности полноценного возвращения исходного состояния в случае ошибки исполнения.
С помощью команды MULTI можно начать запись команд. Далее введенные команды не исполняются а записываются в буфер. Это будет происходит до ввода команды на исполнения транзакции EXEC. Далее все ранее введенные команды будут исполнены один за другим. Команда DISCARD отмена записи команд транзакций. Если возникнет ошибка в процессе ввода команд вся транзакция не будет выполнена.
127.0.0.1:6379> MULTI OK 127.0.0.1:6379> SET obj1 value1 QUEUED 127.0.0.1:6379> SET obj2 value2 QUEUED 127.0.0.1:6379> EXEC 1) OK 2) OK 127.0.0.1:6379> GET obj1 "value1"
Основы применение Redis в Python
Redis очень широко применяется в современной разработке ПО. Библиотеки поддержки есть для любого языка программирования.
Его используют в:
- Кеширование данных
- Чаты и системы обмена сообщенийДиспетчеризация любых данных
- Различные очереди задач
- Мониторинг различных данных
Кратко рассмотрим использование Redis в Python. Для этого первым делом загрузим библиотеку поддержки:
#!/usr/bin/env python import redis
Далее подключимся к серверу
client = redis.Redis(host='127.0.0.1')
И далее можно уже начать попробовать использовать все ранее рассмотренные команды. Надеюсь они будут понятны без дополнительных пояснений:
client.set('Language', 'Python') print client.get('Language')
from time import sleep client.set('Language', 'Python', ex=5) print client.get('Language') sleep(3) print client.ttl('Language')
# Пример использования множеств client.sadd('pythonlist', 'value1', 'value2', 'value3') print client.smembers('pythonlist') client.sadd('redislist', 'value1', 'value5', 'value6', 'value7', 'value8') print "sinter", client.sinter('pythonlist', 'redislist') print "sunion", client.sunion('pythonlist', 'redislist') print client.scard('pythonlist')
# Пример использования хеш таблиц client.hset('Person', 'Name', 'Person1') client.hset('Person', 'Health', '600') client.hset('Person', 'Mana', '200') print client.hgetall('Hero')
Основные команды
Redis поддерживает операции со строками, списками, множествами, хеш-таблицами, упорядоченными множествами и так далее.
Рассмотрим основные операции на примере хеш-таблиц.
HSET — сохраняет значение по ключу:
В примере выше мы создали объект person1 с двумя полями (name и age) и соответствующими значениями.
HGET — получение значения по ключу (для определённого поля):
Выше мы получили значение поля name у ключа person1.
HGETALL — получение всех пар «ключ-значение»:
Получили значения всех полей по ключу person1.
HKEYS и HVALS — получение всех ключей и соответствующих им значений:
Транзакции
Важно понимать, что транзакции в Redis не сохраняют целостность данных (сбой одной операции при выполнении блока транзакции не мешает исполнить другие). После запуска команды multi интерфейс redis-cli ответил на каждую последующую состоянием QUEUED («в очереди»)
Когда мы запустили команду exec, то получили выходные данные каждой команды из очереди
После запуска команды multi интерфейс redis-cli ответил на каждую последующую состоянием QUEUED («в очереди»). Когда мы запустили команду exec, то получили выходные данные каждой команды из очереди.
Отменить транзакцию можно командой discard. Она предотвратит запуск всех команд, ранее поставленных в очередь, — и Redis снова будет выполнять команды в обычном режиме. Чтобы сообщить серверу, что вы открываете новую транзакцию, нужно снова запустить multi.
Важно понимать, что когда команда уже встала в очередь (то есть синтаксически верна), то, даже если она и вызовет ошибку при выполнении, остальные команды выполнятся всё равно. А вот если не встала (невалидна, вызвала ошибку при постановке в очередь), то Redis блок транзакции отклонит, даже не дождавшись exec
И если вы попытаетесь после этого выполнить exec, вам скажут, что транзакция была отклонена из-за предыдущих ошибок.
Как Redis обрабатывает ошибки внутри транзакций, .
Переключите БД в Redis
http-equiv=»Content-Type» content=»text/html;charset=UTF-8″>yle=»margin-bottom:5px;»>Теги: redis
Переключите БД в Redis
Redis использовался в качестве кэша данных в проекте, но слишком много экземпляров redis открываются на одном сервере, что слишком сильно влияет на управление. Существуют ли какие-либо данные приложения, которые не используются для усиления и отделения друг от друга и хранятся в одном экземпляре? Эквивалентно базе данных mysql, разные данные приложения хранятся в разных базах данных.
При redis база данных идентифицируется целочисленным индексом, а не именем базы данных. По умолчанию клиент подключается к базе данных 0. Следующие параметры в файле конфигурации redis контролируют общее количество баз данных:
/etc/redis/redis.conf Файл , есть элемент базы данных конфигурации = 16 (по умолчанию 16 баз данных)
Вы можете использовать следующую команду для переключения на другую базу данных
Впоследствии все команды будут использовать базу данных 3, пока вы явно не переключитесь на другую базу данных.
Каждая база данных имеет свое собственное пространство, поэтому вам не нужно беспокоиться о ключевых конфликтах.
В разных базах данных один и тот же ключ получает свое значение.
Команда flushdb очищает данные, она очищает только данные в текущей базе данных и не влияет на другие базы данных.
Команда flushall очистит данные этого экземпляра. Будьте предельно осторожны перед выполнением этой команды.
Количество баз данных настраивается, по умолчанию 16. Измените директиву database в redis.conf: Redis не предоставляет методов для сопоставления и идентификации различных баз данных. Поэтому вам необходимо отслеживать, какие данные хранятся в какой базе данных. Поэтому, если вы столкнетесь со сценарием, в котором открыто много экземпляров, вы можете использовать разные базы данных для хранения вместо того, чтобы открывать так много экземпляров.
Добавьте следующий код в файл конфигурации свойств
Тогда соответствующая
После добавления выбранной базы данных, кода конфигурации Redis, см. Следующую статьюНастройка и инициализация пула соединений Redis
Интеллектуальная рекомендация
19.03.21 Я загрузил комплексные обучающие видеоуроки Photoshop CC 2015 и обучающие видеоуроки по новым функциям PS CC 2015. Я просмотрел несколько видео, но мне кажется, что они в основном объясняют н…
…
проверка данных весеннего mvc Два способа проверки данных Spring MVC: 1.JSR303 2.Hibernate Validator Второй метод является дополнением к первому методу Шаги для проверки данных с использованием Hibern…
Существует два способа вызова между сервисами Springcloud: RestTemplate и Feign. Здесь мы представляем сервисы вызова RestTemplate. 1. Что такое RestTemplate RestTemplate — это структура веб-запросов …
1. Понимать предварительный, средний, последующий порядок и иерархическую последовательность бинарных деревьев; Свяжите язык C со структурой данных двоичного дерева; Освойте с…
Вам также может понравиться
Последнее обучение, как использовать Kaldi, чтобы проснуться без использования WSTF, поэтому вам нужно глубоко пойти в Kaldi для обучения. Временное состояние обучения. Три изображения представляют со…
Во время простоя некоторые веб-страницы, которые мы создали, не были завершены, но не хотят, чтобы другие видели, вы можете создать простой эффект шифрования страницы на странице этой веб-страницы, ан…
Расширенные статьи серии Zookeeper 1. NIO, ZAB соглашение, 2PC представления концепции 2. Лидер выборов 3. Рукописный распределенный замок, центр настройки ==================================== 1. NIO,…
Посмотрите на конечный эффект первым DemoPreview.gif SETP1 эффект капли воды Первая реакция на эффект капли воды — нарисовать замкнутую кривую. С помощью события MotionEvent измените радиус во время п…
…
Развёртываем приложение и базы
Воспользуемся Docker. Нам нужно подготовить развёртывание трёх наших сервисов: MySQL, Redis и самого приложения.
Создадим Dockerfile для описания образа нашего приложения:
Затем создадим файл docker-compose (описывает несколько связанных между собой контейнеров):
В нашем случае файл содержит описание трёх сервисов с именами контейнеров, образов и обозначением портов. Параметром environment задаются переменные среды.
Настраиваем подключение к базе
Это делается в файле application.properties:
Обратите внимание, что в spring.datasource.url и spring.redis.host задаются хосты контейнеров. spring.cache.redis.time-to-live задаёт время существования параметра в кэше
spring.cache.redis.time-to-live задаёт время существования параметра в кэше.
Собираем проект
Это делается командами:
./mvnw clean package -Dmaven.test.skip=true — собираем проект в JAR-файл.
docker-compose up — инициируем выполнение файла docker-compose.yml — а именно сборку трёх образов и создание контейнеров.
Результат отразится в терминале:
Проверяем эффект от кэширования
Чтобы протестировать работу сервисов, несколько раз выполним post-запрос, добавляющий новую книгу:
Это можно сделать через терминал или в Postman.
Далее в отдельном терминале выполняем команды:
Здесь мы подключаемся к контейнеру Redis и проверяем, что добавленные в базу книги попали и в кэш. Для чистоты эксперимента — очищаем кэш.
Далее подключаемся к контейнеру основного приложения в режиме чтения логов с помощью команды:
Флаг -f означает чтение логов в режиме реального времени (новые логи будут последовательно выводиться в консоль в порядке их появления), а 6f767bc19768 — идентификатор контейнера (его можно получить командой docker ps).
Затем несколько раз выполняем запрос списка книг:
и в логах получаем результат:
Видим, что первый запрос длился 676 мс (Duration) — его результаты выбирались из базы MySQL. А вот результаты последующих двух брались уже из кэша — и эти запросы выполнились в 60 раз быстрее.
Повторная проверка после очистки кэша подтверждает это:
Механиз подписок PUS-SUB
Одно из основных преимуществ Redis от других key-value хранилищ заключается в том, что в Redis есть механизм подписок. То есть Redis можно использовать как сервер сообщений.
Одни клиенты подписываются на определенные каналы используя команду SUBSCRIBE имя_канала
Другие клиенты могут отправлять сообщения в этот канал используя команду PUBLISH имя_канала значение
Допустим один клиент подписывается на канал
SUBSCRIBE channel Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "channel" 3) (integer) 1
Другой клиент что то отправляет в этот канал
PUBLISH channel "hello world" (integer) 1
И в этот момент первый клиент получит это сообщение
SUBSCRIBE channel Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "channel" 3) (integer) 1 1) "message" 2) "channel" 3) "hello world"
Основные сценарии
Кэш Azure для Redis повышает производительность приложений за счет поддержки стандартных шаблонов архитектуры приложений. Ниже перечислены некоторые наиболее распространенные шаблоны.
Шаблон | Описание |
---|---|
Кэш данных | Базы данных часто слишком велики для загрузки непосредственно в кэш. Обычно используется шаблон кэш на стороне для загрузки данных только при необходимости. Когда система вносит изменения в данные, она может обновлять кэш, который затем распространяется на другие клиенты. Кроме того, система может установить истечение срока действия данных или использовать политику вытеснения, чтобы вызвать обновление данных в кэше. |
Кэш содержимого | Многие веб-страницы создаются на основе шаблонов, использующих статическое содержимое, например верхние и нижние колонтитулы или баннеры. Эти статические элементы должны изменяться не часто. Использование кэша в памяти обеспечивает быстрый (по сравнению с серверными хранилищами данных) доступ к статическому содержимому. Данный шаблон сокращает время обработки и нагрузку на сервер, что позволяет повысить скорость реагирования веб-серверов. Это позволяет сократить количество серверов, необходимых для обработки нагрузок. Кэш Azure для Redis предоставляет поставщик кэша вывода Redis для поддержки этого шаблона с помощью ASP.NET. |
Хранилище сеансов | Этот шаблон обычно используется с корзинами покупок и другими данными из истории пользователя, которую веб-приложение может связать с файлами cookie пользователя. Хранение большого объема содержимого в файле cookie может отрицательно сказаться на производительности, так как размер этого файла растет, передается и проверяется с каждым запросом. Типичным решением является использование файла cookie в качестве ключа для запроса данных в базе данных. Использование кэша в памяти, например кэша Azure для Redis, для связывания информации с пользователем намного быстрее, чем взаимодействие с полной реляционной базой данных. |
Очереди задач и сообщений | Приложения часто добавляют задачи в очередь, если для выполнения операций, связанных с запросом, требуется какое-то время. Более длительные операции помещаются в очередь для последовательной обработки (зачастую на другом сервере). Этот метод отсрочки работы называется постановкой задач в очередь. Кэш Azure для Redis предоставляет распределенную очередь, обеспечивающую возможность использования этого шаблона в приложении. |
Распределенные транзакции | Приложениям иногда требуется, чтобы ряд команд для серверного хранилища данных выполнялся как единая атомарная операция. Все команды должны успешно завершиться или все транзакции должны быть возвращены в исходное состояние. Кэш Azure для Redis поддерживает выполнение пакета команд в рамках одной транзакции. |
Предисловие:
В реальных проектах сервер базы данных MySQL иногда находится на другом хосте, и доступ к базе данных должен осуществляться через сеть; даже если приложение и база данных MySQL находятся на одном хосте, доступ к MySQL также включает операции дискового ввода-вывода (MySQL также имеет некоторое предварительное чтение данных. Технология может уменьшить количество операций чтения и записи дискового ввода-вывода. Эта часть будет изучена позже. Короче говоря, чтение данных непосредственно из MySQL не так эффективно, как чтение данных непосредственно из памяти. Чтобы повысить эффективность доступа к базе данных, люди использовали различные методы, один из которыхИспользуйте систему кэширования с выделением памяти, размещенную между базой данных и приложением. При поиске данных сначала ищите их в памяти, если он находит, используйте, если не находит, то действительно обращайтесь к базе данных. Этот метод может повысить общую эффективность системы в некоторых сценариях (например, при частом поиске одних и тех же данных).
Основная цель этой статьи — представить такой метод, как упоминалось выше, с использованием базы данных redis nosql в качестве кеша базы данных Mysql. При поиске сначала найдите кеш Redis, если он найден, верните результат; если не найден в Redis, выполните поиск В базе данных Mysql, если цветок найден, возвращается результат и обновляется redis; если он не найден, возвращается пустой. В случае записи, напрямую пишите в базу данных mysql, и база данных mysql автоматически обновляет измененное содержимое до redis через триггер и механизм UDF.
1. Экспериментальная среда
server1 | nginx+php | 172.25.75.1 |
---|---|---|
server2 | redis | 172.25.75.2 |
server3 | mysql | 172.25.75.3 |
статус selinux отключен. Отключите брандмауэр.
2. Разверните nginx + php на server1 (здесь nginx используется только как интерфейсный сервер, требования к версии невысоки)
Частичная утрата ключей
Кэш Azure для Redis не удаляет ключи случайным образом, если они сохранены в памяти, но может удалить ключи согласно политикам истечения срока действия или вытеснения, а также при получении явной команды удаления ключа. Ключи, которые были записаны в первичный узел в экземпляре Кэша Azure для Redis ценовой категории «Премиум» или «Стандартный», также могут быть не сразу доступны в реплике. Данные реплицируются с первичного узла в реплику в асинхронном режиме и без блокировки.
Если вы обнаружите, что ключи исчезли из кэша, проверьте следующие возможные причины.
Причина | Описание |
---|---|
Ключи удалены, так как для них задано истечение времени ожидания. | |
Ключи удалены из-за нехватки памяти. | |
Ключи удалены с помощью явных команд удаления. | |
Ключи недоступны в реплике из-за задержек репликации данных. |
Окончание срока действия ключа
Кэш Azure для Redis удаляет ключ автоматически, если этому ключу назначено время ожидания и этот период истек. Дополнительные сведения об окончании срока действия ключа Redis см. в документации по команде EXPIRE. Значения времени ожидания также можно задать с помощью SET, SETEX, GETSET и других команд *STORE.
Чтобы получить данные статистики о числе ключей с истекшим сроком действия, используйте команду INFO. В разделе отображается общее число ключей с истекшим сроком действия. В разделе содержатся дополнительные сведения о числе ключей с истекшим временем ожидания и средним значением времени ожидания.
Вы также можете просмотреть метрики диагностики для кэша, чтобы определить, существует ли корреляция между моментом, когда пропал ключ, и увеличением числа ключей с истекшим сроком действия. Сведения об использовании уведомлений пространства ключей или команды MONITOR для отладки проблем такого вида см. в приложении .
Вытеснение ключей
Для хранения данных Кэшу Azure для Redis требуется определенный объем памяти. Он очищает ключи, если нужно освободить память. Когда значения used_memory или used_memory_rss в команде INFO приближаются к заданному значению параметра maxmemory, Кэш Azure для Redis начинает вытеснять ключи из памяти на основе политики кэша.
Количество вытесненных ключей можно отслеживать с помощью команды INFO.
Вы также можете просмотреть метрики диагностики для кэша, чтобы определить, существует ли корреляция между моментом, когда пропал ключ, и увеличением числа вытесненных ключей. Сведения об использовании уведомлений пространства ключей или команды MONITOR для отладки проблем такого вида см. в приложении .
Удаление ключей
Клиенты Redis могут использовать команду DEL или HDEL, чтобы явно удалить ключи из Кэша Azure для Redis. Число операций удаления можно узнать с помощью команды INFO. Если были вызваны команды DEL или HDEL, они будут указаны в разделе .
Асинхронная репликация
Любой экземпляр Кэша Azure для Redis ценовой категории «Стандартный» или «Премиум» настраивается с первичным узлом и по крайней мере одной репликой. Данные копируются с первичного узла в реплику асинхронно с помощью фонового процесса. На веб-сайте redis.io описано, как работает репликация данных Redis в целом. Если клиенты часто записывают данные в Redis, может произойти частичная утрата данных, так как мгновенное выполнение репликации не гарантируется. Например, если первичный узел отключается после того, как клиент записывает в него ключ, но до того, как фоновый процесс отправит этот ключ в реплику, ключ будет потерян в момент, когда реплика станет новым первичным узлом.