Советы по архитектуре: переместите цветы и деревья. Имитация Redis с помощью mysql

Redis Архитектура

Оригинал: Miss Sister Taste (идентификатор публичной учетной записи WeChat: xjjdog), добро пожаловать, пожалуйста, сохраните источник для перепечатки.

В наши дни то, что вы видите, не обязательно является тем, что вы думаете. За протоколом mysql может скрываться tidb; за Linux-машиной может быть упрощенный докер; вы думаете, что xjjdog — женщина, но она может этого не знать; и когда вы кричите «да здравствует php», это может быть шучу и переписал суффикс, пока бэкэнд на java.

Всем известно, что Redis работает быстро, но его мощность связана с объемом памяти, и легко добраться до узкого места. Некоторые интернет-компании напрямую используют Redis в качестве серверной базы данных (см. ниже). Когда объем бизнеса растет, он сталкивается с компромиссом между емкостью Redis и ценой. Слишком поздно менять бизнес-код, поэтому нам нужно использовать какое-то постоянное хранилище для имитации некоторых структур данных Redis.

Redis поддерживает почти десять типов данных, пять из которых используются чаще всего. строка, хэш, zset, набор, список и т. д. В этой статье будет обсуждаться имитационная реализация общих операций для нескольких общих структур данных.

По сути, все, что нам нужно разработать, — это прокси-сервер redis. Клиент redis после подключения к нашему прокси выполнит анализ протокола. Проанализированная команда будет смоделирована, а затем размещена в соответствующем mysql в соответствии с настроенным маршрутом.

То есть используемый вами Redis фактически использует mysql для хранения данных. Без рдб и без аоф.

Redis — это текстовый протокол.

Redis — это текстовый протокол, а имя протокола — RESP. RESP — это сокращение от протокола сериализации Redis. Это интуитивно понятный текстовый протокол, преимуществом которого является чрезвычайно простая реализация и отличная производительность синтаксического анализа.

Как показано на рисунке, структурные данные, которые будет передавать протокол Redis, можно свести к 5 минимальным типам единиц. В конце каждого блока равномерно добавляется символ возврата каретки и перевода строки **\r\n**.

Вот несколько правил:

单行字符串 以 + 开头; 
多行字符串 以 $ 开头,后跟字符串长度; 
整数值 以 : 开头,后跟整数的字符串形式; 
错误消息 以 - 符号开头; 
数组 以 * 号开头,后跟数组的长度;

Например, следующее сообщение массива [9,9,6].

*3\r\n:9\r\n:9\r\n:6\r\n

Поэтому разбор и сборка этого протокола очень проста. Возьмите netty в качестве примера, естьcodec-redisмодули для нашего использования.

Реализация: проектирование структуры данных

При проектировании таблицы данных мы обнаружили, что разницы в эффективности между kv и hash нет, потому что он может располагаться прямо по ключу.

Наоборот, zset из-за функции сортировки приводит к неудовлетворительной эффективности выполнения многих операций.

Кроме того, из-за разных структур данных мы используем разные таблицы для хранения. Следовательно, операция удаления должна выполняться для каждой таблицы.

кв дизайн

kv, или строка, является самым основным типом данных в Redis. Один ключ соответствует одному значению, а значение строкового типа может хранить до 512 МБ.

Разработка выделенных таблиц базы данныхrstore_kv, где rkey — первичный ключ.

rkey        varchar
val     varchar
lastTime    bigint

установка операции

insert into rstore_kv("rkey","val","lastTime") values($1,$2,$3) 
on duplicate key update set "val"=$2,"lastTime"=$3

получить операцию

select val from rstore_kv where "rkey" = $1

дель операция

delete from rstore_kv where "rkey" = $1

существует операция

select count(*) as n from rstore_kv where  "rkey" = $1

операция ttl

select lastTIme from rstore_kv  where  "rkey" = $1

хэш-дизайн

Хэш — это набор пар ключ-значение (ключ=>значение). Хэш особенно подходит для хранения объектов.

Разработка выделенных таблиц базы данныхrstore_hash, где rkey и hkey — общие первичные ключи.

rkey        varchar
hkey        varchar
val     varchar
lastTime    bigint

операция hset

insert into rstore_hash("rkey","hkey","val","lastTime") values($1,$2,$3,$4) 
on duplicate key update set "val"=$3,"lastTime"=$4

операция hget

select val from rstore_hash where "rkey" = $1 and "hkey" = $2

операция hgetall

select hkey,val from rstore_hash where "rkey" = $1

Хдель операция

delete from rstore_hash where "rkey" = $1 and "hkey" = $2

дель операция

delete from rstore_hash where "rkey" = $1

хлен, гексистская операция

select count(*) as num from rstore_hash where "rkey" = $1

операция ttl

select max(lastTIme) from rstore_hash  where  "rkey" = $1

зсет дизайн

Redis zset, как и набор, также представляет собой набор элементов строкового типа и не допускает дублирования элементов. Разница в том, что каждый элемент связан с дробью типа double. Redis сортирует элементы набора от меньшего к большему по количеству баллов. В основе его структуры лежит таблица переходов, которая особенно эффективна, но потребляет много памяти.

Разработка выделенных таблиц базы данныхrstore_zset, где rkey и member — общие первичные ключи.

rkey        varchar
member        varchar
score     double
lastTime    bigint

задд операция

insert into rstore_zset("rkey","member","score","lastTime") values($1,$2,$3,$4) on duplicate key update update set "score"=$3,"lastTime"=$4

операция zscore

select score from rstore_zset where "rkey" = $1 and "member" = $2

Зрем операция

delete from rstore_zset where "rkey" = $1 and "member" = $2"

zcard, существует операция

select count(*) as num from rstore_zset where "rkey" = $1

операция zcount

select count(*) as num from rstore_zset where "rkey" = $1 and score>=$2 and score<=$3

операция zremrangebyscore

delete from rstore_zset where "rkey" = $1 and score>=$2 and score<=$3

операция zrangebyscore

select member,score from rstore_zset 
where "rkey" = $1 and score>=$2 and score<=$3 order by score asc,member asc

zrange операция

select member,score from rstore_zset 
where "rkey" = $1 order by score asc offset $2 limit $3

zrank операция

select rank from (select member,rank() over (order by "score" asc, "lastTime" asc) as rank from rstore_zset where "rkey" = $1 ) m where m."member"= $2;

операция ttl

select max(lastTIme) from rstore_zset  where  "rkey" = $1

дель операция

delete from rstore_zset where "rkey" = $1

установленный дизайн

Redis Set — это неупорядоченная коллекция строкового типа.

Разработка выделенных таблиц базы данныхrstore_set, где rkey и member — общие первичные ключи.

rkey        varchar
member        varchar
lastTime    bigint

печальная операция

insert into rstore_set("rkey","member","lastTime") values($1,$2,$3) 
on duplicate key update update set "lastTime"=$3

Скард операция

select count(*) as num from rstore_set where "rkey" = $1

операция на члене

select member from rstore_set where "rkey" = $1 and "member" = $2

операция

select member from rstore_set where "rkey" = $1

временная операция

delete from rstore_set where "rkey" = $1 and "member" = $2

дель операция

delete from rstore_set where "rkey" = $1

операция ttl

select max(lastTIme) from rstore_set  where  "rkey" = $1

End

В этой статье моделируются только наиболее часто используемые функции наиболее часто используемых структур данных.Многие функции не поддерживаются.Наиболее очевидными из них являются распределенная блокировка setnx и так далее. Поэтому разработку этого прокси-слоя не так-то просто добиться ок.

В то же время давайте взглянем на структуру данных Redis в реляционной базе данных с моделируемой точки зрения. Таким образом, мы можем углубить наше понимание Redis и понять ценность его существования.

Об авторе:Мисс сестра вкус(xjjdog), публичная учетная запись, которая не позволяет программистам идти в обход. Сосредоточьтесь на инфраструктуре и Linux. Десять лет архитектуры, десятки миллиардов ежедневного трафика, обсуждение с вами мира высокой параллелизма, дающие вам другой вкус. Мой личный WeChat xjjdog0, добро пожаловать в друзья для дальнейшего общения.​

Последние популярные статьи

"Должен видеть! java back-end, яркий меч Чжусянь"Указатель серверных технологий, актуальный и популярный

«Могу ли я стать архитектором, изучив более 100 технологий? (не реклама)"Точные комментарии к более чем 100 кадрам, чтобы помочь вам выбрать

«В Linux наиболее часто используемый пакет анализа команд (выбор за 10 лет)»В первый день релиза CSDN 1к лайков. Вроде скорость 1/8.

«Если на этот раз я не пойму основные компоненты Spring Cloud, то я зря придумаю эту историю»Используйте истории, чтобы объяснить основные компоненты, чтобы обеспечить ваше удовлетворение

«Наиболее часто используемый набор навыков «Sed» в производственной среде Linux.Наиболее часто используемая серия статей Sed, простая для понимания. Главы Vim легче понять.