Оригинал: 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 легче понять.