Потребовалось около недели, чтобы всесторонне освоить знания о Redis и записать конспект исследования
Оригинальный текст можно найти в моем техническом блоге.Стек томатной технологии
Первое знакомство с Redis
руководство
Хвала редису
- Высокопроизводительный сервер ключей-значений
- Различные структуры данных
- Богатые возможности
- Высокодоступная распределенная поддержка
Первое знакомство с Redis
определение
Redis — это сетевая база данных с открытым исходным кодом, хранящаяся в памяти, с необязательным хранилищем ключей и значений, написанная на ANSI C.
характеристика
- открытый источник
- Различные структуры данных
- Система хранения на основе ключей и значений
- Высокопроизводительный, функциональный сервис
Прошлое и настоящее Redis
кто использует редис
- github
- Вейбо
- Stack Overflow
- Алибаба
- Байду
- Мейтуан
- соху
- ......
каталог функций Redis
- высокоскоростной
- Упорство
- Различные структуры данных
- Поддерживает несколько языков программирования
- Многофункциональный
- Просто: код короткий и лаконичный
- репликация master-slave
- Высокая доступность и распространение
Особенность 1: Быстро
10w QPS
причина
- данные в памяти
- написано на языке с
- запись в один поток
Особенность 2: Стойкость
- Все данные Redis хранятся в памяти, а обновления данных будут асинхронно сохраняться на диск.
Функция 3: Структуры данных
Функция 4: многоязычный клиент
- java
- php
- python
- ruby
- lua
- nodejs
Особенность 5: Многофункциональный
- опубликовать подписаться
- луа-скрипт
- дела
- pipeline
Особенность 6: Простой
- 23 000 строк кода для реализации основных функций
- Не зависит от внешних библиотек
- однопоточная модель
Функция 7: Копировать
Функция 8: Высокая доступность
- redis-sentinel поддерживает высокую доступность
- Распределенный redis-кластер поддерживает распределенные
Типичные сценарии использования Redis
- кеш-система
- прилавок
- система очереди сообщений
- Таблица лидеров
- Социальная сеть
- система реального времени
Три способа запустить Redis
установка Redis (mac и linux)
$ wget http://download.redis.io/releases/redis-4.0.8.tar.gz
$ tar xzf redis-4.0.8.tar.gz
$ cd redis-4.0.8
$ make
описание исполняемого файла redis
имя команды | Описание команды |
---|---|
redis-server | сервер Redis |
redis-cli | клиент командной строки redis |
redis-benchmark | средство проверки производительности Redis |
redis-check-aof | инструмент для восстановления файлов aof |
redis-check-dump | Инструмент проверки файлов RDB |
redis-sentinel | дозорный сервер (после 2.8) |
Три способа начать рейды
- Самый простой запуск (начать с файла конфигурации по умолчанию)
redis-server
проверять
ps aux | grep redis
redis-cli -h 127.0.0.1 -p 6379 ping
- Запуск файла конфигурации (запишите параметры, которые необходимо настроить в файл)
redis-server configPath
- Динамический запуск параметра
redis-server --port 6380
Сравнение трех методов запуска
- Начало настройки выбора производственной среды
- Файлы конфигурации с несколькими экземплярами для одной машины можно отличить по портам.
подключение клиента Redis
redis-cli -h 127.0.0.1 -p 6379
возвращаемое значение клиента Redis
возвращаемое значение | Описание возвращаемого значения |
---|---|
Статус ответа | ping -> pong |
ответ об ошибке | hget hello field -> (error) ERR wrong number of arguments for 'hget' command |
Целочисленный ответ | incr hello -> (integer) 1 |
строка ответа | get hello -> "1" |
Многострочный строковый ответ | mget hello foo -> 1) "1" 2) (nil) |
Общая конфигурация Redis
имя конфигурации | инструкция |
---|---|
daemonize | Это демон (нет/да) |
port | номер внешнего порта redis |
logfile | системный журнал редис |
dir | рабочий каталог Redis |
Установка и запуск Redis (метод файла конфигурации)
Метод конфигурации
- конфигурационный файл
vim redis-6382.conf
port 6382
daemonize yes
logfile "6382.log"
dir ./workdata/
- запускать
redis-server redis-6382.conf
- экзамен
ps -aux | grep -v redis-server | grep 6382
- журнальный файл
vim workdata/6382.log
Понимание и использование API
Общее командование
Заказ | инструкция | временная сложность |
---|---|---|
keys [pattern] | перебирать все ключи | O(N) |
dbsize | перебирать все ключи | O(1) |
exists | Проверить, существует ли ключ | O(1) |
del key | Удалить указанную пару "ключ-значение" | O(1) |
expire key seconds | срок действия ключа истекает через секунды секунд | O(1) |
ttl key | Проверить оставшееся время действия ключа | O(1) |
persist key | Удалить срок действия ключа | O(1) |
type key | тип ключа возврата | O(1) |
УведомлениеКоманда keys обычно больше не используется в производственных средах.
**Демо**
➜ redis-4.0.8 redis-cli -h 127.0.0.1 -p 6382
127.0.0.1:6382> set hello word
OK
127.0.0.1:6382> set php good
OK
127.0.0.1:6382> set java best
OK
127.0.0.1:6382> keys *
1) "java"
2) "hello"
3) "php"
127.0.0.1:6382> dbsize
(integer) 3
127.0.0.1:6382> exists php
(integer) 1
127.0.0.1:6382> del php java
(integer) 2
127.0.0.1:6382> keys *
1) "hello"
127.0.0.1:6382> expire hello 20
(integer) 1
127.0.0.1:6382> ttl hello
(integer) 16
127.0.0.1:6382> ttl hello
(integer) 12
127.0.0.1:6382> persist hello
(integer) 1
127.0.0.1:6382> ttl hello
(integer) -1
127.0.0.1:6382> type hello
string
Структуры данных и внутреннее кодирование
значок
reidsObject
один поток
определение
Когда один поток выполняет программу, пути программы, которые он использует, располагаются в последовательном порядке: первый должен быть хорошо обработан, а второй будет выполнен.
Почему один поток такой быстрый
- чистая память
- неблокирующий ввод-вывод
- Избегайте переключения потоков и потребления гонки
На что обратить внимание при использовании одиночного потока
- Одновременно может быть запущена только одна команда
- отклонять длинные (медленные) команды
- keys
- flushall
- flushdb
- slow lua script
- mutil/exec
- operate big value(collection)
string
структура
key | value |
---|---|
hello | world |
counter | 1 |
bits | 101111101110 |
Могут быть строками (json), числами и двоичными файлами.
сцены, которые будут использоваться
- тайник
- прилавок
- Распределенная блокировка
API
Заказ | инструкция | временная сложность |
---|---|---|
get key | Получить значение, соответствующее ключу | O(1) |
set key value | установить значение ключа | O(1) |
del key | удалить ключ-значение | O(1) |
incr | Ключ увеличивается на 1. Если ключ не существует, get(key) = 1 после увеличения | O(1) |
decr | Ключ уменьшается на 1. Если ключ не существует, get(key) = -1 после увеличения | O(1) |
incrby key k | Ключ увеличивается на k. Если ключ не существует, get(key) = k после увеличения | O(1) |
decr key k | Ключ уменьшается на k, если ключ не существует, get(key) = -k после увеличения | O(1) |
set key value | существует он или нет | O(1) |
setnx key value | Ключ не существует, только установлен | O(1) |
set key value xx | Ключ существует, только установлен | O(1) |
mget key1 key2 key3 | Получить ключи пакетами, атомарная операция | O(N) |
mset key1 value1 key2 value2 | Набор пар "ключ-значение" | O(1) |
getset key newvalue | установить новое значение ключа и вернуть старое значение | O(1) |
append key value | добавить значение к старому значению | O(1) |
strlen key | Возвращает длину строки (обратите внимание на китайский, следующий китайский в utf8 занимает 3 символа) | O(1) |
incrbyfloat key 3.5 | Увеличьте значение, соответствующее ключу, на 3,5 | O(1) |
getrange key start end | Получить все значения указанного индекса в строке | O(1) |
setrange key index value | Установить все соответствующие значения указанного индекса | O(1) |
Упражнение
127.0.0.1:6382> set hello "world"
OK
127.0.0.1:6382> get hell
(nil)
127.0.0.1:6382> get hello
"world"
127.0.0.1:6382> del hello
(integer) 1
127.0.0.1:6382> get hello
(nil)
127.0.0.1:6382> get counter
(nil)
127.0.0.1:6382> incr counter
(integer) 1
127.0.0.1:6382> get counter
"1"
127.0.0.1:6382> incrby counter 99
(integer) 100
127.0.0.1:6382> get counter
"100"
127.0.0.1:6382> decr counter
(integer) 99
127.0.0.1:6382> get counter
"99"
127.0.0.1:6382> decrby counter 100
(integer) -1
127.0.0.1:6382> get counter
"-1"
127.0.0.1:6382> exists php
(integer) 0
127.0.0.1:6382> set php good
OK
127.0.0.1:6382> setnx php bad
(integer) 0
127.0.0.1:6382> set php best xx
OK
127.0.0.1:6382> get php
"best"
127.0.0.1:6382> exists java
(integer) 0
127.0.0.1:6382> setnx java best
(integer) 1
127.0.0.1:6382> set java easy xx
OK
127.0.0.1:6382> get java
"easy"
127.0.0.1:6382> set hello world
OK
127.0.0.1:6382> getset hello php
"world"
127.0.0.1:6382> get hello
"php"
127.0.0.1:6382> append hell ",php"
(integer) 4
127.0.0.1:6382> get hello
"php"
127.0.0.1:6382> append hello ",php"
(integer) 7
127.0.0.1:6382> get hello
"php,php"
127.0.0.1:6382> strlen hello
(integer) 7
127.0.0.1:6382> set hello "吴军旗"
OK
127.0.0.1:6382> strlen hello
(integer) 9
n получить операции
**1 операция получения**
настоящий бой
- Запишите количество посещений персональной домашней страницы каждого пользователя веб-сайта.
incr userid: pageview (**主要的是:单线程,所以无竞争)**)
- Основная информация о кэшированном видео (источник данных в mysql) псевдокод
- Распределенный генератор идентификаторов (преимущество одного потока)
incr id
hash
ключевая структура хэша
Функции
- mapmap
- small redis
- Поле не может быть одинаковым, значение может быть одинаковым
API
Заказ | инструкция | временная сложность |
---|---|---|
hget key field | Получить значение поля, соответствующего хеш-ключу | O(1) |
hset key field value | Установите значение поля, соответствующего ключу has | O(1) |
hexists key field | Определить, имеет ли хеш-ключ поле | O(1) |
hlen key | Получить количество ключевых полей хэша | O(1) |
hmget key field1 field2...fieldN | Получить значения, соответствующие пакету полей хэш-ключа в пакетах | O(N) |
hset key field1 value1 field2 value2...fieldN valueN | Пакетный набор значений полей для хеш-ключей | O(1) |
hgetall key | Возвращает хеш-ключ, соответствующий всем полям и значениям | O(N) |
hvals key | Возвращает значение всех полей, соответствующих хеш-ключу | O(N) |
hkeys key | Возвращает хэш-ключ, соответствующий всем полям | O(N) |
hsetnx key field value | Установите значение поля, соответствующего ключу has (если поле уже существует, произойдет сбой) | O(1) |
hincrby key field intCounter | Значение поля, соответствующего хеш-ключу, увеличивается на intCounter | O(1) |
hincrbyfloat key field floatCounter | версия с плавающей запятой | O(1) |
УведомлениеИспользуйте hgetall с осторожностью (помните об одном потоке)
Упражнение
127.0.0.1:6382> hset user1 age 26
(integer) 1
127.0.0.1:6382> hset user1 name wujunqi
(integer) 1
127.0.0.1:6382> hget all user1
(nil)
127.0.0.1:6382> hgetall user1
1) "age"
2) "26"
3) "name"
4) "wujunqi"
127.0.0.1:6382> hdel user1 age
(integer) 1
127.0.0.1:6382> hgetall user1
1) "name"
2) "wujunqi"
127.0.0.1:6382> hget user1 name
"wujunqi"
127.0.0.1:6382> hexists user1 name
(integer) 1
127.0.0.1:6382> hlen user1
(integer) 1
127.0.0.1:6382> hmset user2 name xiaofang age 26
OK
127.0.0.1:6382> hmget user2 name age
1) "xiaofang"
2) "26"
127.0.0.1:6382> hgetall user2
1) "name"
2) "xiaofang"
3) "age"
4) "26"
127.0.0.1:6382> hvals user2
1) "xiaofang"
2) "26"
127.0.0.1:6382> hkeys user2
1) "name"
2) "age"
127.0.0.1:6382> hincrby user age 2
(integer) 2
127.0.0.1:6382> hgetall user2
1) "name"
2) "xiaofang"
3) "age"
4) "26"
127.0.0.1:6382> hincrby user2 age 2
(integer) 28
127.0.0.1:6382> hgetall user2
1) "name"
2) "xiaofang"
3) "age"
4) "28"
127.0.0.1:6382> hincrbyfloat user2 age 2.0
"30"
127.0.0.1:6382> hincrbyfloat user2 age 2.5
"32.5"
127.0.0.1:6382> hgetall user2
1) "name"
2) "xiaofang"
3) "age"
4) "32.5"
list
структура списка
Функции
- аккуратный
- можно повторить
- Вставьте и выдвиньте с левой и правой стороны
API
Упражнение
127.0.0.1:6382> rpush list1 a b c d
(integer) 4
127.0.0.1:6382> lpush list1 e f g h i
(integer) 9
127.0.0.1:6382> lrange list1 0 -1
1) "i"
2) "h"
3) "g"
4) "f"
5) "e"
6) "a"
7) "b"
8) "c"
9) "d"
127.0.0.1:6382> linsert list1 before i wu
(integer) 10
127.0.0.1:6382> lrange list1 0 -1
1) "wu"
2) "i"
3) "h"
4) "g"
5) "f"
6) "e"
7) "a"
8) "b"
9) "c"
10) "d"
127.0.0.1:6382> linsert list1 after i jun
(integer) 11
127.0.0.1:6382> lrange list1 0 -1
1) "wu"
2) "i"
3) "jun"
4) "h"
5) "g"
6) "f"
7) "e"
8) "a"
9) "b"
10) "c"
11) "d"
127.0.0.1:6382> lpop list1
"wu"
127.0.0.1:6382> rpop list1
"d"
127.0.0.1:6382> lrange list1 0 -1
1) "i"
2) "jun"
3) "h"
4) "g"
5) "f"
6) "e"
7) "a"
8) "b"
9) "c"
127.0.0.1:6382> lrem list1 1 i
(integer) 1
127.0.0.1:6382> lrange list1 0 -1
1) "jun"
2) "h"
3) "g"
4) "f"
5) "e"
6) "a"
7) "b"
8) "c"
127.0.0.1:6382> rpush list1 c c c c c
(integer) 13
127.0.0.1:6382> ltrem list1 -3 c
(error) ERR unknown command 'ltrem'
127.0.0.1:6382> lrem list1 -3 c
(integer) 3
127.0.0.1:6382> lrange list1 0 -1
1) "jun"
2) "h"
3) "g"
4) "f"
5) "e"
6) "a"
7) "b"
8) "c"
9) "c"
10) "c"
127.0.0.1:6382> lindex list 0
(nil)
127.0.0.1:6382> lindex list1 0
"jun"
127.0.0.1:6382> llen list1
(integer) 10
127.0.0.1:6382> lset list 0 wu
(error) ERR no such key
127.0.0.1:6382> lset list1 0 wu
OK
127.0.0.1:6382> lrange list1 0 -1
1) "wu"
2) "h"
3) "g"
4) "f"
5) "e"
6) "a"
7) "b"
8) "c"
9) "c"
10) "c"
применение
set
определение
Набор Redis — это неупорядоченная коллекция типа String. Члены коллекции уникальны, что означает, что повторяющиеся данные не могут появляться в коллекции. Коллекции в Redis реализованы через хеш-таблицы, поэтому сложность добавления, удаления и поиска составляет O(1).
Функции
- беспорядок
- нет повторения
- Межколлекторные операции
API
- Операции внутри коллекции
Заказ | инструкция | временная сложность |
---|---|---|
sadd key element | Добавить элемент в ключ коллекции (если элемент уже существует, добавить не удается) | O(1) |
srem key element | Удалить элемент из заданного ключа | O(1) |
scard key | Рассчитать размер коллекции | O(1) |
sismember key element | Определить, входит ли элемент в множество | O(1) |
srandmember key count | Произвольно выбрать количество элементов из коллекции | O(1) |
spop key | Случайным образом извлеките элемент из коллекции | O(1) |
smembers key | Получить все элементы коллекции | O(1) |
srem key element | Удалить элемент из заданного ключа | O(1) |
- Операции между наборами
Заказ | инструкция | временная сложность |
---|---|---|
sdiff key1 key2 | разница | O(1) |
sinter key1 key2 | перекресток | O(1) |
sunion key1 key2 | союз | O(1) |
sidff/sinter/suion + store destkey | Сохраните разницу, пересечение и объединение в destkey | O(1) |
Уведомление
- srandmember не уничтожает коллекцию
- споп сломается
- smembers возвращает неупорядоченную коллекцию, и обратите внимание на блокировку, когда сумма большая
Упражнение
127.0.0.1:6382> sadd set1 a b c d
(integer) 4
127.0.0.1:6382> srem set1 a
(integer) 1
127.0.0.1:6382> smembers set1
1) "d"
2) "c"
3) "b"
127.0.0.1:6382> scard set1
(integer) 3
127.0.0.1:6382> sismember set1 d
(integer) 1
127.0.0.1:6382> srandmember set1 2
1) "d"
2) "b"
127.0.0.1:6382> srandmember set1 2
1) "b"
2) "c"
127.0.0.1:6382> spop set1
"c"
127.0.0.1:6382> smembers set1
1) "d"
2) "b"
127.0.0.1:6382> srem set1 d
(integer) 1
127.0.0.1:6382> smembers set1
1) "b"
127.0.0.1:6382> sadd set1 1 2 3 4 5
(integer) 5
127.0.0.1:6382> sadd set2 a b c 12 8 9 1 2
(integer) 8
127.0.0.1:6382> sdiff set1 set2
1) "3"
2) "4"
3) "5"
127.0.0.1:6382> sinter set1 set2
1) "2"
2) "b"
3) "1"
127.0.0.1:6382> sunion set1 set2
1) "5"
2) "2"
3) "4"
4) "1"
5) "a"
6) "8"
7) "3"
8) "b"
9) "9"
10) "12"
11) "c"
127.0.0.1:6382>
настоящий бой
- лотерейная система с использованием spop
- Понравившиеся статьи, избранные статьи и т. д.
- Этикетка
- Общая забота
Суммировать
zset
определение
Упорядоченные коллекции Redis, как и коллекции, также являются коллекциями элементов строкового типа, и повторяющиеся элементы не допускаются. Разница в том, что каждый элемент связан с дробью типа double. Redis сортирует элементы набора от меньшего к большему по количеству баллов. Члены упорядоченного набора уникальны, но оценки могут повторяться.
API
Заказ | инструкция | временная сложность |
---|---|---|
zadd key score element | Добавить оценку и элемент | O(logN) |
ключевой элемент zrem (может быть несколько) | Удалить элемент из заданного ключа | O(1) |
zscore key element | Возвращает долю элемента | O(1) |
zincrby key increScore element | Увеличение или уменьшение доли элемента | O(1) |
zcard key | Возвращает общее количество элементов | O(1) |
zrank(zrevrank) key member | Возвращает ранг элемента | O(1) |
zrange(zrevrank) key start end [WITHSCORES] | Возвращает возрастающие элементы в указанном диапазоне индексов [пунктов] | O(logN + m) |
zrangebyscore(zrevrangebyscore) key minScore maxScore | Возвращает элементы в порядке возрастания в указанном дробном диапазоне | O(logN + m) |
zcount key minScore maxScore | Возвращает количество элементов в отсортированном наборе в пределах указанного диапазона оценок. | O(logN + m) |
zremrangebyrank key start end | удаляет элементы в порядке возрастания в пределах указанного ранга | O(logN + m) |
zremrangebyscore key minScore maxScore | Удаляет восходящие элементы в указанной дроби | O(logN + m) |
Цифровые клавиши назначения ZINTERSTORE (представляющие количество клавиш) клавиша [клавиша ...] | Вычисляет пересечение заданного отсортированного набора или наборов и сохраняет результирующий набор в новом ключе отсортированного набора. | |
ZUNIONSTORE destination numkeys key [key ...] | Вычисляет объединение заданного одного или нескольких отсортированных наборов и сохраняет в новом ключе |
настоящий бой
- Различные списки (score:timestamp, saleCount, FollowCount)
Использование клиента Redis
скачать
Найдите загрузку на соответствующем языке (обычно выбирайте язык со смайликами и звездочками)
https://redis.io/clients#php
Другие возможности Redis
медленный запрос
жизненный цикл
Два очка
- Медленный запрос происходит на этапе 3
- Тайм-ауты клиента не обязательно являются медленными запросами, но медленные запросы являются возможным фактором тайм-аутов клиента.
две конфигурации
- slowlog-max-len
- slowlog-log-slower-than
Как настроить
команда медленного запроса
- slowlog get [n] : получить медленную очередь запросов
- slowlog len: получить длину очереди медленных запросов
- slowlog reset: очистить очередь медленных запросов
Опыт эксплуатации и обслуживания
трубопровод: трубопровод
что такое трубопровод
- Модель обмена одноразовыми сетевыми командами
- Массовая модель обмена сетевыми командами
что такое трубопровод
Роль трубопровода
Две точки внимания
- Время команды redis составляет микросекундный уровень
- Количество трубопроводов, которые необходимо контролировать каждый раз (сеть)
По сравнению с родной операцией
- М операция
- pipeline
Рекомендации
- Обратите внимание на объем данных, передаваемых каждым конвейером.
- конвейер может действовать только на один узел redis за раз
- Разница между операцией M и конвейером
опубликовать подписаться
Роль
- диктор
- подписчик
- канал
Модель
API
-
publish channel message
-
подписаться [канал] один или несколько
-
отписаться [канал] один или несколько
Упражнение
127.0.0.1:6382> publish weibomovie "hello world"
(integer) 1
127.0.0.1:6382> publish weibomovie "hello world2"
(integer) 1
другой клип
127.0.0.1:6382> SUBSCRIBE weibomovie
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "weibomovie"
3) (integer) 1
1) "message"
2) "weibomovie"
3) "hello world"
1) "message"
2) "weibomovie"
3) "hello world2"
Публикация-подписка и очередь сообщений
Bitmap
битовая карта
API
Заказ | инструкция | временная сложность |
---|---|---|
setbit key offset value | Задает значение параметра индекса для растрового изображения. | O(1) |
getbit key offset | Получить значение указанного индекса растрового изображения | O(1) |
bitcount key start end | Получить количество битов в указанном диапазоне растрового изображения (от начала до конца, в байтах, если не указано, получить все) со значением бита 1 | O(1) |
bitop op destkey key [key...] | Выполните несколько операций растрового изображения и, или, не, xor, и сохраните результат в ключе назначения. | O(1) |
bitpos key targetBit [start][end | Вычислить указанный диапазон растрового изображения (от начала до конца, в байтах, если не указано, получить все) значение, соответствующее первому смещению, равно положению targetBit | O(1) |
Упражнение
127.0.0.1:6382> set hello big
OK
127.0.0.1:6382> getbit hello
(error) ERR wrong number of arguments for 'getbit' command
127.0.0.1:6382> getbit hello 0
(integer) 0
127.0.0.1:6382> setbit hello 0 1
(integer) 0
127.0.0.1:6382> get hello
"\xe2ig"
127.0.0.1:6382> set hell a
OK
127.0.0.1:6382> bitcount hell
(integer) 3
127.0.0.1:6382> bitop and hell hello
(integer) 3
127.0.0.1:6382> set a a
OK
127.0.0.1:6382> set b b
OK
127.0.0.1:6382> bitop and c a b
(integer) 1
127.0.0.1:6382> get c
"`"
127.0.0.1:6382> bitpos a 1
(integer) 1
127.0.0.1:6382> bitpos a 0
(integer) 0
127.0.0.1:6382> set user2 100
OK
Уникальная статистика пользователей
важно понятьИспользование растрового изображения для записи идентификатора пользователя на самом деле означает запись значения индекса. Например, userid=100 означает, что значение индекса растрового изображения 100 равно 1.
Опыт
- тип=строка, не более 512 МБ
- Обратите внимание на смещение при установке бита, это может занять много времени
- Растровые изображения не совсем хороши
HyperLogLog
новая структура данных
API
Заказ | инструкция |
---|---|
pfaddd key element [element...] | Добавить элементы в гиперлоглог |
pfcount key [key...] | Рассчитайте общее количество независимых для hyperloglog |
pfmerge destkey sourceKey [sourcekey...] | Объединить несколько гиперлоглогов |
Упражнение
127.0.0.1:6382> pfadd puser1 "u1" "u2" "u3"
(integer) 1
127.0.0.1:6382> pfcount puser1
(integer) 3
127.0.0.1:6382> pfadd puser2 "u3" "u4" "u5"
(integer) 1
127.0.0.1:6382> pfmerge puser puser1 puser2
OK
127.0.0.1:6382> pfcount puser
(integer) 5
потребление памяти
Опыт
-
Устойчивость к ошибкам (доля ошибок: 0,81%)
-
Требуется ли один фрагмент данных (его невозможно извлечь)
GEO
Что такое ГЕО
5 городов широта и долгота
API
Заказ | инструкция |
---|---|
geoadd key longitude latitude member [longitude latitude member ...] | Добавить информацию о геолокации |
geopos key member[member... | Получить информацию о геолокации |
geodist key member1 member2[unit] | Получите расстояние между двумя географическими точками, единица измерения: м, км, мили, футы |
georadius | Получить коллекцию информации о географическом местоположении в указанном диапазоне местоположений |
Упражнение
127.0.0.1:6382> geoadd beijing 116.28 39.55
(error) ERR wrong number of arguments for 'geoadd' command
127.0.0.1:6382> geoadd geo 116.28 39.55 beijing 117.12 39.08 tianjin
(integer) 2
127.0.0.1:6382> geopos geo beijing
1) 1) "116.28000229597091675"
2) "39.5500007245470826"
127.0.0.1:6382> geodist geo beijing tianjin
"89206.0576"
127.0.0.1:6382>
Связанные инструкции
- since 3.2+
- type geoKey = zset
- API без удаления: ключевой элемент zrem
Компромиссы и варианты постоянства Redis
Роль настойчивости
что такое настойчивость
Все данные в Redis хранятся в памяти, а обновления данных будут асинхронно сохраняться на диск.
Как реализовать постоянство
- снимок
- mysql dump
- redis RDB
- запись журнала
- mysql binlog
- hbase hLog
- redis AOF
RDB
Что такое РБД
Триггерный механизм - в основном три способа
- сохранить (синхронизировать)
* 文件策略:如存在老的RDB文件,新替换老
* 复杂度:O(N)
- bgsave (асинхронный)
- Автоматическая конфигурация
**Связанная конфигурация
Параметры конфигурации | ценность |
---|---|
save | 900 1 |
save | 300 10 |
save | 60 10000 |
dbfilename | dump-${port}.rdb |
dir | /bigdishpath |
stop-writes-on-bgsav-error | yes |
rdbcompression | yes |
сохранить и сохранить
Триггерный механизм — способ, который нельзя игнорировать
Другие методы также вызывают создание файлов RDB.
- полная копия
- debug reload
- shutdown
Суммировать
- RDB — это моментальный снимок памяти Redis на диск для сохранения.
- save обычно блокирует Redis
- bgsave не будет блокировать Redis, но будет создавать новые процессы
- сохранить автоматическую настройку будет выполнено, если любой из них будет удовлетворен
- Некоторые триггеры нельзя игнорировать
AOF
Проблемы с РБД
- Занимает много времени, хорошая производительность
- Неконтролируемый, потеря данных
Что такое АОФ
- Создайте
- восстанавливаться
Три стратегии AOF
- always
- everysec
- no
Сравнение трех стратегий
AOF переписать
Роль переписывания AOF
- Уменьшите использование жесткого диска
- Ускорить восстановление
Два способа реализации переписывания AOF
- bgrewriteaof
- aof переписать конфигурацию
Процесс перезаписи AOF
настроить
Выбор RDB и AOF
RDB лучшая стратегия
- Закрыть
- Централизованное управление
- мастер-раб
Лучшая стратегия AOF
- открывать, кэшировать и хранить
- AOF переписывает централизованное управление
- everysec
------------------------- Великолепная разделительная линия --------------------
Друзья, которые прочитали это, могут нажать «Нравится» / «Подписаться», ваша поддержка — самая большая поддержка для меня.
личный блогСтек томатной технологиииДомашняя страница Наггетс
Если вы хотите узнать больше, обратите внимание на мой публичный аккаунт в WeChat: Tomato Technology Stack.