Насколько вы освоили основы Redis? Проверить на утечки?

Java Redis

Что такое Редис

Redisдаоткрытый источник,ОЗУсистема хранения структуры данных в , которую можно использовать какбаза данных,тайникиПО промежуточного слоя сообщений. Он поддерживает множество типов структур данных, таких какнитьstrings,хэш hashes,список lists,собирать sets,отсортированный набор sorted setsС запросами диапазона, растровыми изображениями, гиперлоглогами и запросами радиуса геопространственного индекса.

RedisТакже имеет встроенную копию (replication), LUA-скрипты (Lua scripting), события привода LRU (LRU eviction), транзакция (transactions) и различные уровни сохраняемости диска (persistence) и через Redis Sentinel (Sentinel) и автоматическое разбиение (Cluster) обеспечивает высокую доступность (high availability).

Ну, это правильноredisВведение на официальном китайском сайте лаконично и ясно.

Что такое NoSQL

мы знаемredisэто нереляционная база данныхNoSQL. И почему появляетсяNoSQL?NoSQLЧто это?

Эпоха автономных баз данных

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

кэш + разделение

С увеличением трафика база данных больше не может удовлетворить наши потребности. Для повышения производительности мы добавляем уровень кэширования посередине и кластеризируем базу данных, оптимизируем структуру и разделяем чтение и запись.

А кеш вотNoSQL, конечно, делать кэширование простоNoSQLфункцияRedisДело не только в кэшировании. Например, он также может достигатьпростая очередь сообщений,Решить совместное использование сеанса,прилавок,Таблица лидеров,Обращение с дружбойи т. д. функция, видимаяRedisэто очень мощный инструмент, давайте изучим его!

Общие команды Redis

Во-первых, давайте отложим в сторону типы данных и поговорим оRedisобщая команда.

Управление ключами и значениями

Redisэтоkey valueХранится кеш базы данных, все данные имеют свой уникальный ключ.

Для удобства демонстрации здесь я использую команду настройки, связанную со строкой

  • keys [pattern]Получите все ключи, соответствующие требованиям. Временная сложностьO(n), как правило, не используется в производственной среде, посколькуRedisдаодин потокиз,Выполнение трудоемких задач блокирует другие задачи. обычно используютscanПодстановка команд (неблокирующая).

  • dbsizeПолучить текущее количество сохраненных данных.
  • exists keyОпределить, существует ли ключ
  • del keyудалить указанные данные
  • type keyПолучить тип данных указанного ключа
  • rename key newkeyПереименовать

Дата истечения срока годности

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

  • expire key secondsУстановите срок действия ключа.
  • ttl keyПроверьте оставшееся время ключа, верните положительное число для представления оставшегося времени, -1 для постоянного, -2 для просроченного или несуществующего.

Пять основных типов данных Redis

Я много сказал вышеRedisНа основеRedisструктура данных. На протяженииRedisСуществует пять основных структур данных (некоторые расширенные структуры данных будут обсуждаться позже).нитьstrings,хэш hashes,список lists,собирать sets,отсортированный набор sorted sets.

строка строка

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

  • set key valueНастройки
  • get keyПолучить значение ключа
  • mset key1 value1 key2 value2устанавливаются партиями иатомДа, можно использовать для сокращения потребления времени в сети
  • mget key1 key2Массовая выборка иатомДа, можно использовать для сокращения потребления времени в сети
  • incr keyАвтоматически увеличивать значение указанного ключа
  • decr keyУменьшить значение указанного ключа
  • incrby key valueАвтоматически увеличивать указанное значение
  • decrby key valueУменьшить указанное значение
  • incrbyfloat key floatvalueУвеличить указанное число с плавающей запятой Первые несколько операций могут быть использованы для достиженияприлавокфункция.
  • setnx key valueЕсли ключ не существует, его можно успешно установить, иначе произойдет сбой.В сочетании с ограничением времени истечения это способ для Redis реализовать распределенные блокировки (упомянутые позже)..
  • set key value xxВ отличие от предыдущего, если он существует, настройка выполняется успешно, в противном случае происходит сбой (эквивалентно операции обновления).
  • getset key newvalueустановить новое значение и вернуть старое значение
  • append key valueДобавление содержимого к исходному содержимому
  • strlen keyполучить длину строки
  • getrange key start endПолучить содержимое указанного диапазона
  • setrange key index valueУстановить содержимое указанного диапазона
  • setex key seconds valueУстановите значение и установите время истечения срока действия
  • set key value ex seconds nxУстановите значение для несуществующего ключа и установите срок действия,Реализация распределенных блокировок.

hash

На самом деле мы можем понятьhashзаМалый Редис,Redisпо базовой реализации иJavaсерединаHashMapпочти, пользуйсямассив + связанный списокреализуется двухмерной структурой.

Разница в том, что вRedisзначение словаря вможет быть только строка, И ониrehashпо-другому, вRedisиспользуется впрогрессивная перефразировка.

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

Давайте посмотрим наhashосновная операция.

  • hset key field valueУстановить значение ключа в словаре
  • hsetnx key field valueУстановить значение ключа в словаре (который не существует)
  • hmset key field1 value1 field2 value2 ...Пакетные настройки
  • hget key fieldПолучить значение ключа в словаре
  • hmget key field1 field2Массовое приобретение
  • hgetall keyполучить все
  • hdel key fieldудалить ключ
  • hexists key fieldопределить, есть ли
  • hlen keyПолучить количество хранилищ в словаре, соответствующее указанному ключу
  • hvals keyвернуть все значения
  • hkeys keyвернуть все ключи
  • hincrby key field increValueУвеличить значение значения (также можно увеличить отрицательные числа)
  • hincrbyfloat key field floatValueУвеличить значение значения (с плавающей запятой)

list

RedisСписок в эквивалентенJavaсерединаLinkedList(Двусвязный список), то есть нижний слой пропускается черезсвязанный списокдобиться, поэтому дляlistзаОперации вставки и удаления выполняются быстро,ноПозиционирование индекса очень медленное.

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

Давайте посмотрим наlistосновная операция.

  • lpush key item1 item2 item3...стек слева
  • rpush key item1 item2 item3...стек справа
  • lpop keyпоп слева
  • rpop keyпоп справа
  • lindex key indexПолучить элемент по указанному индексу O(n) Использовать с осторожностью
  • lrange key start endПолучить элементы указанного диапазона O(n) Использовать с осторожностью
  • linsert key before|after item newitemДобавить новый элемент до или после указанного элемента
  • lrem key count valueУдаляет указанный элемент со значением value
    • count = 0 : удалить все элементы, значение которых равно значению
    • count > 0 : удалить элементы count со значением слева направо
    • count
  • ltrim key start endсохранить указанный диапазон элементов
  • lset key index newValueобновить значение индекса
  • blpop key timeoutЕсли нет, заблокируйте (тайм-аут указывает время блокировки как 0 для постоянного)
  • brpop key timeoutЕсли нет, заблокируйте (тайм-аут указывает время блокировки как 0 для постоянного). Эти два могут использоваться для достиженияпотребительский производитель

Подводя итог, мы можем использоватьВлево и вправо или вправо и влево для реализации очереди, влево влево или вправо и вправо для реализации стека.

  • lpush + lpop = Stack
  • rpush + rpop = Stack**
  • lpush + rpop = Queue
  • rpush + lpop = Queue
  • lpush/rpush + ltrim = ограниченный список (список фиксированной длины)
  • lpush + brpop = очередь сообщений (очередь сообщений)
  • rpush + blpop = очередь сообщений (очередь сообщений)

set

RedisсерединаsetэквивалентноJavaсерединаHashSet(неупорядоченное множество), где элементы внутринельзя повторить, мы можем использовать его для реализации некоторых функций дедупликации. У нас также есть несколько комплектовВозьмите перекресток,взять союзТакие операции могут получить общих друзей, общие увлечения и т.п. среди разных пользователей.

Давайте посмотрим наsetнекоторые основные операции.

  • sadd key valueдобавить элемент
  • sdel key valueудалить элемент
  • sismember key valueОпределить, является ли это элементом коллекции
  • srandmember key countСлучайным образом получить указанное количество элементов (не повлияет на структуру набора)
  • spop key countСлучайное извлечение элементов из коллекции (нарушит структуру привязки)
  • smembers keyПолучить все элементы коллекции сложности O(n)
  • scard keyПолучить количество наборов
  • sinter set1 set2 ...Получить пересечение всех множеств
  • sdiff set1 set2 ...Получить разницу всех наборов
  • sunion set1 set2 ...Получить объединение всех наборов

zset

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

zsetв использованиипропустить столДля этого мы знаем, что можно использовать только непрерывное пространство, такое как массив.бинарный поискДля быстрого позиционирования связанный список невозможен. Таблица пропуска экономит много времени при поиске связанного списка (используйте метод пропуска для обхода индекса для упорядоченной вставки).

Давайте посмотрим наzsetнекоторые основные операции.

  • zadd key score elementДобавьте, оценка используется для сортировки, значение должно быть уникальным, а временная сложность составляет O (logn) из-за используемой таблицы пропуска.
  • zrem key elementУдаление элемента имеет временную сложность O(1)
  • zscore key elementПолучить оценку элемента
  • zincrby key incrScore elementувеличить оценку элемента
  • zrange key start end [withscores]Получить элементы указанного диапазона индексов плюсwithscoresвозвращает счетO(logn + m) временная сложность
  • zrangebyscore key minScore maxScore [withscores]Получить элементы указанного диапазона оценок плюсwithscoresзатем возвращает счет,O(logn + m) временная сложность
  • zcard keyполучить отсортированную длину набора

Транзакции и конвейеры в Redis

Трубопровод

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

дела

Реляционные базы данных имеютACIDхарактеристика,RedisМожет гарантировать A (атомарность) и I (изоляцию), D (постоянство), чтобы увидеть, есть ли конфигурацияRDBилиAOF постоянная работа, но согласованность не может быть гарантирована, потому чтоRedisТранзакция не поддерживает откат.

Мы можем просто понимать какRedisсделки вPipelineЕсть дополнительная атомарная операция, то есть она не будет разделена другими командами, как показано на рисунке выше.

  • multiзнак начала бизнеса

  • execвыполнение транзакции

  • discardОчищает все команды, поставленные в очередь в этой транзакции, т. е. раскручивает всю транзакцию.

  • watch keyОтслеживайте элемент перед началом транзакции.Если значение этого элемента будет изменено другими клиентами во время фиксации транзакции, транзакция завершится ошибкой.

  • unwatch keyНе контролировать

Краткое изложение общих команд в Redis

Ну, это все для этой статьи, дляRedisКак много вы забыли или не узнали?

Если статья была вам полезна, поставьте лайк (#^.^#)

оRedisСтатья будет написана в будущем, если вам интересно, вы можете подписаться на меня (#^.^#).