Обучение Redis (1): Начало работы с Redis

Redis

1. Первое знакомство с Redis

  • Высокопроизводительный сервер Key-Value
  • Различные структуры данных
  • Богатые возможности
  • Распределенная поддержка высокой доступности

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

  • открытый источник
  • Система хранения на основе ключей и значений
  • Различные структуры данных
  • Высокая производительность и многофункциональность

2. Возможности Redis

  • высокоскоростной
  • Упорство
  • Различные структуры данных
  • Поддерживает несколько языков программирования
  • Многофункциональный
  • Простой
  • репликация master-slave
  • Высокая доступность, распределенная

3. Функции Redis — быстро

  • 10W OPS
  • Где существуют данные - память
  • На каком языке писать - язык C
  • Потоковая модель — однопоточная

4. Функция Redis — постоянство (без потери данных после сбоя питания)

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

5. Функции Redis — несколько структур данных

  • String/Blobs/Bitmaps
  • Hash Tables(Object)
  • Linked Lists
  • Sets
  • Sorted Sets

6. Функции Redis — многофункциональные

  • опубликовать подписаться
  • Lua-скрипт
  • дела
  • pipeline

7. Типичные сценарии использования Redis

  • кеш-система
  • прилавок
  • система очереди сообщений
  • Таблица лидеров
  • Социальная сеть
  • система реального времени

8. Установка Redis, запуск

1. Описание исполняемого файла Redis

  • redis-сервер -> сервер Redis
  • redis-cli -> Клиент командной строки Redis
  • redis-benchmark -> Инструмент тестирования производительности Redis
  • redis-check-aof -> инструмент для восстановления файлов AOF
  • redis-check-dump -> инструмент проверки файлов RDB
  • redis-sentinel -> сервер Sentinel (после 2.8)

2. Описание исполняемого файла Redis

  • Три способа начать
    • минимальный запуск
    • Динамический запуск параметра
    • начало профиля
  • Сравнение трех методов запуска
    • Начало настройки выбора производственной среды
    • Файлы конфигурации с несколькими экземплярами для одной машины можно отличить по портам.

3. Проверка

  • ps -ef | grep redis
  • netstat -antpl | grep redis
  • redis -cli -h ip -p port -ping

9. Общая конфигурация Redis

  • демонизация -> это демонизация
  • порт -> номер внешнего порта Redis
  • logfile -> системный журнал Redis
  • dir -> рабочий каталог Redis

10. Начните с файла конфигурации

[root@localhost redis-4.0.5]# mkdir config
[root@localhost redis-4.0.5]# cp redis.conf config/
  • Удалите все комментарии и пробелы и перенаправьте конфигурацию.
[root@localhost config]# cat redis.conf | grep -v "#" | grep -v "^$" > redis-6382.conf
  • Входить в файл конфигурации, удалять текущую конфигурацию не требуется, оставляя базовую конфигурацию
[root@localhost config]# vi redis-6382.conf

port 6382
dir "/usr/local/redis/data"
logfile "6382.log"
daemonize yes
  • Запустите клиент и просмотрите логи
[root@localhost redis]# redis-server config/redis-6382.conf

[root@localhost redis]# ps -ef | grep redis-server | grep 6382
root       8447      1  0 09:49 ?        00:00:00 redis-server *:6382

[root@localhost redis]# cd data
[root@localhost data]# ll
总用量 4
-rw-r--r--. 1 root root 1354 12月 20 09:49 6382.log

2. Понимание и использование API

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

  • keys: пройтись по всем клавишам.
    • Обычно не используется в производственной среде.
    • Как использовать ключи: Горячие резервные ведомые узлы. сканирование.
  • dbsize: вычислить общее количество ключей.
  • существует ключ: проверьте, существует ли ключ.
  • del key[key...]: удалить указанный ключ - значение
  • истекает ключ секунд: срок действия ключа истекает через секунды секунд.
    • ключ ttl: просмотр оставшегося срока действия ключа.
    • постоянный ключ: удалить время истечения срока действия ключа.
  • type key: возвращает тип ключа.
Заказ временная сложность
keys O(n)
dbsize O(1)
del O(1)
exists O(1)
expire O(1)
type O(1)

2. Структура данных и внутреннее кодирование

数据结构和内部编码

  • Существуют разные методы реализации структур данных: память дороже, и в разных случаях могут использоваться разные внутренние кодировки для достижения эффекта времени-в-пространстве и пространства-время.
  • На самом деле в исходном коде redis есть такой объект, как redisObject, или структура, которая имеет множество свойств:
    • тип данных (тип)
    • кодирование
    • указатель данных (указатель)
    • виртуальная память (вм)
    • Дополнительная информация
  • Пользователям не нужно знать внутреннюю кодировку, которая на самом деле является практикой интерфейсно-ориентированного программирования.

3. Одинарная нить

单线程1

  • Redis будет выполнять только одну команду за раз.
  • Почему один поток такой быстрый?
    • чистая память
    • неблокирующий ввод-вывод
    • Избегайте переключения потоков и статического потребления
  • На что следует обратить внимание в одиночном потоке?
    • Выполнять только одну команду за раз
    • Отклонять длинные (медленные) команды: keys, flush, flushdb, slow lua script, mutil/exec, работать с большими значениями (сбор)
    • На самом деле это не один поток: дескриптор файла fysnc, дескриптор файла close

4. Строка

1. Структура и команды

  • используемые сцены:
    • тайник
    • прилавок
    • Распределенная блокировка
  • get set del
    • получить ключ: получить значение, соответствующее ключу
    • установить ключевое значение: установить ключевое значение
    • ключ del: удалить ключ - значение
  • incr decr incrby decrby
    • ключ incr: ключ увеличивается на 1, если ключ не существует, get(key)=1 после увеличения
    • Ключ Decr: ключ уменьшается на 1. Если ключ не существует, get(key)=-1 после увеличения
    • incrby key k: ключ увеличивается на k, если ключ не существует, get(key)=k после увеличения
    • decrby key k: ключ уменьшается на k, если ключ не существует, get(key)=-k после увеличения
  • set setnx set xx
    • установить значение ключа: установить, существует ли ключ или нет
    • значение ключа setnx: ключ не существует, только установлен
    • установить значение ключа xx: только если ключ существует
  • mget mset
    • mget key1 key2 key3...: получить ключи пакетами, атомарная операция
    • mset key1 value1 key2 value2 key3 value3: пакетный набор ключей-значений

2. Быстрый бой

  • Реализовать следующие функции: фиксировать количество посещений персональной страницы каждого пользователя на сайте.
    • incr userid:pageview (один поток: нет конкуренции)
  • Реализовать следующие функции: Кэшировать основную информацию о видео (источник данных в MySQL) Псевдокод
public VideoInfo get(long id) {
    String redisKey = redisPrefix + id;
    VideoInfo viderInfo = redis.get(redisKey);
    if (videoInfo == null) {
        videoInfo = mysql.get(id);
        if (videoInfo != null) {
            // 序列化
            redis.set(redisKey, serialize(videoInfo));
        }
    }
    return videoInfo;
}
  • Реализуйте следующие функции: Распределенный генератор идентификаторов
    • incr id (атомарная операция)

3. Проверьте наличие упущений

  • getset append strlen
    • getset key newvalue: установить новое значение ключа и вернуть старое значение
    • добавить значение ключа: добавить значение к старому значению
    • ключ strlen: возвращает длину строки
  • incrbyfloat getrange setrange
    • ключ incrybyfloat 3.5: увеличьте значение, соответствующее ключу 3.5
    • getrange: Получить все значения указанного индекса в строке
    • setrange: установить все соответствующие значения указанного индекса
Заказ имея в виду временная сложность
set key value установить ключ-значение O(1)
get key value получить ключ-значение O(1)
del key value удалить ключ-значение O(1)
setnx set xx Установить ключ - значение в зависимости от того, существует ли ключ O(1)
incr decr считать O(1)
mget mset Ключ пакетной операции — значение O(n)

5. Хэш

1. Структура и команды

  • Все хешированные команды начинаются с H
  • hget hset hdel
    • Поле ключа hget: получить значение поля, соответствующего ключу хеша.
    • значение поля ключа hget: установить значение поля, соответствующего хеш-ключу
    • поле ключа hget: удалить значение поля, соответствующего хеш-ключу
  • hexists hlen
    • ключевое поле hexists: определите, есть ли поле хеш-ключа
    • hlen key: получить количество полей хеш-ключа
  • hmget hmset
    • hmget key field1 field2 ... fieldN: Получить значения, соответствующие пакету полей хеш-ключа в пакетах
    • hmset key field1 value1 field2 value2 ... fieldN valueN: пакетный набор значений, соответствующих пакету полей хеш-ключа
  • hgetall hvals hkeys
    • Ключ hgetall: возвращает хеш-ключ, соответствующий всем полям и значениям.
    • Ключ hvals: возвращает значение всех полей, соответствующих хеш-ключу.
    • Ключ hkeys: возвращает хеш-ключ, соответствующий всем полям.

2. Быстрый бой

  • Реализовать следующие функции: фиксировать количество посещений персональной страницы каждого пользователя на сайте.
    • hincrby user:1:info pageview count
  • Реализовать следующие функции: Кэшировать основную информацию о видео (источник данных в MySQL) Псевдокод
public VideoInfo get(long id) {
    String redisKey = redisPrefix + id;
    Map<String, String> hashMap = redis.hgetAll(redisKey)
    VideoInfo viderInfo = transferMapToVideo(hashMap);
    if (videoInfo == null) {
        videoInfo = mysql.get(id);
        if (videoInfo != null) {
            redis.hmset(redisKey, transferVideoToMap(videoInfo));
        }
    }
    return videoInfo;
}

3. Проверьте наличие упущений

  • string vs hash
    • Подобный API
string hash
get hget
set setnx hset hsetnx
del hdel
incr incyby decr decrby hincrby
mset hmset
mget hmget
  • Как обновить свойства пользователя
  • строковая реализация
    • key : user:1
    • value : (serializable:json,xml,protobuf) {"id":1, "name":"ronaldo", "age":40, "pageView":5000000}
  • строковая реализация
    • key : user:1:name user:1:age user:1:pageView
    • value : world 40 500000
  • реализация хеширования
    • key : hset user:1:info age 41
    • value :
Заказ преимущество недостаток
string v1 Простое программирование, возможная экономия памяти Накладные расходы на сериализацию, установка свойств неверна для всех данных
string v2 Интуитивно понятный и может быть частично обновлен Большой объем памяти и разрозненные клавиши
hash Интуитивно понятный, компактный, может быть частично обновлен Программирование немного сложное, ttl не легко контролировать
  • hsetnx hincrby hincrbyfloat
    • значение поля ключа hsetnx: установите значение поля, соответствующего хеш-ключу (если поле уже существует, произойдет сбой)
    • поле ключа hincrby intCounter: значение поля, соответствующего хеш-ключу, увеличивается на intCounter
    • ключевое поле hincrbyfloat floatCounter: версия hincrby с плавающей запятой
Заказ временная сложность
hget hset hdel O(1)
hexists O(1)
hincrby O(1)
hgetall hvals hkeys O(1)
hmget hmset O(n)

6. Список

1. Структура и команды

  • Функции
    • аккуратный
    • можно повторить
    • Вставьте и выдвиньте с левой и правой стороны
  • API связанного списка начинается с L
  • rpush
    • rpush key value1 value2 ... valueN: Вставить значения (1-N) с правого конца списка
  • lpush
    • lpush key value1 value2 ... valueN: вставить значения (1-N) с левого конца списка
  • linsert
    • linsert key before|agter value newValue: Вставить новое значение перед|после значения, указанного в списке
  • lpop
    • Клавиша lpop: извлекает элемент из левой части списка.
  • rpop
    • Клавиша rpop: извлекает элемент из правой части списка.
  • lrem
    • Значение счетчика ключа lrem: в соответствии со значением счетчика удалить все элементы с одинаковым значением из списка.
      • count>0, слева направо удалить не более count элементов с одинаковым значением
      • count
      • count=0, удалить все ценные элементы
  • ltrim
    • ltrim key start end: обрезать список по диапазону индексов
  • lrange
    • lrange key start end (включая end): получить все элементы в указанном индексном диапазоне списка
  • lindex
    • индекс ключа lindex: получить элемент указанного индекса в списке
  • llen
    • ключ llen: получить длину списка
  • lset
    • lset key index newValue: установите для указанного значения индекса списка значение newValue.

2. Быстрый бой

  • Weibo – Хронология
    • Люди, на которых вы подписаны, обновляют Weibo, LPUSH

3. Проверьте наличие упущений

  • blpop brpop
    • Тайм-аут ключа blpop: блокирующая версия lpop, тайм-аут означает тайм-аут блокировки, тайм-аут = 0 означает, что никогда не блокируется
    • Тайм-аут ключа brpop: блокирующая версия rpop, тайм-аут означает тайм-аут блокировки, тайм-аут = 0 означает, что никогда не блокируется
  • TIPS
    • LPUSH + LPOP = Stack
    • LPUSH + RPOP = Queue
    • LPUSH + LTRIM = Capped Collection
    • LPUSH + BRPOP = Message Queue

7. Коллекция

1. Структура и команды

  • Функции
    • беспорядок
    • нет повторения
    • Межколлекторные операции
  • Все API начинаются с S
  • sadd srem
    • ключевой элемент sadd: добавить элемент в заданный ключ (если элемент уже существует, добавление не удастся)
    • ключевой элемент srem: удалить элемент в заданном ключе
  • scard sismember srandmember smembers
    • ключ scard: подсчитать количество элементов в наборе
    • ключевой элемент sismember: определяет, находится ли элемент в коллекции
    • srandmember key count: случайным образом брать количество элементов из коллекции
    • Ключ smembers: удалить все элементы в элементе
  • sdiff sinter sunion
    • sdiff key1 key2: установить разницу
    • спекать key1 key2: установить пересечение
    • sunion key1 key2: установить союз
    • sdiff|sinter|sunion + store destkey: сохраните результаты разности, пересечения и объединения в destkey

2. Быстрый бой

  • система лотереи
  • Нравится, нравится, не нравится
  • теги
  • Общая забота

3. Проверьте наличие упущений

  • СОВЕТЫ:
    • SADD = Tagging
    • SPOP/SRANDMEMBER = Random item
    • SADD + SINTER = Social Graph

8. Отсортированные наборы

1. Структура и команды

  • Все API начинаются с Z
  • zadd
    • элемент ключевой оценки zadd (может быть несколько пар): добавить оценку и элемент
  • zrem
    • ключевой элемент zrem (может быть несколько пар): удалить элемент
  • zscore
    • Ключевой элемент zscore: возвращает оценку элемента
  • zincrby
    • Элемент indexrby increScore: увеличение или уменьшение оценки элемента
  • zcard
    • ключ zcard: возвращает общее количество элементов
  • zrange
    • zrange key start end [WITHSCORES]: возвращает элементы в порядке возрастания в пределах указанного диапазона индексов [пунктов]
  • zrangebyscore
    • Ключ zrangebyscore minScore maxScore [WITHSCORES]: возвращает элементы в порядке возрастания в пределах указанного диапазона оценок [значение оценки]
  • zcount
    • Ключ zcount minScore maxScore: возвращает число в пределах указанного диапазона баллов в отсортированном наборе.
  • zremrangebyrank
    • Ключ zremrangebyrank start end: удалить восходящие элементы в пределах указанного ранга
  • zremrangebyscore
    • Ключ zremrangebyscore minScore maxScore: удалить элементы по возрастанию в пределах указанной оценки

2. Быстрый бой

  • Таблица лидеров

3. Проверьте наличие упущений

  • zrevrank
  • zrevrange
  • zvevrangebyscore
  • zinterstore
  • zunionstore

3. Клиент Redis

1. Java-клиент: Jedis

// 生成一个Jedis对象,这个对象负责和指定Redis节点进行通信。
Jedis jedis = new Jedis("127.0.0.1", 6379);
// jedis执行set操作
jedis.set("hello", "world");
// jedis执行get操作
String value = jedis.get("hello");
  • Jedis(String host, int port, int connectionTimeout, int soTimeout)
    • host: IP-адрес машины, на которой находится узел Redis.
    • порт: порт узла Redis
    • connectionTimeout: время ожидания подключения клиента
    • soTimeout: Тайм-аут чтения и записи клиента
  • джедаи прямое соединение
    • Создать объект джедая
    • джедаи выполнить команду
    • вернуть результат выполнения
    • тесная связь джедая
  • пул соединений джедаев
    • Занять объект джедая из пула ресурсов
    • джедаи выполнить команду
    • вернуть результат выполнения
    • Верните объект jedis в пул соединений

4. Некоторые другие возможности Redis

1. Медленный запрос

生命周期

  • Медленные запросы происходят на этапе 3.
  • Тайм-ауты клиента не обязательно являются медленными запросами, но медленные запросы являются возможным фактором тайм-аутов клиента.

1. Две конфигурации — slowlog-max-len: какова длина нашей очереди медленных запросов

慢查询队列

  • первый в очереди
  • Фиксированная длина
  • хранится в памяти

2. Две конфигурации — slowlog-log-slower-than: когда время запроса меньше, чем мы думаем, что это медленный запрос

  • Порог медленного запроса (единица измерения: микросекунды)
  • slowlog-log-slower-than=0, логировать все команды
  • slowlog-log-slower-than

3. Метод конфигурации

  • По умолчанию
    • config get slowlog-max-len = 128
    • config get slowlog-log-slower-than = 10000
  • Измените файл конфигурации и перезапустите
  • Динамическая конфигурация

4. Команда медленного запроса

  • slowlog get [n] : получить очередь медленных запросов
  • slowlog len : получить длину очереди медленных запросов.
  • slowlog reset : очистить очередь медленных запросов

5. Опыт эксплуатации и обслуживания

  • Не следует устанавливать слишком маленькое значение slowlog-max-len, обычно около 1000.
  • Не устанавливайте slowlog-log-slower-than слишком большим, значение по умолчанию — 10 мс, обычно устанавливается на 1 мс.
  • Понимание жизненного цикла команды.
  • Периодически сохраняются медленные запросы.

2. pipeline

  • 1 время = 1 сетевое время + 1 командное время
  • n время = n время сети + n время команды

1. Что такое конвейер

  • Упаковывайте пакет команд в пакеты, выполняйте пакетные вычисления на сервере, а затем возвращайте нам результаты по порядку.
  • 1 конвейер (n команд) = 1 сетевое время + n командное время
  • Две точки внимания
    • Командное время Redis находится на уровне микросекунд.
    • Количество конвейеров, которые необходимо контролировать (сеть) каждый раз.

2. реализация конвейера-джедаев

public void PipelineTest() {
    Jedis jedis = new Jedis("192.168.242.129", 6379);
    for (int i = 0; i < 100; i++) {
        Pipeline pipeline = jedis.pipelined();
        for (int j = i * 100; j < (i + 1) * 100; j++) {
            pipeline.hset("hashkey:" + j, "field" + j, "value" + j);
        }
        pipeline.syncAndReturnAll();
    }
}

3. Работать с родным M?

  • M операций являются атомарными операциями
  • Pipeline не является атомарной операцией

4. Рекомендации по применению

  • Обратите внимание, сколько данных несет каждый конвейер.
  • Конвейер может одновременно работать только с одним узлом Redis.
  • Разница между операцией M и Pipeline.

3. Опубликовать и подписаться

1. Роль

  • издатель
  • подписчик
  • канал

发布模型

2. API

  • опубликовать (команда публикации)
    • publish channel message
  • подписываться
    • подписаться [канал] #один или несколько
  • отписаться (отписаться)
    • отписаться [канал] #один или несколько

3. Очередь сообщений

  • Особенность публикации-подписки заключается в том, что после публикации сообщения все остальные подписчики могут получить это сообщение.
  • Очередь сообщений — это своего рода процесс захвата: издатель публикует сообщение, и только один подписчик получает его. (redis не предоставляет эту функцию)

4. Публикация и подписка

  • Роли в модели публикации-подписки
  • Важный API

4. растровое изображение

127.0.0.1:6379> set hello big
OK
127.0.0.1:6379> getbit hello 0
(integer) 0
127.0.0.1:6379> getbit hello 1
(integer) 1
  • Для Redis я могу напрямую манипулировать битами.

1. Связанные API

  • setbit
    • значение смещения ключа setbit: укажите значение настройки индекса для растрового изображения.
127.0.0.1:6379> setbit hello 7 1
(integer) 0
127.0.0.1:6379> get hello
"cig"
  • getbit
    • смещение ключа getbit: получить значение указанного смещения
  • bitcount
    • ключ bitcount [начало-конец]: получить количество битов в указанном диапазоне растрового изображения (от начала до конца, в байтах, если не указано, получить все) с битовым значением 1
  • bitop
    • bitop op ключ destkey [клавиша...]: выполнить несколько операций Bitmap и (пересечение), или (объединение), не (не), xor (исключающее или) и сохранить результат в ключе назначения
  • bitpos
    • ключ bitpos targetBit [начало] [конец]: вычислить указанный диапазон растрового изображения (от начала до конца, в байтах, если не указано, получить все) позицию, в которой значение, соответствующее первому смещению, равно targetBit

2. Уникальная пользовательская статистика

  • Использование набора и растрового изображения
  • 100 миллионов пользователей, 50 миллионов уникальных посещений в день
тип данных место на идентификатор пользователя Количество пользователей для хранения Общий объем памяти
set 32 бита (целое число) 50000000 200MB
bitmap 1 человек 100000000 12.5MB

3. Опыт

  • тип = строка, макс. 512M
  • Обратите внимание на смещение при установке бита, это может занять много времени
  • Растровые изображения не совсем хороши

5. HyperLogLog

1. На основе алгоритма HyperLogLog: полная независимая количественная статистика в очень небольшом пространстве.

  • Суть по-прежнему строка

2. Три команды

  • ключевой элемент pfadd [элемент...]: добавить элемент в hyperLogLog
  • ключ pfcount [ключ...]: подсчитывает независимые итоги для гиперлоглога.
  • pfmerge destkey sourcekey [sourcekey...]: объединить несколько гиперлоглогов

3. Опыт

  • Он терпим к ошибкам? (Коэффициент ошибок: 0,81%)
  • Вам нужен единый блок данных?

6. GEO

1. GEO (геоинформационное позиционирование): сохранение долготы и широты, расчет расстояния между двумя точками, расчет дальности и т. д.

2. Сценарии использования

  • встряхнуть
  • рестораны, гостиницы вокруг

3. API

  • geoadd
    • геоключ долгота широта член [долгота широта член ...]: добавить информацию о географическом местоположении
  • geopos
    • ключевой член geopos [член ...]: получить информацию о географическом местоположении
  • geodisk
    • ключ геодиска member1 member2 [единица измерения]: получить расстояние между двумя географическими точками (единица измерения: м (метр...)
  • georadius

4. Сопутствующие инструкции

  • since 3.2+
  • type geoKey = zset

В конце концов

Вы можете подписаться на мою общедоступную учетную запись WeChat, чтобы учиться и развиваться вместе.

Категории