предисловие
Тип строкидаRedis
Самая простая структура данных.Тип строкиЗначение на самом деле может бытьнить(Простойисложныйстрока, напримерJSON
,XML
),номер(целое число, число с плавающей запятой) или дажебинарный(картинка, аудио, видео), но максимальное значение не может превышать512MB
.
Другие статьи
-
Углубленный анализ серии Redis (1) — введение в Redis и построение master-slave
-
Углубленный анализ серии Redis (2) — контрольный режим Redis и кластер высокой доступности
-
Углубленный анализ серии Redis (4) — Обзор структуры данных Redis и глобальных команд
-
Углубленный анализ серии Redis (5) — Строка структуры данных Redis
-
Углубленный анализ серии Redis (6) — хэш структуры данных Redis
-
Углубленный анализ серии Redis (7) — Список структур данных Redis
-
Углубленный анализ серии Redis (8) — коллекции структур данных Redis.
текст
1. Связанные команды
1.1 Общие команды
1.1.1. Установка значений
set key value [ex seconds] [px milliseconds] [nx|xx]
set
Команда имеет несколько опций:
- ex seconds:заключнастраиватьСрок действия в секундах.
- px milliseconds:заключнастраиватьСрок действия в миллисекундах.
- nx: ключ долженне существует, может быть успешно установлен дляДобавить к.
-
xx:и
nx
Вместо этого ключ долженсуществует, может быть успешно установлен длявозобновить.
Кромеset
опции,Redis
также обеспечиваетsetex
иsetnx
Две команды:
setex key seconds value setnx key value
- setex: Установите значение ключа и укажите соответствующее значение этого ключа.Эффективное время.
127.0.0.1:6379> setex key1 5 value1
OK
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> get key1
(nil)
-
setnx: ключ долженне существует, настройка может быть выполнена успешно. Если ключ уже существует, вернуть
0
.
127.0.0.1:6379> set key2 value1
OK
127.0.0.1:6379> setnx key2 value2
(integer) 1
127.0.0.1:6379> get key2
"value1"
1.1.2. Получить значение
get key
Если вы хотите получитьключ не существует, затем вернутьсяnil
(нулевой).
127.0.0.1:6379> get not_exist_key
(nil)
1.1.3 Значения групповой настройки
mset key value [key value ...]
Проходит следующая операцияmset
команда одноразовой настройки4
Кусокпара ключ-значение:
127.0.0.1:6379> mset a 1 b 2 c 3 d 4
OK
1.1.4 Получение значений партиями
mget key [key ...]
Сделайте следующееМассовое приобретениеключa
,b
,c
,d
Значение:
127.0.0.1:6379> mget a b c d
1) "1"
2) "2"
3) "3"
4) "4"
Массовые операциикоманда, которая может эффективно улучшитьЭффективность разработки, если неmget
Такая команда для выполненияn
второсортныйget
командный процесс икропотливыйследующее:
n время получения = n время сети + n время команды
использоватьmget
После команды выполнитьn
второсортныйget
командный процесс икропотливыйследующее:
n время получения = 1 сетевое время + n время команды
Redis
может поддерживатьдесятки тысяч в секундуизоперации чтения и записи, но это относится кRedis
Сервервычислительная мощность, дляклиентНапример, команда кромекомандное времяосталосьсетевое время.
Предположениесетевое времяза1
миллисекунда, время команды0.1
миллисекунды (обработка в секунду1
подсчитано 10000 команд), затем выполнить1000
второсортныйget
команда и1
второсортныйmget
Различия между командами показаны в таблице:
действовать | время |
---|---|
1000 операций получения | 1000 * 1 + 1000 * 0.1 = 1100ms = 1.1s |
1 операция мгет | 1 * 1 + 1000 * 0.1 = 101ms = 0.101s |
1.1.5 Подсчет
incr key
incr
команда используется для выполненияоперация автоматического увеличения, возвращаемые результаты делятся на три случая:
- значение нецелое число,возвращениеОшибка.
- значениецелое число,возвращениеавтоматическое приращениерезультат после.
- Ключ не существует, судя по значению
0
автоматическое приращение, возвращаемый результат1
.
127.0.0.1:6379> exists key
(integer) 0
127.0.0.1:6379> incr key
(integer) 1
Кромеincr
Заказ,Redis
также обеспечиваетdecr
(Уменьшение),incrby
(автоматическое увеличение указанного числа),decrby
(Уменьшить указанное число),incrbyfloat
(самоувеличивающееся число с плавающей запятой) и другие командные операции:
decr key incrby key increment decrby key decrement incrbyfloat key increment
полноСистема храненияиЯзык программированиявнутреннее использованиеCAS
Реализация механизмафункция подсчета, будет определенноеCPU
накладные расходы. но вRedis
Этой проблемы вообще нетRedis
даоднопоточная архитектура, любая команда поступаетRedis
СерверобаПоследовательное исполнение.
1.2. Необычные команды
1.2.1 Добавление значений
append key value
append
кконец строкиДобавить значение.
127.0.0.1:6379> get key
"redis"
127.0.0.1:6379> append key world
(integer) 10
127.0.0.1:6379> get key
"redisworld"
1.2.2 Длина строки
strlen key
Например, текущее значениеredisworld
, поэтому возвращаемое значение равно10
:
127.0.0.1:6379> get key
"redisworld"
127.0.0.1:6379> strlen key
(integer) 10
1.2.3 Установить и вернуть исходное значение
getset key value
getset
иset
такой жеНастройки, но разница в том, что он также возвращаетисходное значение ключа,Например:
127.0.0.1:6379> getset hello world
(nil)
127.0.0.1:6379> getset hello redis
"world"
1.2.4 Установить символ в указанную позицию
setrange key offeset value
Следующая операция изменяет значение наpest
сталbest
:
127.0.0.1:6379> set redis pest
OK
127.0.0.1:6379> setrange redis 0 b
(integer) 4
127.0.0.1:6379> get redis
"best"
1.2.5 Получить частичную строку
getrange key start end
start
иend
соответственноНачинатьиЗаканчиватьизКомпенсировать,Компенсироватьот0
начать расчет, например, получить значениеbest
изпервые два символаКоманда выглядит следующим образом:
127.0.0.1:6379> getrange redis 0 1
"be"
наконец данонитьтип командывременная сложностьинструкция:
2. Внутреннее кодирование
нитьТипВнутреннее кодированиеимеют3
своего рода:
-
int:
8
байтыдлинное целое. -
embstr:меньше или равно
39
Строка байтов. -
raw:больше, чем
39
Строка байтов.
Redis
будет основываться на текущем значениитипидлинарешить, что использоватьРеализация внутреннего кодирования.
- Целочисленный тип
127.0.0.1:6379> set key 8653
OK
127.0.0.1:6379> object encoding key
"int"
- короткая строка
#小于等于39个字节的字符串:embstr
127.0.0.1:6379> set key "hello,world"
OK
127.0.0.1:6379> object encoding key
"embstr"
- длинная строка
#大于39个字节的字符串:raw
127.0.0.1:6379> set key "one string greater than 39 byte........."
OK
127.0.0.1:6379> object encoding key
"raw"
127.0.0.1:6379> strlen key
(integer) 40
3. Типичные сценарии использования
3.1. Функция кэширования
Ниже приведен более типичныйтайникиспользовать сценарии, гдеRedis
в видеслой кэша,MySQL
в видеуровень хранения, большая часть запрашиваемых данных поступает изRedis
получено в. так какRedis
при поддержкеВысокий параллелизмхарактеристики, поэтому кеш обычно может играть рольУскорить чтение и письмоиУменьшите давление на заднем концеэффект.
Псевдокод всей функции выглядит следующим образом:
public UserInfo getUserInfo(long id) {
String userRedisKey = "user:info:" + id;
String value = redis.get(userRedisKey);
UserInfo userInfo;
if (value != null) {
userInfo = deserialize(value);
} else {
userInfo = mysql.get(id); if (userInfo != null) {
redis.setex(userRedisKey, 3600, serialize(userInfo));
}
return userInfo;
}
}
3.2 Подсчет
Многие приложения используютRedis
в видесчитатьосновной инструмент, позволяющийбыстрый счет,кэш запросовфункция, в то время как данные могут бытьАсинхронная посадкак другомуисточник данных. Вообще говоря, система счисления воспроизведения видео должна использоватьRedis
в видеКоличество воспроизведений видеоБазовый компонент , каждый раз, когда пользователь воспроизводит видео, количество воспроизведений соответствующего видео автоматически увеличивается.1
.
public long incrVideoCounter (long id) {
String key = "video:playCount:" + id;
return redis.incr(key);
}
На самом деле настоящийсистема счетаЕсть много вопросов для рассмотрения:Античитерство,в соответствии сразные размерысчитать,сохранение данныхприбытьбазовый источник данныхЖдать.
3.3. Общий сеанс
Одинраспределенный Web
Сервис конвертирует пользовательскийSession
информация (например,Данные для входа пользователя)Сохранить каксоответствующийна сервере. Это создает проблему из-забалансировки нагрузкирассмотрение,Распределенный сервисдоступ пользователясбалансированныйна другой сервер, пользовательобновить визитможет найти потребностьперерегистрировать, эта проблема невыносима для пользователей.
Для решения этой проблемы можно использоватьRedis
пользователяSession
провестиЦентрализованное управление. В этом режиме до тех пор, пока гарантияRedis
даВысокая доступностьиРасширяемый, каждый раз, когда пользовательвозобновитьилиЗапросИнформация для входа непосредственно изRedis
Получено централизованно.
3.4 Ограничение скорости
По соображениям безопасности многие приложения будут запрашивать у пользователя ввод при каждом входе в систему.Мобильный проверочный код, чтобы определить, является ли это самим пользователем. но дляSMS-интерфейсне бытьчастые визиты,встречаограничениеПользователи получают каждую минутукод верификацииЧастота. Например, не более одной минуты5
раз, как показано на рисунке:
Эту функцию можно использоватьRedis
Для этого псевдокод выглядит следующим образом:
String phoneNum = "138xxxxxxxx";
String key = "shortMsg:limit:" + phoneNum;
// SET key value EX 60 NX
boolean isExists = redis.set(key, 1, "EX 60", "NX");
if (isExists != null || redis.incr(key) <= 5) {
// 通过
} else {
// 限速
}
Вышеупомянутое использоватьRedis
ДостигнутоФункция ограничения скорости,Напримернекоторые сайтыограничить одинIP
адрес не может быть вв течение секундыпосетить болееn
также можно использоватьпохожийидеи.
резюме
Эта статья кратко знакомитRedis
изстроковая структура данныхизосновные команды,Внутреннее кодированиеиСвязанные сценарии применения.
Ссылаться на
«Разработка и эксплуатация Redis»
Добро пожаловать в технический публичный аккаунт: Zero One Technology Stack
Эта учетная запись будет продолжать делиться сухими товарами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.