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. Одинарная нить
- 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, удалить все ценные элементы
- Значение счетчика ключа lrem: в соответствии со значением счетчика удалить все элементы с одинаковым значением из списка.
- 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, чтобы учиться и развиваться вместе.