Redis от входа к практике

Redis база данных NoSQL

Потребовалось около недели, чтобы всесторонне освоить знания о Redis и записать конспект исследования

Оригинальный текст можно найти в моем техническом блоге.Стек томатной технологии

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

руководство

Хвала редису

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

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

определение

Redis — это сетевая база данных с открытым исходным кодом, хранящаяся в памяти, с необязательным хранилищем ключей и значений, написанная на ANSI C.

характеристика

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

Прошлое и настоящее Redis

paste image

кто использует редис

  • github
  • twitter
  • Вейбо
  • Stack Overflow
  • Алибаба
  • Байду
  • Мейтуан
  • соху
  • ......

каталог функций Redis

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

Особенность 1: Быстро

10w QPS

причина

  • данные в памяти
  • написано на языке с
  • запись в один поток

paste image

paste image

Особенность 2: Стойкость

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

Функция 3: Структуры данных

paste image

Функция 4: многоязычный клиент

  • java
  • php
  • python
  • ruby
  • lua
  • nodejs

Особенность 5: Многофункциональный

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

Особенность 6: Простой

  • 23 000 строк кода для реализации основных функций
  • Не зависит от внешних библиотек
  • однопоточная модель

Функция 7: Копировать

paste image

Функция 8: Высокая доступность

  • redis-sentinel поддерживает высокую доступность
  • Распределенный redis-кластер поддерживает распределенные

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

  • кеш-система

paste image

  • прилавок

paste image

  • система очереди сообщений

paste image

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

paste image

  • Социальная сеть
  • система реального времени

Три способа запустить 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)

paste image

Три способа начать рейды

  • Самый простой запуск (начать с файла конфигурации по умолчанию)
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

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

значок

paste image

reidsObject

paste image

один поток

определение

Когда один поток выполняет программу, пути программы, которые он использует, располагаются в последовательном порядке: первый должен быть хорошо обработан, а второй будет выполнен.

paste image

Почему один поток такой быстрый

  • чистая память
  • неблокирующий ввод-вывод
  • Избегайте переключения потоков и потребления гонки

На что обратить внимание при использовании одиночного потока

  • Одновременно может быть запущена только одна команда
  • отклонять длинные (медленные) команды
    • 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 получить операции

paste image

**1 операция получения**

paste image

настоящий бой

  • Запишите количество посещений персональной домашней страницы каждого пользователя веб-сайта.
incr userid: pageview (**主要的是:单线程,所以无竞争)**)
  • Основная информация о кэшированном видео (источник данных в mysql) псевдокод

paste image

  • Распределенный генератор идентификаторов (преимущество одного потока)

paste image

incr id

hash

ключевая структура хэша

paste image

Функции

  • 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

структура списка

paste image

Функции

  • аккуратный
  • можно повторить
  • Вставьте и выдвиньте с левой и правой стороны

API

paste image

Упражнение

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"

применение

paste image

paste image

paste image

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> 

настоящий бой

paste image

  • лотерейная система с использованием spop

paste image

  • Понравившиеся статьи, избранные статьи и т. д.

paste image

  • Этикетка

paste image

  • Общая забота

Суммировать

paste image

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)

paste image

Использование клиента Redis

скачать

Найдите загрузку на соответствующем языке (обычно выбирайте язык со смайликами и звездочками)

https://redis.io/clients#php

Другие возможности Redis

медленный запрос

жизненный цикл

paste image

Два очка

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

две конфигурации

  • slowlog-max-len

paste image

  • slowlog-log-slower-than

paste image

Как настроить

paste image

команда медленного запроса

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

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

paste image

трубопровод: трубопровод

что такое трубопровод

  • Модель обмена одноразовыми сетевыми командами

paste image

  • Массовая модель обмена сетевыми командами

paste image

что такое трубопровод

paste image

Роль трубопровода

paste image

Две точки внимания

  • Время команды redis составляет микросекундный уровень
  • Количество трубопроводов, которые необходимо контролировать каждый раз (сеть)

По сравнению с родной операцией

  • М операция

paste image

  • pipeline

paste image

Рекомендации

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

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

Роль

  • диктор
  • подписчик
  • канал

Модель

paste image

paste image

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"

Публикация-подписка и очередь сообщений

paste image

Bitmap

битовая карта

paste image

paste image

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.

paste image

paste image

Опыт

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

HyperLogLog

новая структура данных

paste image

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

потребление памяти

paste image

Опыт

  • Устойчивость к ошибкам (доля ошибок: 0,81%)

  • Требуется ли один фрагмент данных (его невозможно извлечь)

GEO

Что такое ГЕО

paste image

5 городов широта и долгота

paste image

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 хранятся в памяти, а обновления данных будут асинхронно сохраняться на диск.

paste image

Как реализовать постоянство

  • снимок
    • mysql dump
    • redis RDB
  • запись журнала
    • mysql binlog
    • hbase hLog
    • redis AOF

RDB

Что такое РБД

paste image

Триггерный механизм - в основном три способа

  • сохранить (синхронизировать)

paste image

* 文件策略:如存在老的RDB文件,新替换老
* 复杂度:O(N)
  • bgsave (асинхронный)

paste image

  • Автоматическая конфигурация

paste image

**Связанная конфигурация

Параметры конфигурации ценность
save 900 1
save 300 10
save 60 10000
dbfilename dump-${port}.rdb
dir /bigdishpath
stop-writes-on-bgsav-error yes
rdbcompression yes

сохранить и сохранить

paste image

Триггерный механизм — способ, который нельзя игнорировать

Другие методы также вызывают создание файлов RDB.

  • полная копия
  • debug reload
  • shutdown

Суммировать

  • RDB — это моментальный снимок памяти Redis на диск для сохранения.
  • save обычно блокирует Redis
  • bgsave не будет блокировать Redis, но будет создавать новые процессы
  • сохранить автоматическую настройку будет выполнено, если любой из них будет удовлетворен
  • Некоторые триггеры нельзя игнорировать

AOF

Проблемы с РБД

  • Занимает много времени, хорошая производительность

paste image

  • Неконтролируемый, потеря данных

paste image

Что такое АОФ

  • Создайте

paste image

  • восстанавливаться

paste image

Три стратегии AOF

  • always

paste image

  • everysec

paste image

  • no

paste image

Сравнение трех стратегий

paste image

AOF переписать

paste image

Роль переписывания AOF

  • Уменьшите использование жесткого диска
  • Ускорить восстановление

Два способа реализации переписывания AOF

  • bgrewriteaof

paste image

  • aof переписать конфигурацию

paste image

paste image

Процесс перезаписи AOF

paste image

настроить

paste image

Выбор RDB и AOF

paste image

RDB лучшая стратегия

  • Закрыть
  • Централизованное управление
  • мастер-раб

Лучшая стратегия AOF

  • открывать, кэшировать и хранить
  • AOF переписывает централизованное управление
  • everysec

------------------------- Великолепная разделительная линия --------------------

Друзья, которые прочитали это, могут нажать «Нравится» / «Подписаться», ваша поддержка — самая большая поддержка для меня.

личный блогСтек томатной технологиииДомашняя страница Наггетс

Если вы хотите узнать больше, обратите внимание на мой публичный аккаунт в WeChat: Tomato Technology Stack.

番茄技术小栈