1. Введение в Redis
1.1 Что такое NoSQL
NoSQL обычно относится к нереляционным базам данных, NoSQL — это не только SQL, его можно использовать как хорошее дополнение к реляционным базам данных. С появлением веб-сайтов в Интернете 2.0 нереляционные базы данных стали чрезвычайно популярной новой областью, и продукты нереляционных баз данных развивались очень быстро. Однако традиционная реляционная база данных не смогла справиться с веб-сайтом web2.0, особенно со сверхкрупномасштабным и высококонкурентным веб-сайтом web2.0 типа SNS, который выявил множество непреодолимых проблем, таких как:
-
Высокая производительность — потребность в большом количестве одновременных операций чтения и записи в базу данных.
Веб-сайт web2.0 должен генерировать динамические страницы и предоставлять динамическую информацию в режиме реального времени в соответствии с персонализированной информацией пользователя, поэтому практически невозможно использовать технологию статической динамической страницы, поэтому одновременная нагрузка на базу данных очень высока, часто достигает десятки тысяч запросов на чтение и запись в секунду. Реляционные базы данных едва выдерживают десятки тысяч SQL-запросов, ноДесятки тысяч запросов на запись данных SQL, ввод-вывод на жесткий диск больше не выдерживает. На самом деле, для обычных веб-сайтов BBS часто предъявляются требования к высоким одновременным запросам на запись, такие как статистика онлайн-статуса пользователя в реальном времени, запись кликов по популярным постам, подсчет голосов и т. д., так что это довольно распространенное требование.
-
Огромное хранилище — потребность в эффективном хранении и доступе к огромным объемам данных.
Веб-сайты социальных сетей, такие как Facebook, Twitter и Friendfeed, генерируют огромную динамику пользователей каждый день.В качестве примера Friendfeed достигает 250 миллионов пользователей в месяц.Для реляционных баз данных в таблице с 250 миллионами записейЭффективность выполнения запросов SQL в нем крайне низко и даже невыносимо. Другим примером является система регистрации пользователей крупных веб-сайтов, таких как Tencent и Shanda, которые имеют сотни миллионов учетных записей, и с реляционными базами данных также трудно справиться.
-
High Scalability && High Availability — необходимость высокой масштабируемости и высокой доступности базы данных
В веб-архитектуре базу данных сложнее всего масштабировать по горизонтали.Когда количество пользователей и посещений системы приложений увеличивается день ото дня, ваша база данных не может быть такой простой, как добавление дополнительных веб-серверов и серверов приложений. и сервисные узлы для масштабирования производительности и грузоподъемности. Для многих веб-сайтов, которым необходимо обеспечить круглосуточное бесперебойное обслуживание, очень болезненно обновлять и расширять систему баз данных, что часто требует простоя обслуживания и переноса данных.Почему нельзя расширить базу данных, постоянно добавляя серверные узлы?
База данных NoSQL была создана для решения проблем, связанных с крупномасштабным сбором данных и несколькими типами данных, особенно с проблемами приложений для работы с большими данными.
Некоторые основные продукты NoSQL:
Четыре основные категории баз данных NoSQL:
-
1) База данных хранилища ключей-значений
Связанные продукты: TokyoCabinet/Tyrant, Redis, Voldemort, Berkeley DB
Типичные области применения: Кэширование контента, в основном используемое для обработки высоких нагрузок доступа к большим объемам данных.
Модель данных: массив пар ключ-значение.
Преимущества: Быстрый запрос
Недостаток: сохраненные данные менее структурированы
-
2) База данных хранилища столбцов
Сопутствующие товары: Cassandra, HBase, Riak
Типичное применение: распределенная файловая система
Модель данных: Хранится в кластере столбцов, храня данные одних и тех же столбцов вместе.
Преимущества: быстрый поиск, сильная масштабируемость, более простое распределенное расширение.
Недостаток: Относительно ограниченный функционал
-
3) База данных документов
Связанные продукты: CouchDB, MongoDB
Типичное приложение: веб-приложение (аналогично Key-Value, значение структурировано)
Модель данных: массив пар ключ-значение.
Преимущество: требования к структуре данных не являются строгими.
Недостатки: производительность запросов невысокая, отсутствует унифицированный синтаксис запросов.
-
4) Графическая база данных
Соответствующие базы данных: Neo4J, InfoGrid, Infinite Graph
Типичное применение: социальная сеть
Модель данных: структура графика
Преимущества: использование алгоритмов, связанных со структурой графа.
Недостаток: для получения результата необходимо вычислить весь граф, а сделать распределенное кластерное решение непросто.
1.2 Историческое развитие Redis
В 2008 году итальянская компания-стартап Merzia запустила LLOOGG, статистическую систему для веб-сайтов в режиме реального времени, основанную на MySQL.Однако основатель компании Сальваторе Санфилиппо вскоре разочаровался в производительности MySQL. поэтому он решил настроить систему LLOOGG.База данных была разработана в 2009. Это база данных Redis. Однако Сальваторе Санфилиппо не был удовлетворен использованием Redis только для LLOOGG, но надеялся, что его будет использовать больше людей.Поэтому в том же году Сальваторе Санфилиппо выпустил Redis с открытым исходным кодом и начал работать с Питером Ноордхуисом, другим крупным автором кода Redis. совместное развитие Redis до сегодняшнего дня.
Сам Сальваторе Санфилиппо не ожидал, что всего через несколько лет у Redis появится огромная пользовательская база. В 2012 году Hacker News опубликовали опрос об использовании базы данных и обнаружили, что почти 12% компаний используют Redis. Внутренние пользователи, такие как Sina Weibo, Jibeiwang, Zhihu.com, и зарубежные пользователи, такие как GitHub, Stack Overflow и Flickr, являются пользователями Redis.
VMware спонсирует разработку Redis с 2010 года, а Сальваторе Санфилиппо и Питер Нордхуис присоединились к VMware в марте и мае соответственно для разработки Redis на постоянной основе.
1.3 Что такое редис
Redis — это высокопроизводительная база данных с открытым исходным кодом, разработанная на языке C.
Redis — это nosql (не только sql, не только sql) база данных, в переводе на китайский язык называется нереляционной базой данных. Redis хранит данные в памяти, Redis широко используется в интернет-проектах благодаря высокой скорости доступа к контенту.
- Преимущества Redis: Быстрая скорость доступа Официально скорость чтения будет достигать 300 000 раз в секунду, а скорость записи самая высокая 100 000 раз в секунду, что ограничено аппаратно.
- Недостатки: поддержка персистентности недостаточно хороша, поэтому Redis обычно не используется в качестве основного хранилища данных в базе данных и обычно используется с традиционными реляционными базами данных.
Redis предоставляет различные типы данных «ключ-значение» для удовлетворения требований к хранилищу в различных сценариях.На данный момент Redis поддерживает следующие типы данных «ключ-значение»:
- Тип строки
- тип хеша
- Тип списка
- Тип коллекции
- Сортированный тип коллекции
1.4 Сценарии приложений Redis
1) Кэш (запрос данных, короткое соединение, новостной контент, товарный контент и т. д.). (наиболее используемый)
2) Разделение сеансов в распределенной кластерной архитектуре.
3) Список онлайн-друзей в чате.
4) Очередь задач (seckill, snap-up, 12306 и т.д.)
5) Таблица лидеров приложений.
6) Статистика посещений сайта.
7) Обработка истечения срока действия данных (может быть с точностью до миллисекунд)
8) Сохраняйте ответы на сообщения блога или форума и т. д.
2. Установите и запустите Redis
Online Redis обычно устанавливается и запускается на сервере Linux.В этом руководстве для демонстрации и обучения используется виртуальная машина Linux и клиент ssh.
Сервер Linux - CentOS 6.4.
ssh-клиент: установите ssh-клиент в среде разработки (Windows) В этой статье SecureCRT используется в качестве ssh-клиента для подключения к виртуальной машине.
2.1 Среда установки Redis
Redis разработан на языке C и рекомендуется для работы в Linux.В этой статье в качестве среды установки используется Centos6.4.
Для установки redis нужно сначала скомпилировать исходный код, скачанный с официального сайта, компиляция зависит от среды gcc, если среды gcc нет, то нужно установить gcc:yum install gcc-c++
2.2 установка редис
1) Примечания к выпуску
В этой статье используется версия redis3.0. Версия 3.0 в основном добавляет функцию кластера Redis.
2) Загрузка исходного кода
Скачать с официального сайта:скачать.Redis.IO/релизы/горячие…
Скопируйте redis-3.0.0.tar.gz в /usr/local.
3) Разархивируйте исходный код:tar -zxvf [redis-3.0.0]().tar.gz
4) Войдите в распакованный каталог для компиляции
cd /usr/local/redis-3.0.0
make
5) Установите в указанный каталог, например /usr/local/redis
cd /usr/local/redis-3.0.0
make PREFIX=/usr/local/redis install
6) redis.conf
redis.conf
это файл конфигурации Redis,redis.conf
В исходном каталоге Redis.
Обратите внимание, что порт изменен как порт процесса redis, и по умолчанию используется порт 6379.
7) Скопируйте файл конфигурации в каталог установки
Заходим в директорию с исходниками, там есть конфигурационный файл redis.conf, и копируем его в путь установки:
cd /usr/local/redis
mkdir conf
cp /usr/local/redis-3.0.0/redis.conf /usr/local/redis/bin
8) Список файлов в каталоге установки bin
Новый redis-sentinel в redis3.0 — это инструмент управления кластером Redis, обеспечивающий высокую доступность. Каталог файла конфигурации:
2.3 повторный запуск
2.3.1 Запуск внешнего интерфейса
Запуск bin/redis-server напрямую запустится в режиме внешнего интерфейса. Недостаток запуска в режиме внешнего интерфейса заключается в том, что программа redis-server завершает работу при закрытии командного окна ssh. Этот метод не рекомендуется. Как показано ниже:
2.3.2 Запуск в фоновом режиме
Redis.conf измените файл конфигурации после активации режима демонизации на стороне да.
Выполните следующую команду, чтобы запустить Redis:
cd /usr/local/redis
./bin/redis-server ./redis.conf
Redis по умолчанию использует порт 6379.
также можно изменитьredis.conf
файл, измените номер порта:
2.3.3 Запуск нескольких процессов Redis
1) Метод A:
Указание порта при запуске может запустить несколько процессов Redis на сервере.
cd /usr/local/redis/bin
./redis-server ./redis.conf --port 6380
2) Метод 2 (этот метод рекомендуется):
Создайте несколько каталогов Redis с именами по номеру порта, например: создайте два каталога 6379 и 6380 и скопируйте установочные файлы Redis bin и conf в эти два каталога.
Измените redis.conf в каталоге 6379, чтобы установить номер порта 6379.
Измените redis.conf в каталоге 6380, чтобы установить номер порта 6380.
Запустите программу redis-server в каталоге 6379 и 6380:
cd 6379
./redis-server . /redis.conf
cd 6380
./redis-server . /redis.conf
Запрос текущего процесса Redis:
2.4 повторная остановка
Принудительное завершение процесса redis может привести к потере постоянных данных redis. Правильный способ остановить Redis должен состоять в том, чтобы отправить команду завершения работы Redis:
cd /usr/local/redis
./bin/redis-cli shutdown
2.5 Redis-клиент
В каталоге установки redis есть клиент redis, а именно redis-cli (интерфейс командной строки Redis), который представляет собой клиент redis на основе командной строки, который поставляется с redis.
2.5.1 Подключение к серверу Redis
Выполните bin/redis-cli для подключения к серверу Redis:
Из рисунка видно, что соединение redis redis-cli по умолчанию с машиной, машина не запускается, ошибка redis показана на рисунке выше.
Указываем ip и порт для подключения к сервису Redis:
2.5.2 Отправка команд на сервер Redis
После того, как redis-cli подключится к сервису Redis, вы сможете отправлять команды в командной строке.
-
плоский:
Redis предоставляет команду ping, чтобы проверить, нормально ли соединение между клиентом и Redis.Если соединение нормальное, он получит ответ PONG
-
установить/получить:
Используйте set и get, чтобы установить и получить данные от Redis.
-
дел:
Удалить содержимое указанного ключа. Например: имя дель
-
Ключи*:
Просмотреть все значения ключей в текущей библиотеке.
2.6 Redis мультибаза данных
1. Экземпляр Redis
Процесс Redis — это экземпляр Redis. Сервер может иметь несколько экземпляров Redis одновременно. Разные экземпляры Redis предоставляют разные сервисные порты для предоставления услуг внешнему миру, и каждый экземпляр Redis влияет друг на друга. Каждый экземпляр Redis включает в себя собственную базу данных, в которой могут храниться его собственные данные.
2. Тест с несколькими базами данных
Экземпляр Redis может включать в себя несколько баз данных, и клиент может указать, к какой базе данных подключаться к экземпляру Redis, точно так же, как создание нескольких баз данных в mysql, и клиент указывает, к какой базе данных подключаться при подключении.
Экземпляр Redis может предоставить до 16 баз данных с индексами в диапазоне от 0 до 15. По умолчанию клиент подключается к базе данных № 0. Вы также можете выбрать, к какой базе данных подключаться, с помощью выбора, как показано ниже, чтобы подключиться к базе данных № 0. 1 база данных:
Набор данных в предыдущем разделе запрашивается в библиотеке № 1, и результат не может быть запрошен:
Повторно выберите базу данных № 0 и запросите данные:
Если вы выберете несуществующую базу данных, будет сообщено об ошибке:
Примечание: redis не поддерживает изменение имени базы данных, вы можете выбрать базу данных только через select 0, select 1...
3. Обратите внимание на проблему
Сохраняем данные в БД №0, и выполняем команду очистки данных в БД №1, но данные в БД №0 очищаются:
Рекомендация. Разные системы приложений должны использовать разные экземпляры Redis вместо разных баз данных в одном и том же экземпляре Redis.
3. Джедаи
3.1 Знакомство с джедаями
Redis не только использует команды для работы, но и основные языки, такие как Java, C, C#, C++, PHP, Node.js, Go и т. д., теперь имеют клиентскую поддержку.
Некоторые клиенты Java перечислены на официальном сайте, включая Jedis, Redisson, JRDIS, JDBC-Redis и т. Д. Среди них, jedis и Redisson официально рекомендуются. Джедас самая используется на предприятии. Давайте сосредоточимся на изучении Джедаса.
Jedis также размещены на GitHub по адресу:GitHub.com/XE Торт Привет/Просто…
3.2 Подключить автономный redis через jedis
1. упаковка баночки
координаты пом:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.0</version>
</dependency>
Упаковка баночки следующая:
2. Подключение к одному экземпляру
Подключитесь к службе Redis, создав объект jedis с одним экземпляром, как показано ниже:
// 单实例连接redis
@Test
public void testJedisSingle() {
Jedis jedis = new Jedis("192.168.101.3", 6379);
jedis.set("name", "bar");
String name = jedis.get("name");
System.out.println(name);
jedis.close();
}
Решение тайм-аута соединения:
Поскольку брандмауэр Linux включен по умолчанию, порт службы redis 6379 не входит в открытые правила, поэтому вам необходимо открыть этот порт или закрыть брандмауэр.
- Отключите команду брандмауэра:
sevice iptablesstop
- Если вы изменяете правила брандмауэра, вы можете изменить: файл /etc/sysconfig/iptables
3. Используйте подключение к пулу соединений
Соединение Redis не может использоваться совместно через одно экземплярное соединение Redis, вы можете использовать пул соединений для совместного использования соединения Redis для улучшения использования ресурсов, используйте jedisPool для подключения службы Redis, следующий код:
@Test
public void pool() {
JedisPoolConfig config = new JedisPoolConfig();
//最大连接数
config.setMaxTotal(30);
//最大连接空闲数
config.setMaxIdle(2);
JedisPool pool = new JedisPool(config, "192.168.101.3", 6379);
Jedis jedis = null;
try {
jedis = pool.getResource();
jedis.set("name", "lisi");
String name = jedis.get("name");
System.out.println(name);
}catch(Exception ex){
ex.printStackTrace();
}finally{
if(jedis != null){
//关闭连接
jedis.close();
}
}
}
Подробные параметры конфигурации пула соединений см. в содержимом конфигурации applicationContext.xml при интеграции jedis и spring в следующем разделе.
4, джедай и весенняя интеграция
Настройте файл конфигурации spring applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
<!-- 连接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最大连接数 -->
<property name="maxTotal" value="30" />
<!-- 最大空闲连接数 -->
<property name="maxIdle" value="10" />
<!-- 每次释放连接的最大数目 -->
<property name="numTestsPerEvictionRun" value="1024" />
<!-- 释放连接的扫描间隔(毫秒) -->
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<!-- 连接最小空闲时间 -->
<property name="minEvictableIdleTimeMillis" value="1800000" />
<!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
<property name="softMinEvictableIdleTimeMillis" value="10000" />
<!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
<property name="maxWaitMillis" value="1500" />
<!-- 在获取连接的时候检查有效性, 默认false -->
<property name="testOnBorrow" value="true" />
<!-- 在空闲时检查有效性, 默认false -->
<property name="testWhileIdle" value="true" />
<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
<property name="blockWhenExhausted" value="false" />
</bean>
<!-- redis单机 通过连接池 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="close">
<constructor-arg name="poolConfig" ref="jedisPoolConfig"/>
<constructor-arg name="host" value="192.168.25.145"/>
<constructor-arg name="port" value="6379"/>
</bean>
</beans>
Тестовый код:
private ApplicationContext applicationContext;
@Before
public void init() {
applicationContext = new ClassPathXmlApplicationContext(
"classpath:applicationContext.xml");
}
@Test
public void testJedisPool() {
JedisPool pool = (JedisPool) applicationContext.getBean("jedisPool");
try {
Jedis jedis = pool.getResource();
jedis.set("name", "lisi");
String name = jedis.get("name");
System.out.println(name);
}catch(Exception ex){
ex.printStackTrace();
}finally{
if(jedis != null){
//关闭连接
jedis.close();
}
}
}
В-четвертых, тип данных
4.1 Строчная строка
1. Введение в строку Redis
Redis не использует строковое представление языка C, но настраивает структуру данных, называемую SDS (простая динамическая строка), которая представляет собой простую динамическую строку. Откройте загруженный исходный пакет Redis и найдите файл sds.h в папке src, чтобы просмотреть исходный код sds:
struct sdshdr {
//字符串长度
unsigned int len;
//buf数组中未使用的字节数量
unsigned int free;
//用于保存字符串
char buf[];
};
Хранение строк в языке C заключается в использовании массивов символов. Когда встречается символ '\0', строка считается оконченной. Строки Redis могут хранить данные любого типа, поскольку данные любого типа могут быть представлены в виде двоичных файлов. char buf[] предназначен для хранения двоичных данных.
Строки Redis безопасны для двоичного кода, что такое двоичная безопасность? Простое понимание того, какие данные сохраняются, а какие извлекаются. SDS в Redis не завершает строку аутентификации, когда встречает символ '\ 0', как это делает язык C. Он не обрабатывает сохраненные двоичные данные, какие данные сохраняются и какие данные извлекаются.
2. Команда
1) Назначение:SET key value
127.0.0.1:6379> set test 123
OK
2) стоимость
Назначение и поиск:GET key
127.0.0.1:6379> get test
"123“
Возвращает пустой результат, если ключ не существует.
При получении значения одновременно назначьте ключ:GETSET key value
3) Удалить:Del key
127.0.0.1:6379> del test
(integer) 1
4) Значение увеличивается или уменьшается
-
Увеличение числа:INCR key
Когда сохраненная строка является целым числом, Redis предоставляет удобную команду INCR, роль которой заключается в увеличении текущего значения ключа и возврате увеличенного значения.
127.0.0.1:6379> incr num (integer) 1 127.0.0.1:6379> incr num (integer) 2 127.0.0.1:6379> incr num (integer) 3
-
Увеличьте указанное целое число:INCRBY key increment
127.0.0.1:6379> incrby num 2 (integer) 5 127.0.0.1:6379> incrby num 2 (integer) 7 127.0.0.1:6379> incrby num 2 (integer) 9
-
Значение уменьшения:DECR key
5) Другие команды
-
Уменьшить указанное целое число:DECRBY key decrement
127.0.0.1:6379> decr num (integer) 6 127.0.0.1:6379> decr num (integer) 5 127.0.0.1:6379> decrby num 3 (integer) 2 127.0.0.1:6379> decrby num 3 (integer) -1
-
Добавляем значения в хвост:APPEND key value
Роль APPEND заключается в добавлении значения в конец значения ключа. Если ключ не существует, установите значение ключа в значение, которое эквивалентно значению ключа SET. Возвращаемое значение — это общая длина добавленной строки.
127.0.0.1:6379> set str hello OK 127.0.0.1:6379> append str " world!" (integer) 12 127.0.0.1:6379> get str "hello world!"
-
Получить длину строки:STRLEN key
Команда STRLEN возвращает длину значения ключа или 0, если ключ не существует.
127.0.0.1:6379> strlen str (integer) 0 127.0.0.1:6379> set str hello OK 127.0.0.1:6379> strlen str (integer) 5
-
Установить/получить несколько ключей-значений одновременно:Значение ключа MSET [значение ключа…],Клавиша MGET [клавиша …]
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 OK 127.0.0.1:6379> get k1 "v1" 127.0.0.1:6379> mget k1 k3 1) "v1" 2) "v3"
3. Применение
Самоувеличивающийся первичный ключ: номер позиции и номер заказа генерируются с использованием возрастающей числовой функции строки.
Определите ключ номера элемента: items:id
192.168.101.3:7003> INCR items:id
(integer) 2
192.168.101.3:7003> INCR items:id
(integer) 3
4.2 Хэш-хэш
1. Проблема использования строки
Предполагая, что объект User хранится в Redis в виде сериализации json, объект User имеет такие атрибуты, как идентификатор, имя пользователя, пароль, возраст, имя и т. д. Процесс хранения выглядит следующим образом: сохранение и обновление:
Пользовательский объект --> json (строка) --> Redis
Если обновить только свойство возраста в бизнесе, другие свойства не обновляются, что мне делать? Если вы все еще используете верхний метод передачи, пустая трата ресурсов при работе с, скажем, нижележащим хешем может стать хорошим решением этой проблемы.
2, Redis Hash Введение
hash называется типом хэша и обеспечивает сопоставление полей и значений полей. Значение поля может быть только строкового типа, а другие типы, такие как хеш-тип и тип коллекции, не поддерживаются. следующее:
Мысль: каковы преимущества хранилища хэшей redish по сравнению с реляционными базами данных?
3. Команда
1) Назначение:
-
HSET key field valueЗа один раз можно задать только одно значение поля
127.0.0.1:6379> hset user username zhangsan (integer) 1
-
HMSET key field value [field value ...]Несколько значений поля могут быть установлены одновременно
127.0.0.1:6379> hmset user age 20 username lisi OK
2) Возьмем значение:
-
HGET key fieldОдновременно может быть получено только одно значение поля
127.0.0.1:6379> hget user username "zhangsan“
-
HMGET key field [field ...]Получить сразу несколько значений поля
127.0.0.1:6379> hmget user age username 1) "20" 2) "lisi"
-
HGETALL key
127.0.0.1:6379> hgetall user 1) "age" 2) "20" 3) "username" 4) "lisi"
Команда HSET не различает операции вставки и обновления.Команда HSET возвращает 1 при выполнении операции вставки и 0 при выполнении операции обновления.
3) Удалить поля:HDEL key field [field...]Одно или несколько полей могут быть удалены, а возвращаемое значение — количество удаленных полей.
127.0.0.1:6379> hdel user age
(integer) 1
127.0.0.1:6379> hdel user age name
(integer) 0
127.0.0.1:6379> hdel user age username
(integer) 1
4) Номера приращений:HINCRBY key field increment
127.0.0.1:6379> hincrby user age 2 将用户的年龄加2
(integer) 22
127.0.0.1:6379> hget user age 获取用户的年龄
"22“
5) Другие команды
-
Проверяем, существует ли поле:
-
HEXISTS key field
127.0.0.1:6379> hexists user age 查看user中是否有age字段 (integer) 1 127.0.0.1:6379> hexists user name 查看user中是否有name字段 (integer) 0
-
HSETNX key field value
Назначается, когда поле не существует, аналогично HSET, за исключением того, что если поле уже существует, команда ничего не делает.
127.0.0.1:6379> hsetnx user age 30 如果user中没有age字段则设置age值为30,否则不做任何操作 (integer) 0
-
-
Получить только имя поля или значение поля
-
HKEYS key,HVALS key
127.0.0.1:6379> hmset user age 20 name lisi OK 127.0.0.1:6379> hkeys user 1) "age" 2) "name" 127.0.0.1:6379> hvals user 1) "20" 2) "lisi"
-
-
Получить количество полей:HLEN key
127.0.0.1:6379> hlen user (integer) 2
4. Применение
Информация о продукте: идентификатор продукта, название продукта, описание продукта, инвентарь продукта, похвала продукта.
Определите ключ информации о продукте:
Ключ информации элемента 1001 в Redis: элементы: 1001
Информация о продукте магазина:
192.168.101.3:7003> HMSET items:1001 id 3 name apple price 999.9
OK
Получить информацию о продукте:
192.168.101.3:7003> HGET items:1001 id
"3"
192.168.101.3:7003> HGETALL items:1001
1) "id"
2) "3"
3) "name"
4) "apple"
5) "price"
6) "999.9"
4.3 Список Список
1. Разница между ArrayList и LinkedList
ArrayList использует метод массива для хранения данных, поэтому запрос данных в соответствии с индексом выполняется быстро, а операцию смещения необходимо разрабатывать при добавлении или удалении элементов, поэтому она выполняется относительно медленно.
LinkedList использует двухстороннее связывание для хранения данных, и каждый элемент записывает указатели предыдущего и предыдущего элементов, поэтому при вставке или удалении данных просто меняйте указатели переднего и заднего элементов, что очень быстро, а затем вам нужно чтобы начать индекс с самого начала при запросе элементов через индексы. Так что это медленнее, но быстрее, если вы запрашиваете первые несколько элементов или последние несколько элементов.
2. Введение в список Redis
Тип списка (список) может хранить упорядоченный список строк.Обычными операциями являются добавление элементов в оба конца списка или получение определенного сегмента списка.
Тип списка внутренне реализован с использованием двусвязного списка (двойной связанный список), поэтому временная сложность добавления элементов в оба конца списка равна 0 (1), а скорость приближения элементов к обоим концам выше. Это означает, что даже для списка с десятками миллионов элементов получить 10 записей в начале или в конце чрезвычайно быстро.
3. Команда
1) Добавить элементы в оба конца списка
-
LPUSH key value [value ...],RPUSH key value [value ...]
向列表左边增加元素 127.0.0.1:6379> lpush list:1 1 2 3 (integer) 3 向列表右边增加元素 127.0.0.1:6379> rpush list:1 4 5 6 (integer) 3
2) Посмотреть список:LRANGE key start stop
Команда LRANGE — одна из наиболее часто используемых команд для типов списков.Чтобы получить сегмент в списке, она возвращает все элементы между началом и концом (включая элементы на обоих концах), а индекс начинается с 0. Индекс может быть отрицательным, например: "-1" представляет последний элемент.
127.0.0.1:6379> lrange list:1 0 2
1) "2"
2) "1"
3) "4"
3) Выталкивание элементов с обоих концов списка:LPOP key,RPOP key
Команда LPOP выскакивает элемент слева от списка. Это сделано на двух шагах. Первый шаг - удалить элемент слева от списка из списка, а второй шаг - вернуть значение удаленного элемент.
127.0.0.1:6379> lpop list:1
"3“
127.0.0.1:6379> rpop list:1
"6“
4) Получить количество элементов в списке:LLEN key
127.0.0.1:6379> llen list:1
(integer) 2
5) Другие команды
-
Удалить указанное значение из списка:LREM key count value
Команда LREM удаляет первые элементы count со значением в списке и возвращает фактическое количество удаленных элементов. В зависимости от значения счетчика команда выполняется по-разному:
- Когда count>0, LREM удаляет слева списка.
- Когда count
- Когда count=0, LREM удаляет все элементы, значение которых равно value.
-
Получить/установить значение элемента по указанному индексу:LINDEX key index,LSET key index value
127.0.0.1:6379> lindex l:list 2 "1" 127.0.0.1:6379> lset l:list 2 2 OK 127.0.0.1:6379> lrange l:list 0 -1 1) "6" 2) "5" 3) "2" 4) "2"
-
Сохраняйте только указанный фрагмент списка, а указанный диапазон соответствует LRANGE:LTRIM key start stop
127.0.0.1:6379> lrange l:list 0 -1 1) "6" 2) "5" 3) "0" 4) "2" 127.0.0.1:6379> ltrim l:list 0 2 OK 127.0.0.1:6379> lrange l:list 0 -1 1) "6" 2) "5" 3) "0"
-
Вставьте элемент в список:LINSERT key BEFORE|AFTER pivot value
Команда сначала просматривает значение элемента поворота слева направо в списке, и в соответствии со вторым параметром определяется ДО ПОСЛЕ или вставляется до или после значения элемента.
127.0.0.1:6379> lrange list 0 -1 1) "3" 2) "2" 3) "1" 127.0.0.1:6379> linsert list after 3 4 (integer) 4 127.0.0.1:6379> lrange list 0 -1 1) "3" 2) "4" 3) "2" 4) "1"
-
Перенос элементов из одного списка в другой:RPOPLPUSH source destination
127.0.0.1:6379> rpoplpush list newlist "1" 127.0.0.1:6379> lrange newlist 0 -1 1) "1" 127.0.0.1:6379> lrange list 0 -1 1) "3" 2) "4" 3) "2"
4. Применение
Список обзоров товаров. Идеи:
Создайте список обзоров продуктов в Redis. Пользователи публикуют обзоры продуктов, преобразуют информацию отзывов в json и сохраняют их в списке.
Пользователь запрашивает список комментариев на странице, берет данные json из Redis и отображает их на странице.
Определите ключ списка обзора продукта:
Ключ обзора продукта с номером товара 1001: items: comment:1001
192.168.101.3:7001> LPUSH items:comment:1001 '{"id":1,"name":"商品不错,很好!!","date":1430295077289}'
4.4 Набор для сбора
1. Введение в набор Redis
Каждый элемент в коллекции отличается и не имеет порядка. Сравнение типа коллекции и типа списка:
Общими операциями типа коллекции являются добавление или удаление элементов в коллекцию, определение того, существует ли элемент и т. д. Поскольку редис типа коллекции реализован с использованием хеш-таблицы с пустым значением, временная сложность всех этих операций равно 0 (1 ). Redis также предоставляет операции для пересечения, объединения и различия между несколькими множествами.
2. Команда
1) Добавить/удалить элементы:SADD key member [member ...],SREM key member [member ...]
127.0.0.1:6379> sadd set a b c
(integer) 3
127.0.0.1:6379> sadd set a
(integer) 0
127.0.0.1:6379> srem set c d
(integer) 1
2) получить множество всех элементов:SMEMBERS key
127.0.0.1:6379> smembers set
1) "b"
2) "a”
Чтобы определить, есть ли элемент в наборе, сколько бы элементов ни было в наборе, результат можно вернуть очень быстро:SISMEMBER key member
127.0.0.1:6379> sismember set a
(integer) 1
127.0.0.1:6379> sismember set h
(integer) 0
3) Другие команды
-
Установить разностную операцию A-B:SDIFF key [key ...]
Множество элементов, принадлежащих А и не принадлежащих В.
127.0.0.1:6379> sadd setA 1 2 3 (integer) 3 127.0.0.1:6379> sadd setB 2 3 4 (integer) 3 127.0.0.1:6379> sdiff setA setB 1) "1" 127.0.0.1:6379> sdiff setB setA 1) "4"
-
Операция пересечения множеств A ∩ B:SINTER key [key ...]
Множество элементов, которые принадлежат A и принадлежат B.
127.0.0.1:6379> sinter setA setB 1) "2" 2) "3"
-
Их объединение A ∪ B множества:SUNION key [key ...]
Набор элементов, которые принадлежат A или принадлежат B.
127.0.0.1:6379> sunion setA setB 1) "1" 2) "2" 3) "3" 4) "4"
-
разное
-
Получить количество элементов в коллекции:SCARD key
127.0.0.1:6379> smembers setA 1) "1" 2) "2" 3) "3" 127.0.0.1:6379> scard setA
-
Извлеките элемент из коллекции:SPOP key
SPOP key 127.0.0.1:6379> spop setA "1“
Примечание. Поскольку коллекции неупорядочены, все команды SPOP извлекают элемент из коллекции случайным образом.
-
4.5 отсортированный набор: отсортированный набор
1. Введение в отсортированный набор redis
На основе типа набора упорядоченный тип набора связан с оценкой для каждого элемента в наборе, что позволяет нам не только завершить вставку, удаление и оценку того, существует ли элемент в наборе, но и получить первые N с наивысшей или наименьшей оценкой Операции, связанные с оценкой, такие как элементы, получение элементов в пределах указанного диапазона оценок и т. д.
Отсортированные наборы и типы списков в некотором отношении похожи.
- Оба в порядке.
- Оба могут получить ряд элементов.
Однако между ними есть большая разница:
- Тип списка реализован через связанный список, и очень быстро получить данные с обоих концов, а при увеличении количества элементов скорость доступа к промежуточным данным станет медленнее.
- Упорядоченный тип сбора реализован с использованием хеш-таблицы, даже если чтение всех данных в средней части выполняется быстро.
- Вы не можете просто изменить положение элемента в списке, но упорядоченный набор может (путем изменения оценки)
- Отсортированные наборы требуют больше памяти, чем списки.
2. Команда
1) Добавить элементы
Добавляет элемент и его оценку в отсортированный набор, заменяя старую оценку новой оценкой, если элемент уже существует. Возвращаемое значениеновыйДобавлено на количество элементов в наборе, не содержит ранее существовавших элементов.
ZADD key score member [score member ...]
127.0.0.1:6379> zadd scoreboard 80 zhangsan 89 lisi 94 wangwu
(integer) 3
127.0.0.1:6379> zadd scoreboard 97 lisi
(integer) 0
Получить оценку элемента:ZSCORE key member
127.0.0.1:6379> zscore scoreboard lisi
"97"
2) Удалить элементы:ZREM key member [member ...]
Удаляет один или несколько членов отсортированного набора ключей, несуществующие элементы игнорируются. Возвращает ошибку, если ключ существует, но не относится к типу упорядоченного набора.
127.0.0.1:6379> zrem scoreboard lisi
(integer) 1
3) Получить список элементов, ранжированных в определенном диапазоне
Получить список элементов, ранжированных в диапазоне:
ZRANGE key start stop [WITHSCORES]Возвращает все элементы с индексами от начала, чтобы остановиться в порядке возрастания результатов элементов (включая элементы на обоих концах)
127.0.0.1:6379> zrange scoreboard 0 2
1) "zhangsan"
2) "wangwu"
3) "lisi“
ZREVRANGE key start stop [WITHSCORES]Он возвращает индекс элемента в соответствии с порядком убывания оценки от начала до всех элементов между остановкой (содержащих концы элементов)
127.0.0.1:6379> zrevrange scoreboard 0 2
1) " lisi "
2) "wangwu"
3) " zhangsan
Если вам нужно получить оценку элемента, вы можете добавить ее в конце командыWITHSCORES
параметр:
127.0.0.1:6379> zrange scoreboard 0 1 WITHSCORES
1) "zhangsan"
2) "80"
3) "wangwu"
4) "94"
3. Другие команды
-
Получить элементы указанного диапазона оценок:ZRANGEBYSCORE key min max [WITHSCORES][LIMIT offset count]
127.0.0.1:6379> ZRANGEBYSCORE scoreboard 90 97 WITHSCORES 1) "wangwu" 2) "94" 3) "lisi" 4) "97" 127.0.0.1:6379> ZRANGEBYSCORE scoreboard 70 100 limit 1 2 1) "wangwu" 2) "lisi"
-
Увеличьте оценку элемента, возвращаемое значение — это измененная оценка:ZINCRBY key increment member
给lisi加4分 127.0.0.1:6379> ZINCRBY scoreboard 4 lisi "101“
-
Получить количество элементов в коллекции:ZCARD key
127.0.0.1:6379> ZCARD scoreboard (integer) 3
-
Получить количество элементов в указанном диапазоне оценок:ZCOUNT key min max
127.0.0.1:6379> ZCOUNT scoreboard 80 90 (integer) 1
-
Удалить элементы по диапазону рангов:ZREMRANGEBYRANK key start stop
127.0.0.1:6379> ZREMRANGEBYRANK scoreboard 0 1 (integer) 2 127.0.0.1:6379> ZRANGE scoreboard 0 -1 1) "lisi"
-
Удалить элементы по диапазону баллов:ZREMRANGEBYSCORE key min max
127.0.0.1:6379> zadd scoreboard 84 zhangsan (integer) 1 127.0.0.1:6379> ZREMRANGEBYSCORE scoreboard 80 100 (integer) 1
-
Получить ранг элемента:ZRANK key member,ZREVRANK key member
从小到大 127.0.0.1:6379> ZRANK scoreboard lisi (integer) 0 从大到小 127.0.0.1:6379> ZREVRANK scoreboard zhangsan (integer) 1
4. Применение
Рейтинг продаж товаров: ранжируйте и отображайте продукты в соответствии с объемом продаж продуктов, определяйте отсортированную коллекцию наборов, а объем продаж продуктов является оценкой элемента.
Определить ключ рейтинга продаж продуктов: items:sellsort
Написать продажи продукта:
商品编号1001的销量是9,商品编号1002的销量是10
192.168.101.3:7007> ZADD items:sellsort 9 1001 10 1002
Прибавьте 1 к продажам артикула 1001:
192.168.101.3:7001> ZINCRBY items:sellsort 1 1001
10 самых продаваемых продуктов:
192.168.101.3:7001> ZRANGE items:sellsort 0 9 withscores
Пять, ключевая команда
5.1 Установить время жизни ключа
В реальных условиях Redis больше используется как кеш, но кешированные данные обычно должны устанавливать время жизни, то есть данные уничтожаются по истечении срока действия.
EXPIRE key seconds 设置key的生存时间(单位:秒)key在多少秒后会自动删除
TTL key 查看key生于的生存时间
PERSIST key 清除生存时间
PEXPIRE key milliseconds 生存时间设置单位为:毫秒
пример:
192.168.101.3:7002> set test 1 设置test的值为1
OK
192.168.101.3:7002> get test 获取test的值
"1"
192.168.101.3:7002> EXPIRE test 5 设置test的生存时间为5秒
(integer) 1
192.168.101.3:7002> TTL test 查看test的生于生成时间还有1秒删除
(integer) 1
192.168.101.3:7002> TTL test
(integer) -2
192.168.101.3:7002> get test 获取test的值,已经删除
(nil)
5.2 Другие команды
-
keys: возвращает все ключи, удовлетворяющие заданному шаблону
redis 127.0.0.1:6379> keys mylist* 1) "mylist" 2) "mylist5" 3) "mylist6" 4) "mylist7" 5) "mylist8"
-
существует: подтвердите, существует ли ключ
redis 127.0.0.1:6379> exists HongWan (integer) 0 redis 127.0.0.1:6379> exists age (integer) 1 redis 127.0.0.1:6379>
В результате ключ HongWan не существует в базе данных, но существует возрастной ключ.
-
del: удалить ключ
redis 127.0.0.1:6379> del age (integer) 1 redis 127.0.0.1:6379> exists age (integer) 0 redis 127.0.0.1:6379>
В результате ключ HongWan не существует в базе данных, но существует возрастной ключ.
-
Переименовать: переименовать ключ
redis 127.0.0.1:6379[1]> keys * 1) "age" redis 127.0.0.1:6379[1]> rename age age_new OK redis 127.0.0.1:6379[1]> keys * 1) "age_new" redis 127.0.0.1:6379[1]>
Age Success был переименован в age_new up.
-
тип: тип возвращаемого значения
redis 127.0.0.1:6379> type addr string redis 127.0.0.1:6379> type myzset2 zset redis 127.0.0.1:6379> type mylist list redis 127.0.0.1:6379>
Этот метод может быть очень простым для определения типа значения.
6. Команды сервера
-
ping: проверьте, живо ли соединение
redis 127.0.0.1:6379> ping PONG //执行下面命令之前,我们停止redis 服务器 redis 127.0.0.1:6379> ping Could not connect to Redis at 127.0.0.1:6379: Connection refused //执行下面命令之前,我们启动redis 服务器 not connected> ping PONG redis 127.0.0.1:6379>
При первом пинге связь нормальная.
Перед вторым пингом мы остановим сервер redis, тогда пинг не удался.
Перед третьим пингом мы запустили сервер Redis, после чего пинг прошел успешно.
-
эхо: напечатать что-нибудь в командной строке
redis 127.0.0.1:6379> echo HongWan "HongWan" redis 127.0.0.1:6379>
-
выберите: выберите базу данных. Номер базы данных Redis находится в диапазоне от 0 до 15, и мы можем выбрать любую базу данных для доступа к данным.
redis 127.0.0.1:6379> select 1 OK redis 127.0.0.1:6379[1]> select 16 (error) ERR invalid DB index redis 127.0.0.1:6379[16]>
При выборе 16 выдается сообщение об ошибке, указывающее на отсутствие такой базы данных с номером 16.
-
выйти: выйти из соединения
redis 127.0.0.1:6379> quit
-
dbsize: возвращает количество ключей в текущей базе данных
redis 127.0.0.1:6379> dbsize (integer) 18 redis 127.0.0.1:6379>
Результаты показывают, что эта библиотека имеет 18 ключ
-
info: Получить информацию о сервере и статистику
redis 127.0.0.1:6379> info redis_version:2.2.12 redis_git_sha1:00000000 redis_git_dirty:0 arch_bits:32 multiplexing_api:epoll process_id:28480 uptime_in_seconds:2515 uptime_in_days:0
-
flushdb: удалить все ключи в текущей выбранной базе данных,
redis 127.0.0.1:6379> dbsize (integer) 18 redis 127.0.0.1:6379> flushdb OK redis 127.0.0.1:6379> dbsize (integer) 0 redis 127.0.0.1:6379>
В этом примере мы очистили все ключи в базе данных 0.
-
flushall: удалить все ключи во всех базах данных
redis 127.0.0.1:6379[1]> dbsize (integer) 1 redis 127.0.0.1:6379[1]> select 0 OK redis 127.0.0.1:6379> flushall OK redis 127.0.0.1:6379> select 1 OK redis 127.0.0.1:6379[1]> dbsize (integer) 0 redis 127.0.0.1:6379[1]>
В этом примере мы сначала проверили наличие ключа в БД №1, а затем я переключился на БД №0 для выполнения команды flushall.В результате ключ в БД №1 тоже очистился , говоря, что команда работала нормально.
7. Настойчивость
Высокая производительность Redis обусловлена тем, что он хранит все данные в памяти, чтобы Redis все же следил за тем, чтобы данные не терялись после перезагрузки, нужно синхронизировать данные из памяти на жесткий диск, этот процесс персистентный. Redis поддерживает сохранение двумя способами: один — режим RDB, другой — режим AOF. Один из них можно использовать отдельно или в сочетании с обоими.
7.1 Постоянство RDB
Сохранение в режиме RDB достигается за счет моментальных снимков.При выполнении определенных условий Redis автоматически делает моментальные снимки данных в памяти и сохраняет их на жестком диске.
RDB — это метод сохраняемости по умолчанию, используемый Redis.redis.conf
Конфигурационный файл по умолчанию имеет следующую конфигурацию:
save 900 1
save 300 10
save 60 10000
Строка в начале сохранения является постоянной конфигурацией. Вы можете настроить несколько условий (по одному условию в строке), и каждое условие находится в отношениях "или". "Сохранить 900 1" означает по крайней мере 1 в течение 15 минут (900 секунд). ) Снимки создаются, если изменяется каждый ключ, а «сохранить 300 10» означает, что в течение 5 минут (300 секунд) для создания снимка было изменено не менее 10 ключей.
существуетredis.conf
середина:
- config dir указывает расположение файла моментального снимка rdb
- настроить dbfilenam, чтобы указать имя файла моментального снимка rdb
После запуска Redis прочитает файл моментального снимка RDB и загрузит данные с жесткого диска в память. Это время зависит от размера и структуры данных и производительности сервера. Обычно для загрузки файла моментального снимка объемом 1 ГБ с 10 миллионами строковых ключей в память требуется от 20 до 30 секунд.
итог проблемы:
Устойчивость достигается через RDB. Как только Redis выходит ненормально, все данные изменялись после того, как последний снимок будет потерян. Это требует, чтобы разработчики контролируют возможные потери данных до приемлемого диапазона путем объединения и настройки автоматического моментальных условий в соответствии с конкретными сценариями приложений. Если данные настолько важны, что не может позволить себе какие-либо потери, рассмотрите возможность использования AOF для настойчивости.
7.2 Постоянство АОФ
По умолчанию Redis не включает сохранение в режиме AOF (добавлять только файл), который можно включить с помощью параметра appendonly:appendonly yes
.
После включения сохраняемости AOF каждый раз, когда выполняется команда, которая изменяет данные в Redis, Redis будет записывать команду в файл AOF на жестком диске. Место хранения файла AOF совпадает с местоположением файла RDB, которое задается параметром dir Имя файла по умолчанию — appendonly.aof, которое можно изменить с помощью параметра appendfilename: appendfilenameappendonly.aof
Восемь, репликация master-slave
8.1 Что такое репликация master-slave
Постоянство гарантирует, что данные будут потеряны даже в случае перезапуска службы Redis, поскольку постоянные данные на жестком диске будут восстановлены в памяти после перезапуска службы Redis.Однако, когда жесткий диск сервера Redis поврежден, данные могут Этой единственной точки отказа можно избежать с помощью механизма репликации, как показано ниже:
инструкция:
-
Данные в главном Redis имеют две реплики, а именно подчиненный redis 1 и подчиненный Redis 2. Даже если один сервер Redis выходит из строя, две другие службы Redis могут продолжать предоставлять услуги.
-
Данные в главном Redis и данные в подчиненном Redis синхронизируются в режиме реального времени.Когда главный Redis записывает данные, они будут скопированы в две подчиненные службы Redis через механизм репликации master-slave.
-
Существует только один главный Redis, а подчиненных Redis может быть несколько.
-
Репликация master-slave не блокирует мастер, и мастер может продолжать обрабатывать запросы клиентов при синхронизации данных.
-
Redis может быть как ведущим, так и подчиненным, как показано ниже:
8.2 Конфигурация ведущий-ведомый
1, основная конфигурация Redis
Никакой специальной настройки не требуется.
2. Настроить из Redis
Измените файл redis.conf на подчиненном сервере redis, чтобы добавить порт master redis slaveof master redisip.
Приведенная выше конфигурация показывает, что текущий главный сервер redis, соответствующий подчиненному серверу redis, — 192.168.101.3, а порт — 6379.
8.3 Процесс репликации ведущий-ведомый
1. Полный процесс репликации
До версии redis2.8 процесс репликации master-slave выглядел следующим образом:
Описание процесса копирования:
-
Когда служба подчиненного устройства запускается, подчиненное устройство устанавливает соединение с ведущим устройством и отправляет команду синхронизации.
-
Мастер запускает фоновый процесс для сохранения моментального снимка базы данных в файл RDB.
Примечание. В настоящее время, если в процессе создания файла RDB выполняется операция записи данных, файл RDB будет несовместим с текущими главными данными Redis, поэтому главный главный процесс начнет собирать команды записи и кэшировать их.
-
Мастер отправляет файл RDB ведомому
-
подчиненный сохраняет файл на диск, затем загружает в память для восстановления
-
Мастер пересылает кешированные команды ведомому
Примечание. Последующие команды записи, полученные ведущим устройством, будут отправлены подчиненному устройству через установленное соединение.
Когда соединение между ведущим и ведомым прерывается, ведомое устройство может автоматически восстановить соединение. Если мастер получает команды синхронного подключения от нескольких подчиненных одновременно, только один процесс будет запущен для записи зеркала базы данных, а затем отправлен всем подчиненным.
Полное воспроизведение проблемы:
До redis2.8 каждая синхронизация из redis копирует все данные из главного redis.Если подчиненный redis создается заново и копирует все данные из главного redis, проблем не возникает.Однако, если подчиненный redis перестает работать, При перезапуске только небольшая часть данных может быть не синхронизирована с основным редисом.В это время запуск редиса все равно скопирует все данные с основного редиса.Такая производительность определенно не такая высокая, как копирование только небольшая часть рассинхронизированных данных.
2. Частичная копия
Некоторые инструкции копирования:
После того, как ведомое устройство подключится к хосту, оно будет активно инициировать команду PSYNC, а ведомое устройство предоставит runid ведущего (идентификатор машины, случайно сгенерированная строка) и смещение (смещение данных, если смещение ведущий-ведомый несовместимо, данные не синхронизирован), хост проверяет правильность runid и смещения, runid эквивалентен коду аутентификации хоста, который используется для проверки хоста, подключенного к ведомому в последний раз.Если проверка runid не удалась, он выполнит полную синхронизацию .Если проверка пройдена, значит синхронизация прошла, и часть данных синхронизируется по смещению.