предисловие
Только лысина может стать сильнее
Продолжайте изучать Redis сегодня, последнийИзучите Redis с Zero Single Row [бронза]Редис былОбщие структуры данныхВсе кончено. Если вы еще не смотрели, то можете сначала посмотреть, а потом вернуться~
Основное содержание этой статьи:
- База данных Redis Server
- Обработка Redis ключей с истекшим сроком действия
- Стратегия сохранения Redis (RDB и AOF)
эта статьяСтремитесь объяснить каждый пункт знаний просто, я надеюсь, что каждый сможет что-то получить после прочтения
Во-первых, база данных на сервере Redis
Мы должны были использовать MySQL, MySQL мы можем создать в нем несколько библиотек:
Точно так же существует концепция базы данных на сервере Redis. Если вы не укажете конкретный номер, по умолчанию будет16база данных.
Также мы можем найти из приведенной выше команды: когда мы переключаемся на базу данных № 15, сохраняем данные в базе данных № 15, а затем переключаемся на базу данных № 0, мы не можем ее получить!
- Это показывает, что данные между базой данных и базой данныхизолироватьиз.
1.1 Принцип базы данных Redis
Сервер Redis представлен структурой redisServer, где redisDb — это массив, используемый для хранения всех баз данных, а dbnum — количество баз данных (это можно настроить, по умолчанию — 16).
struct redisServer{
//redisDb数组,表示服务器中所有的数据库
redisDb *db;
//服务器中数据库的数量
int dbnum;
};
Мы знаем, что Redis — это структура C/S, а клиент Redis представлен структурой redisClient:
typedef struct redisClient{
//客户端当前所选数据库
redisDb *db;
}redisClient;
Пример диаграммы, когда клиент Redis подключается к серверу Redis:
В Redis каждая база данных представлена структурой redisDb:
typedef struct redisDb {
int id; // 数据库ID标识
dict *dict; // 键空间,存放着所有的键值对
dict *expires; // 过期哈希表,保存着键的过期时间
dict *watched_keys; // 被watch命令监控的key和相应client
long long avg_ttl; // 数据库内所有键的平均TTL(生存时间)
} redisDb;
Из кода мы можем обнаружить, что самым важным должно бытьdict *dict
, который используется для хранения всех пар ключ-значение. заdict
Структура данных (хеш-таблица) подробно описана в предыдущей статье. Обычно мы будем хранить все пары ключ-значениеdict
называетсяключевое пространство.
Диаграмма пространства ключей:
База данных Redis реализована с использованием словаря (хеш-таблицы) в качестве базовой реализации.Добавление, удаление, модификация и запрос базы данных построены на работе со словарем (хеш-таблицей)..
Например:
redis > GET message
"hello world"
1.2 Срок действия ключа
Redis основан на памяти, память относительно дорогая, и ее емкость определенно не сравнима с емкостью жестких дисков. Что касается нашей текущей обычной машины, она может иметь 8 ГБ памяти, но жесткий диск случайно имеет размер 1 ТБ.
потому что наша памятьограниченноеиз. так что мыОн убьет данные, которые обычно не используются, и сохранит данные, которые обычно используются.. Это требует, чтобы мы установили срок действия (живого) ключа.
- установить ключВыживатьвремя может пройти
EXPIRE
илиPEXPIRE
Заказ. - установить ключИстекшийвремя может пройти
EXPIREAT
илиPEXPIREAT
Заказ.
фактическиEXPIRE
,PEXPIRE
,EXPIREAT
Все три командыPEXPIREAT
команда для достижения.
Мы также нашли в структуре redisDbdict *expires;
Атрибут, в котором хранится время истечения срока действия всех ключей.
Пример в принципе понятен:
redis > PEXPIREAT message 1391234400000
(integer) 1
Срок действия ключа сообщения установлен на 1391234400000.
Поскольку есть команда для установки времени истечения (выживания), должна быть и команда для удаления времени истечения и просмотра оставшегося времени жизни:
- PERSIST (удалить время истечения)
- TTL (время жизни) возвращает оставшееся время жизни в секундах.
- PTTL возвращает оставшееся время жизни ключа в миллисекундах.
1.2.1 Политика истечения срока действия
Выше мы смогли понять: ключ истечения хранится в хеш-таблице. Будут ли эти ключи с истекшим сроком действия удаляться сразу после истечения срока их действия? ?
Чтобы ответить на приведенные выше вопросы, нам необходимо понять знание стратегий удаления, которые можно разделить на три типа.
- Удаление по времени (удобно для памяти, не для процессора)
- На данный момент во времени все ключевые ключи удаляются.
- Ленивое удаление (чрезвычайно дружественное к процессору, крайне недружественное к памяти)
- Каждый раз, когда ключ извлекается из пространства ключей, оценивается, истек ли срок действия ключа, и если срок его действия истек, он удаляется.
- Периодически удалять (скомпрометировать)
- любой другойпериод времени для удаления ключей с истекшим сроком действия,ограничениеКак долго и как часто выполняются удаления.
Redis используетЛенивое удаление + периодическое удалениеЕсть две стратегии, поэтому, если истек срок действия ключа в Redis, его нельзя удалить сразу!
1.2.2 Механизм удаления памяти
Если при обычном удалении пропущено много просроченных ключей, а проверить нет времени (без ленивого удаления), то в памяти скапливается большое количество просроченных ключей, из-за чего блок памяти redis исчерпывается, что делать?
Мы можем установить максимальное использование памяти, когда использование памяти превысит, оно будет реализованоПолитика удаления данных.
Механизмы устранения памяти Redis следующие:
Общий сценарий:
При использовании Redis для кэширования данных, чтобы повысить частоту попаданий в кэш, необходимо убедиться, что кэшированные данныеДанные точки доступа. Вы можете установить максимальное использование памяти на объем памяти, занимаемый горячими данными, а затем включить стратегию исключения allkeys-lru, чтобы удалить данные, которые использовались реже всего.
2. redis настойчивость
Redis основан на памяти.Если вы не хотите сохранять данные на жестком диске, после перезапуска Redis (выход/сбой) все данные в памяти будут потеряны.
- Мы определенно не хотим, чтобы данные в Redis были потеряны из-за каких-то сбоев (что привело к тому, что все запросы будут отправлены в MySQL). Даже если произойдет сбой, мы надеемся, что исходные данные Redis можно будет восстановить. Это роль упорство.
Redis предоставляет два разных метода сохранения данных на диске:
- RDB (на основе моментальных снимков) сохраняет все данные в определенный момент в файл RDB.
- AOF (файл только для добавления), когда сервер Redis выполняетсянаписать команду, выполнитнаписать командуСохранить в файл AOF.
2.1RDB (сохранение моментальных снимков)
Постоянство RDB можетруководствоВыполнить или в соответствии с конфигурацией сервераобычныйвоплощать в жизнь. Файл RDB, сгенерированный сохраняемостью RDB, представляет собойкомпрессияБинарный файл, Redis может передать этот файлснижениеданные базы данных.
Есть две команды для создания файлов RDB:
-
SAVE
встречаблокироватьПроцесс сервера Redis, сервер не может получать какие-либо запросы, пока не будет создан файл RDB. -
BGSAVE
Создатьдочерний процесс, дочерний процесс отвечает за создание файла RDB, а серверный процесс может продолжать получать запросы.
Когда сервер Redis запускается, если он находит файл RDB, онавтоматическийЗагружать файлы RDB (вмешательство человека не требуется)
- Во время загрузки файла RDB сервер будет заблокирован до завершения загрузки.
Кроме ручного вызоваSAVE
илиBGSAVE
Помимо создания файлов RDB с помощью команды, мы можем использовать метод конфигурации дляобычныйвоплощать в жизнь:
В конфигурации по умолчанию, если сработают следующие условия, он будет выполненBGSAVE
Заказ
save 900 1 #在900秒(15分钟)之后,至少有1个key发生变化,
save 300 10 #在300秒(5分钟)之后,至少有10个key发生变化
save 60 10000 #在60秒(1分钟)之后,至少有10000个key发生变化
Принцип, вероятно, такой (в сочетании с приведенной выше конфигурацией):
struct redisServer{
// 修改计数器
long long dirty;
// 上一次执行保存的时间
time_t lastsave;
// 参数的配置
struct saveparam *saveparams;
};
Пройдите массив параметров, чтобы определить, совпадают ли количество модификаций и время, и если да, вызовитеbesave()
для создания файла RDB
Резюме: вызов вручнуюSAVE
илиBGSAVE
База данных активируется командами или условиями конфигурации.в какой-то моментМоментальные снимки данных и создание файлов RDB для сохранения.
2.2AOF (добавление файла)
Выше было указано, что сохраняемость RDB достигается путем создания «моментального снимка» данных базы данных в определенный момент Давайте посмотрим, как достигается AOF.
- AOF выполняется путем сохранения сервера Redis.написать командудля записи данных в базу данных.
Например, мы выполняем следующую команду записи в пустой базе данных:
redis> SET meg "hello"
OK
redis> SADD fruits "apple" "banana" "cherry"
(integer) 3
redis> RPUSH numbers 128 256 512
(integer) 3
Redis создает файл AOF со следующим содержимым:
Это команды в RedisФормат протокола запросазаконсервированный. Ссылки на спецификацию протокола Redis (RESP):
Реализация функции сохраняемости AOF может быть разделена на 3 этапа:
- command append: команда записывает в буфер aof_buf
- Запись файла: вызовите функцию flushAppendOnlyFile, чтобы решить, следует ли записывать буфер aof_buf в файл AOF.
- Синхронизация файлов: проверьте, действительно ли данные в буфере памяти записываются на жесткий диск.
Поведение функции flushAppendOnlyFile настраивается серверомпараметры appendfsynпринимать решение:
appendfsync always # 每次有数据修改发生时都会写入AOF文件。
appendfsync everysec # 每秒钟同步一次,该策略为AOF的默认策略。
appendfsync no # 从不同步。高效但是数据不会被持久化。
Буквально это должно быть лучше понято, я не буду здесь вдаваться в подробности...
Давайте посмотрим, как загружается AOF и восстанавливаются данные:
- Создаватьподдельный клиент(local) для выполнения команд AOF до тех пор, пока не будут выполнены все команды AOF.
2.2.1 Перезапись AOF
Как видно из предыдущего примера, мы написали три команды, и файл AOF сохранил три команды. Если наша команда выглядит так:
redis > RPUSH list "Java" "3y"
(integer)2
redis > RPUSH list "Java3y"
integer(3)
redis > RPUSH list "yyy"
integer(4)
Аналогично, AOF также сохраняет 3 команды. Мы найдем проблему: вышеуказанная команда в порядкесливатьсяНе обязательно, чтобы 3 было 1 командой. Это может бытьУменьшите размер файла AOF.
Перезапись AOF запускается самим Redis (конфигурация параметров), или вы можете использоватьBGREWRITEAOF
ЗаказРучной триггерОперация переопределения.
- Стоит отметить, что:Перезапись AOF не требует чтения и анализа существующих файлов AOF. Перезапись AOF достигается путем чтения данных из текущей базы данных сервера.!
Например, теперь есть база данных Redis со следующими данными:
Команда для нового файла AOF выглядит следующим образом:Ничего лишнего!
2.2.2 Перезапись фона AOF
Redis помещает программу перезаписи AOF вдочерний процессвыполнять(BGREWRITEAOF
команда), какBGSAVE
Эта же команда разветвляет дочерний процесс для завершения операции перезаписи AOF, чтобы он не повлиял на основной процесс.
Фоновая перезапись AOF не блокирует получение запросов основным процессом, а новые запросы команд записи могут вызватьДанные текущей базы данных и перезаписанного файла AOF несовместимы!
Чтобы решить проблему несогласованности данных, сервер Redis устанавливаетБуфер перезаписи AOF, этот кеш будет храниться на сервереИспользовать после создания дочернего процесса.
2.3Стратегия RDB и AOF для ключей с истекающим сроком действия
Стратегия сохранения RDB для ключей с истекшим сроком действия:
- воплощать в жизнь
SAVE
илиBGSAVE
Файл RDB, созданный командой, программа проверит ключ с истекшим сроком действия в базе данных,Ключи с истекшим сроком действия не сохраняются в файле RDB. - При загрузке файла RDB программа также проверяет ключи в файле RDB,Просроченные ключи игнорируются.
Стратегия сохранения RDB для ключей с истекшим сроком действия:
- Если срок действия ключа базы данных истек, но он не был лениво/периодически удален, файл AOF не будет иметь никакого действия (то есть он будет сохранен) из-за просроченного ключа. , к Показать запись о том, что ключ удален, будет добавлена команда DEL.
- При перезаписи файла AOF программа проверяет ключи в файле RDB,Просроченные ключи игнорируются.
Режим копирования:
- главный сервер для управленияРавномерно удалять ключи с истекшим сроком действия с сервера (чтобы обеспечить согласованность данных сервера master-slave)
2.4 Какой из них используется для RDB и AOF?
RDB и AOF не исключают друг друга, они могутиспользовать одновременно.
- Преимущества RDB: время загрузкиБыстрое восстановление данных, Размер файла небольшой.
- Недостатки RDB: в определенной степенипотерянные данные(Потому что, как только система выйдет из строя до запланированного сохранения, данные, которые не были записаны на диск до этого, будут потеряны.)
- Преимущества AOF: меньшая потеря данных (в конфигурации по умолчанию теряется только одна секунда данных).
- Недостатки AOF: относительно медленное восстановление данных, большой размер файла.
Если сервер Redisоткрыть в то же времяДля сохраняемости RDB и AOF серверУстановите приоритет использования файлов AOFДля восстановления данных (поскольку частота обновления AOF выше, чем частота обновления RDB, восстановленные данные являются более полными)
Конфигурации, которые могут включать RDB и AOF:
redis持久化,两种方式
1、rdb快照方式
2、aof日志方式
----------rdb快照------------
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /var/rdb/
-----------Aof的配置-----------
appendonly no # 是否打开 aof日志功能
appendfsync always #每一个命令都立即同步到aof,安全速度慢
appendfsync everysec
appendfsync no 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof 同步频率低,速度快
no-appendfsync-on-rewrite yes 正在导出rdb快照的时候不要写aof
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
./bin/redis-benchmark -n 20000
Документы официального сайта:
3. Наконец
Теперь, когда приближается Double Eleven, просто купите облачные серверы Alibaba.особенно сэкономить деньги! я купил его раньшеУченический компьютер тоже нужен 9.8Юань в месяц, теперь требуется только самая низкая цена8.3Один месяц!
Будь то Nginx/Elasticsearch/Redis, эти технологии отлично работают под Linux.Если вы начинающий программист, это также хороший выбор, чтобы купить его, чтобы изучить основные команды Linux и научиться создавать среду.
Если у вас есть студенты, которые хотят купить сервер, вы можете пройти по моей ссылкеНаслаждайтесь самой низкой ценой напрямую:Aliyun.com/act/team111…
Если у вас есть лучший способ понять или в статье есть ошибки, пожалуйста, не стесняйтесь оставлять сообщение в области комментариев, чтобы мы могли учиться друг у друга~~~
Использованная литература:
- «Проектирование и реализация Redis»
- "Редис бой"
ОдинПридерживайтесь общедоступной учетной записи оригинальной технологии Java: Java3y, приветствую всех, чтобы обратить внимание
Все 3 года оригинальной статьи:
- Навигация по каталогу статей (карта мозга + обширные видеоресурсы):GitHub.com/Zhongf UC очень…