Новые функции Redis 6.0 также определяются в ходе пошаговых обсуждений и оптимизаций.
Многие функции были представлены в предыдущих версиях, таких как RC.
Но есть и новые изменения в официальной версии GA:
- SSL
- ACL: лучше, поддержка команд
- RESP3
- Кэширование на стороне клиента: редизайн
- Threaded I/O
- Diskless replication on replicas
- Cluster support in Redis-benchmark and improved redis-cli cluster support
- Disque в бета-версии как модуль Redis: начал вторгаться в область очереди сообщений
- Redis Cluster Proxy
- Поддержка RDB может быть удалена сразу после того, как она больше не используется, для сценариев, когда диск не будет удален.
- PSYNC2: оптимизированный протокол репликации
- Поддержка настройки тайм-аута более дружелюбна
- Более быстрая загрузка RDB, улучшение на 20–30 %
- STRALGO, новая строковая команда, в настоящее время только одна реализует LCS (самая длинная общая подпоследовательность)
@antirez упомянул, что это только самое крупное обновление версии в истории Redis, поэтому разумно рекомендуется протестировать и оценить больше приложений и пообещать, что версия 6.0.1 будет выпущена в срочном порядке, как только будет обнаружена серьезная ошибка. Как и ожидалось, на день позже вышла версия 6.0.1, в которой исправлена ошибка аллокатора, которая была введена для оптимизации и теперь временно устранена.
I just released Redis 6.0.1. Unfortunately there was a bug in Redis 6.0.0 introduced just a few days before the release, that only happens when using the non-default allocator (libc malloc in this case triggers it). Optimization reverted, 6.0.1 released. Sorry for the issue.
Эта статья в основном посвященаClient side caching(Кэширование на стороне клиента) Эта функция.
smallnest/RESP3 — это библиотека синтаксического анализа для протокола Redis RESP3. Вы можете использовать ее для связи с базовым Redis или обернуть ее для реализации новой версии клиентской библиотеки Redis или сервера Redis.
Год назад, после того как @antirez посетил конференцию Redis в Нью-Йорке, он проснулся в отеле в 5:30, глядя на красивые пейзажи улиц Манхэттена, думая о будущем Redis в толпе. В том числе кэширование на стороне клиента.
Фактически, на функцию кэширования на стороне клиента повлиял Бен Малек из Redis Conf 2018, который внезапно открыл идею @antirez. Мы знаем, что многие компании используют Redis в качестве системы кэширования, что значительно повышает производительность доступа к данным, однако для дальнейшей работы с горячими данными многие компании по-прежнему кэшируют некоторые горячие данные на стороне клиента Redis, чтобы справиться с поеданием дыни. Мероприятия. Например, на Weibo мы часто сталкиваемся с крушением знаменитостей, разделением и воссоединением звезд, чрезвычайными ситуациями и т. д. Каждый год происходит несколько чрезвычайных ситуаций.В дополнение к использованию Redis в качестве кеша, чтобы избежать прямого доступа к базе данных, Weibo также добавит больше кеша. слои впереди, такие какL1 cache
и т. д., используя такие продукты, как memcached, в качестве кеша горячих данных. Тогда возникает вопрос, как синхронизировать данные этих кешей и редисов по времени? Бен предложил очень интересные идеи.
Стоя на улицах Манхэттена, @antirez впал в созерцание, а позже вернулся в отель, где занялся внедрением кэша первой версии клиента. Конечно, окончательная реализация Redis 6.0 сильно отличается от реализации этой начальной версии, но ясно, что мы все еще можем видеть компромисс этой функции @antirez с развитием клиента. В этой статье мы не будем вдаваться в подробности этой истории, поскольку мы больше сосредоточены на том, как в конечном итоге выглядит эта функция.
Redis реализует серверный клиентский кеш, называемыйtracking
. Команда для кэширования на стороне клиента:
CLIENT TRACKING ON|OFF [REDIRECT client-id] [PREFIX prefix] [BCAST] [OPTIN] [OPTOUT] [NOLOOP]
когдаtracking
Если этот параметр включен, Redis «запомнит» ключ, запрошенный каждым клиентом, и отправит клиенту сообщение о недействительности при изменении значения ключа. Информация о недействительности может быть отправлена запрашивающему клиенту по протоколу RESP3 или перенаправлена на другое соединение (поддерживает RESP2+ Pub/Sub). При включенном режиме вещания (трансляции) участвуйте вtracking
Клиент будет получать уведомления о ключе, на который он подписан через префикс, даже если он не запрашивал соответствующий ключ. Также предоставляетOPTIN
,OPTOUT
и т.п. режим.
Сообщение о недействительности: когда данные ключа изменяются, он должен сообщить клиенту, что его ранее кэшированные данные недействительны.В это время Redis будет активно отправлять сообщение о недействительности.
- REDIRECT: переслать сообщение об аннулировании другому клиенту. Когда мы не используем RESP3, а используем старый RESP2 для связи с Redis, сам клиент не поддерживает обработку сообщений об аннулировании, поэтому мы можем включить клиент Pub/Sub для обработки сообщений об аннулировании. Конечно, если клиент поддерживает RESP3, он также может переслать сообщение об аннулировании другому клиенту. Мы поместили этот случай в финальное демо.
- BCAST: начать использовать режим трансляции
tracking
. В этом режиме клиенту необходимо установить префикс ключа дорожки, и сообщение об аннулировании этих ключей будет транслироваться всем участвующим клиентам, независимо от того, запрашивают/кешируют ли эти клиенты эти ключи. Если не в широковещательном режиме, Redis будет отслеживать только ключи, запрошенные командами только для чтения, и только один раз сообщит об аннулировании. - PREFIX: Применяется только широковещательный режим и регистрируется префикс ключа. Сообщение об аннулировании будет отправлено, когда будут изменены все ключи, начинающиеся с этого префикса. Можно зарегистрировать несколько префиксов. Если префикс не установлен, режим трансляции будет отслеживать каждую клавишу.
- OPTIN: Нормально, когда режим вещания не активированНе будуотслеживать командные клавиши только для чтения, если только они не
CLIENT CACHING yes
называется после. - OPTOUT: Нормально, когда режим вещания не активированМогуотслеживать командные клавиши только для чтения, если только они не
CLIENT CACHING off
называется после. - NOLOOP: Не отправлять ключ, модифицированный самим клиентом.
Давайте рассмотрим каждый вариант один за другим.
Настройка тестовой среды
Сначала давайте представим параметры, связанные с протоколом RESP3,REDIRECT <id>
Представлен в конце.
Прежде чем пытаться, вам сначала нужно установить версию Redis 6.x, в настоящее время 6.0.1. На официальном сайте есть загрузка исходников, компиляция и установка тоже очень простые:
make distclean
make
make test
sudo make install
Я думаю, что скомпилированный бинарный пакет скоро будет доступен для скачивания.
Запустите сервер, он запустит службу на порту 6379:
redis-server
использоватьredis-cli
Доступ, доступ по умолчанию к экземпляру 6379 этой машины:
redis-cli
конечно можно пройти-h
См. дополнительные настройки параметров, такие как использование других портов и т. д. Здесь мы используем простейший пример, сосредоточившись на понимании характеристик кэширования на стороне клиента.
Иногда, чтобы лучше наблюдать за возвращаемыми результатами redis, мы используемtelnet
вместоredis-cli
Подключайтесь к Redis в качестве клиента, потому что Redis-Cli обрабатывает результаты, особенно сообщения об ошибках, которые вы можете не заметить.
Режим вещания BCAST (отслеживание клиентов включено)
Запускаем Redis-сервер:
Запустите Redis-Cli:
Конечно, мы используем telnet для тестирования, что удобно для наблюдения за возвращаемыми результатами redis.Только сейчас redis-cli использовался для обновления значения ключа, чтобы помочь тесту. Отправлено после подключенияhello 3
Включить протокол RESP3:
➜ ~ telnet localhost 6379
Trying ::1...
Connected to localhost.
Escape character is '^]'.
hello 3
%7
$6
server
$5
redis
$7
version
$5
6.0.1
......
Потом попробуй включитьtracking
и читатьa
Значение:
client tracking on
+OK
set a 1
+OK
get a
$1
1
В настоящее время, если вы используете redis-cli в качестве другого клиента для обновленияa
, клиент telnet должен иметь возможность получать уведомления:
127.0.0.1:6379> set a 2
OK
Наблюдая за телнетом, он получил сообщение об ошибке:
>2
$10
invalidate
*1
$1
a
Обратите внимание, что он принимает тип PUSH в RESP3 (>
).
Если это использует вас, используйте redis-cli для обновленияa
значение, telnet больше не будет получать сообщения об аннулировании. если клиент telnet неget a
сноваtracking
значение а.
Можно отменить в любое времяtracking
:
client tracking off
ключ отслеживания для определенного префикса (отслеживание клиента включено)
Приведенный выше метод будет отслеживать все ключи.Если вы хотите отслеживать только конкретный ключ, в настоящее время Redis предоставляет метод, то есть метод сопоставления префиксов. Вы можете отслеживать только ключи с определенными префиксами. Его значение применяет широковещательный режим.
Используйте клиент telnet, чтобы установить префикс и включить отслеживание:
hello 3
.......
client tracking on prefix a bcast
+OK
client tracking on prefix user bcast
+OK
Мы отслеживаем два префикса, начиная сa
Все ключи, начинающиеся с и начинающиеся сuser
Все ключи в начале, всеa
Все ключи, начинающиеся с и начинающиеся сuser
Все ключи в начале (включаяa
а такжеuser
) должен получать сообщение при каждом изменении ключа ).
Затем мы используем redis-cli для обновления трех ключей:abc
,user:32432723213
а такжеfeed:6532343243432
:
127.0.0.1:6379> set abc 100
OK
127.0.0.1:6379> set user:32432723213 good
OK
127.0.0.1:6379> set feed:6532343243432 abc
OK
телнет-клиент получилabc
а такжеuser:32432723213
сообщение об аннулировании без полученияfeed:6532343243432
Сообщение об аннулировании:
>2
$10
invalidate
*1
$3
abc
>2
$10
invalidate
*1
$16
user:32432723213
ты можешь пройтиclient tracking off
Остановить кэширование на стороне клиента. В настоящее время кажется, что невозможно остановить только один префиксtracking
. даже если вы используетеclient tracking off prefix user
также отменяется для всех ключейtracking
.
......
} else if (!strcasecmp(c->argv[2]->ptr,"off")) {
disableTracking(c);
} else {
......
выбрать в
При использованииOPTIN
, который можно выборочно включитьtracking
. только ты посылаешьclient caching yes
Ключ следующей команды только для чтения после этого будетtracking
, иначеКлючи в других командах только для чтения не отслеживаются.
Сначала мы начинаемoptin
, прочитайте палец а. В это время используйте клиент redis-cli, чтобы изменить значение а на 1000, но мы его не получили.a
сообщение об ошибке.
client tracking on optin
+OK
get a
$1
2
Далее мы отправляемclient caching yes
, а затем получите значение а. Если вы измените значение а в это время, вы можете получить сообщение об ошибке для а:
client caching yes
+OK
get a
$4
1000
>2
$10
invalidate
*1
$1
a
должны сопровождатьсяclient caching yes
Да, например, отправка следующей команды будет толькоtracking
б вместо а:
client caching yes
+OK
get b
_
get a
$4
2000
отказаться
При использованииOPTOUT
, вы также можете отказатьсяtracking
. только ты посылаешьclient caching off
Клавиша следующей команды только для чтения после этого остановитсяtracking
, иначеКлючи в других командах только для чтения будут отслеживаться.
можно увидеть иOPTIN
Напротив, вы можете выбрать в соответствии с вашей сценой.
Например, в следующем примере включитеOPTOUT
После этого изменения любого ключа получат сообщение о недействительности:
client tracking on optout
+OK
get a
$4
3000
>2
$10
invalidate
*1
$1
a
В настоящее время, если мы хотим исключитьb
Этот ключ можно задать только для него:
client caching no
+OK
get b
$1
3
Последующие изменения в b не получат сообщение о недействительности b.
Уведомление: OPTIN
а такжеOPTOUT
Он нацелен на не-BCAST-сценарии, то есть только после того, как вы отправите команду только для чтения для ключа, соответствующий ключ будет отслеживаться. Широковещательный режим заключается в том, что независимо от того, отправили ли вы команду только для чтения для ключа, пока redis изменяет ключ, он отправит сообщение о недействительности соответствующего ключа (или ключа, соответствующего префиксу).
NOLOOP
Если установлено нормально, сообщение об аннулировании отправляется всем участвующим клиентам, но если установленоNOLOOP
, он не будет отправлен клиенту, который обновляет ключ.
client tracking on bcast noloop
+OK
set a 1
+OK
client tracking off
+OK
client tracking on bcast
+OK
set a 1
+OK
>2
$10
invalidate
*1
$1
a
Обратите внимание, что для отмены отслеживания просто позвонитеclient tracking off
Вот и все.
REDIRECT
Наконец, давайте посмотрим на обработку переадресованных сообщений. Это должно быть совместимо с методом обработки протокола RESP2, который пересылает сообщение о недействительности другому клиенту.
Сначала мы смотрим на идентификатор клиента redis-cli:
127.0.0.1:6379> client list
id=4 addr=127.0.0.1:61017 fd=8 name= age=33103 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client user=default
Используйте telnet для подключения к Redis и просмотра идентификатора клиента:
client id
:12
Клиент telnet открывает сообщение об аннулировании подписки:
SUBSCRIBE __redis__:invalidate
*3
$9
subscribe
$20
__redis__:invalidate
:1
Затем мы можем переслать сообщение об ошибке redis-cli клиенту telnet:
client tracking on bcast redirect 12
127.0.0.1:6379> set a 1000
OK
Вы можете видеть, что клиент telnet получил сообщение об аннулировании:
*3
$7
message
$20
__redis__:invalidate
*1
$1
a
Если целевой клиент, которого вы хотите перенаправить, включил протокол RESP3, вам не нужен RESP3 Pub/Sub, поскольку RESP3 изначально поддерживает Push-сообщения.
Код реализации функции отслеживания Redis находится в файле: tracking.c.