Углубленный анализ серии Redis (5) — Строка структуры данных Redis

Redis задняя часть Архитектура сервер

предисловие

Тип строкидаRedisСамая простая структура данных.Тип строкиЗначение на самом деле может бытьнить(Простойисложныйстрока, напримерJSON,XML),номер(целое число, число с плавающей запятой) или дажебинарный(картинка, аудио, видео), но максимальное значение не может превышать512MB.

Другие статьи

текст

1. Связанные команды

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

1.1.1. Установка значений

set key value [ex seconds] [px milliseconds] [nx|xx]

setКоманда имеет несколько опций:

  1. ex seconds:заключнастраиватьСрок действия в секундах.
  2. px milliseconds:заключнастраиватьСрок действия в миллисекундах.
  3. nx: ключ долженне существует, может быть успешно установлен дляДобавить к.
  4. xxnxВместо этого ключ долженсуществует, может быть успешно установлен длявозобновить.

Кроме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

零壹技术栈

Эта учетная запись будет продолжать делиться сухими товарами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.