предисловие
Redisпри условии5структура данных. Понимать характеристики каждой структуры данных, дляRedisизDevOpsочень важно при освоенииRedisизОднопоточная обработка командмеханизм, который будетструктура данныхиЗаказвыбор более эффективен.
В следующих нескольких статьях будут представлены следующие аспектыRedisНесколько структур данных, использование команд и сценарии приложений.
- Предварительные знания: несколько простыхглобальная команда,структура данныхиВнутреннее кодирование,команда одного потокаАнализ механизма обработки.
-
Свойства структуры данных:
5своего родаструктура данныхспециальность,использование команды,Сценарии применения. - управление данными:ключевой менеджмент,клавиши перемещения,управление базами данных.
Другие статьи
-
Анализ глубины Серия Redis (a) — Введение Redis в главное здание и из него
-
Углубленный анализ серии Redis (2) - Редис Sentry Mode и кластер высокой доступности
-
Углубленный анализ серии Redis (4) — Обзор структуры данных Redis и глобальных команд
-
Углубленный анализ серии Redis (5) — Строка структуры данных Redis
-
Углубленный анализ серии Redis (6) — хэш структуры данных Redis
-
Углубленный анализ серии Redis (7) — Список структур данных Redis
-
Углубленный анализ серии Redis (8) — коллекции структур данных Redis.
текст
1. Предварительные знания
Представляем5своего родаструктура данныхПрежде чем вам нужно знатьRedisНекоторые изглобальная команда,структура данныхиВнутреннее кодирование,Однопоточный механизм обработки команд.
-
RedisКоманда имеетсотни,пониматьRedisнекоторые механизмы, вы обнаружите, что эти команды имеют сильнуюобщность. -
RedisНе панацея, некоторыеструктура данныхиЗаказДолжен бытьконкретная сценапри использовании, один раззлоупотреблениенаверное правильноRedisсамилисамо приложениеНанести смертельную травму.
2. Глобальные команды
Redisимеют5своего родаструктура данных,Они естьпара ключ-значениесерединаценность,заключНапример, есть несколько общих команд.
2.1. Посмотреть все ключи
keys *
вставлен ниже3Для пар ключ-значение строкового типа:
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> set java jedis
OK
127.0.0.1:6379> set python redis-py
OK
Команда выведет все ключи:
127.0.0.1:6379> keys *
1) "python"
2) "java"
3) "hello"
2.2 Общее количество ключей
dbsize
Вставьте один нижеТип спискаизпара ключ-значение(значениенесколько элементовсочинение):
127.0.0.1:6379> rpush mylist a b c d e f g
(integer) 7
dbsizeКоманда вернет текущую базу данныхобщее количество ключей.
127.0.0.1:6379> dbsize
(integer) 4
dbsizeКомандаПодсчитайте общее количество ключейВремяне пройдетВсе ключи, вместо этого получите напрямуюRedis Встроенная ключевая общая переменная,такdbsizeКомандавременная сложностьдаO(1). иkeysкоманда будеттраверсвсе ключи, так чтовременная сложностьдаO(n),когдаRedisсохраненмного ключейвремя, онлайн-средазапретитьиспользовать.
2.3. Проверить, существует ли ключ
exists key
вернуть, если ключ существует1, вернуть, если он не существует0:
127.0.0.1:6379> exists java
(integer) 1
127.0.0.1:6379> exists not_exist_key
(integer) 0
2.4. Удалить ключ
del key
delЯвляетсяОбщее командование, независимо от стоимостиструктура данныхтип,delкоманда может сделать этоУдалить.
127.0.0.1:6379> del java
(integer) 1
127.0.0.1:6379> exists java
(integer) 0
127.0.0.1:6379> del not_exist_key
(integer) 0
127.0.0.1:6379> exists not_exist_key
(integer) 0
Возвращаемый результатУспешно удаленоизколичество ключей, предполагая удалениене существуетключ, он вернется0.
2.5 Срок действия ключа
expire key seconds
Redisпара поддержкиключДобавить кДата истечения срока годности, когда время истечения превышено,Ключ автоматического удаления, например, для ключаhelloнастраивать10Срок действия в секундах:
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> expire hello 10
(integer) 0
ttlКоманда вернет ключОставшееся время экспирации,она имеет3вид возвращаемого значения:
- больше или равно
0Целое: представляет ключосталосьизДата истечения срока годности. - возвращение
-1:ключне заданоДата истечения срока годности. - возвращение
-2:ключне существует.
в состоянии пройтиttlкомандные часыключ helloизОставшееся время экспирации:
# 还剩7秒
127.0.0.1:6379> ttl hello(integer)
(integer) 7
...
# 还剩1秒
127.0.0.1:6379> ttl hello(integer)
(integer) 1
# 返回结果为-2,说明键hello已经被删除
127.0.0.1:6379> ttl hello(integer)
(integer) -2
127.0.0.1:6379> get hello
(nil)
2.6 Основные типы структур данных
type key
например ключhelloда значениеТип строки, возвращаемый результатstring. ключmylistЗначениеТип списка, возвращаемый результатlist. Возвращает, если ключ не существуетnone.
127.0.0.1:6379> set a b
OK
127.0.0.1:6379> type a
string
127.0.0.1:6379> rpush mylist a b c d e f g
(integer) 7
127.0.0.1:6379> type mylist
list
3. Структура данных и внутреннее кодирование
typeНа самом деле команда возвращает текущийключизтип структуры данных, они соответственно:string(нить),hash(хэш),list(список),set(собирать),zset(отсортированный набор), но это толькоRedisВнешнийструктура данных. как показано на рисунке:
для каждогоструктура данныхНа самом деле есть нижний слой.Внутреннее кодированиеосознается и являетсяНесколько реализаций. такRedisбудет в нужное времяСценыВыберите подходящийВнутреннее кодирование, как показано на рисунке:
Видно, что каждыйструктура данныхимеютдва или болееизВнутреннее кодирование. Напримерlist структура данныхсодержитlinkedlistиziplistдваВнутреннее кодирование. В то же время некоторыеВнутреннее кодирование,Напримерziplist, можно использовать какРазличные внешние структуры данныхВнутренняя реализация , может быть выполнена черезobject encodingкомандный запросВнутреннее кодирование:
127.0.0.1:6379> object encoding hello
"embstr"
127.0.0.1:6379> object encoding mylist
"quicklist"
ключ можно увидетьhelloсоответствующее значениеВнутреннее кодированиедаembstr,ключmylistсоответствующее значениеВнутреннее кодированиедаziplist.
RedisУ этой конструкции есть два преимущества:
-
один: может быть улучшенаВнутреннее кодирование, а внешнийструктура данныхиЗаказНет эффекта. Например
Redis3.2который предоставилquicklist, КомбинированныйziplistиlinkedlistПреимущества обоихТип спискаОбеспечиваетБолее эффективнымизРеализация внутреннего кодирования. -
Второй:разныеВнутреннее кодированиедопустимыйразные сценариииграть самостоятельноПреимущество. Например
ziplistсравниватьсохранить память, но в спискебольше элементовв случае,представлениетам будетотклонить,В этот моментRedisбудет основываться нанастроить, Список списокВнутренняя реализацияпреобразовать вlinkedlist.
4. Однопоточная архитектура
Redisиспользовалоднопоточная архитектураиI/O модель мультиплексированияреализоватьвысокая производительностьизСлужба базы данных в памяти. так почемуодин потокЭто может быть так быстро, следующий анализ причин:
4.1 Чистый доступ к памяти
Redisвведите все данные вОЗУсреда, памятьвремя откликаПримерно100 наносекунда,ЭтоRedisдостигатьмиллион уровней в секундуважное основание для доступа.
4.2 Неблокирующий ввод-вывод
Redisиспользоватьepollв видеI/O технология мультиплексированияреализация, плюсRedisсвоямодель обработки событийбудетepollсерединасоединять,прочти и напиши,закрытиепреобразуются всобытие, так что нет необходимости отсутствоватьИнтернет I/OТратить слишком много времени на, как показано на рисунке:
4.3. Один поток позволяет избежать использования переключения потоков и состояния гонки
использоватьодин потокдостичь этоговысокая производительность, Тогда есть хороший выбор, потому чтоодин потокЕсть несколько преимуществ:
-
один потокможно упроститьСтруктуры данных и алгоритмыреализации, разработчику не нужно разбираться в сложныхпараллельные структуры данных.
-
один потокизбегалипереключение потоковигонкаГенерируемое потребление для разработки на стороне сервера,Замки и переключение потокаОбычно убийца производительности.
один потокПроблема: длякаждая командаизвремя исполнениятребуется. если командаисполнение слишком долгое, заставит другие командыблокировать,за
Redisэтовысокая производительностьявляется фатальным для службы, поэтомуRedisОблицовкабыстрое исполнениебаза сцен.
резюме
стопка бумагRedisнесколькоструктура данныхдает обзор и знакомит с несколькими простымиглобальная команда,структура данныхиВнутреннее кодированиеа такжекоманда одного потокаАнализ механизма обработки.
Ссылаться на
«Разработка и эксплуатация Redis»
Добро пожаловать в технический публичный аккаунт: Zero One Technology Stack
Эта учетная запись будет продолжать делиться сухими товарами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.