Redis
1 Введение в Redis
Основные понятия Nosql
Для решения ряда проблем, таких как высокая степень параллелизма, высокая доступность, высокая масштабируемость и хранение больших данных, решением для базы данных является NoSql.
NoSql, называемая нереляционной базой данных, ее полное название Not only sql. Он не может заменить реляционные базы данных, но может служить хорошим дополнением к реляционным базам данных.
Nosql-классификация
-
База данных хранилища ключей-значений Связанные продукты: Tokyo Cabinet/Tyrant, Redis, Voldemort, Berkeley DB Типичные области применения: Кэширование контента, в основном используемое для обработки высоких нагрузок доступа к большим объемам данных. Модель данных: массив пар ключ-значение. Преимущества: Быстрый запрос Недостаток: сохраненные данные менее структурированы
-
база данных хранилища столбцов Сопутствующие товары: Cassandra, HBase, Riak Типичное применение: распределенная файловая система Модель данных: Хранится в кластере столбцов, храня данные одних и тех же столбцов вместе. Преимущества: быстрый поиск, сильная масштабируемость, более простое распределенное расширение. Недостаток: Относительно ограниченный функционал
-
база данных документов Связанные продукты: CouchDB, MongoDB Типичное приложение: веб-приложение (аналогично Key-Value, значение структурировано) Модель данных: массив пар ключ-значение. Преимущество: требования к структуре данных не являются строгими. Недостатки: производительность запросов невысокая, отсутствует унифицированный синтаксис запросов.
-
База данных графов Соответствующие базы данных: Neo4J, InfoGrid, Infinite Graph Типичное применение: социальная сеть Модель данных: структура графика Преимущества: использование алгоритмов, связанных со структурой графа. Недостаток: для получения результата необходимо вычислить весь граф, а сделать распределенное кластерное решение непросто.
Основные понятия Redis
Redis — это высокопроизводительная база данных «ключ-значение», разработанная на языке C. Redis может хранить данные с помощью некоторых типов ключ-значение. Тип значения ключа: Строковый тип символа тип хэша карты список тип списка установить тип коллекции sortedset тип отсортированной коллекции
История развития
В 2008 году итальянская компания-стартап Merzia запустила LLOOGG, систему статистики веб-сайтов в режиме реального времени, основанную на MySQL, однако основателю компании Сальваторе Санфилиппо не потребовалось много времени, чтобы разочароваться в производительности MySQL, поэтому он решил настроить LLOOGG самостоятельно База данных, разработанная в 2009 году, называется Redis. Однако Сальваторе Санфилиппо не был удовлетворен использованием Redis только для LLOOGG, но надеялся, что его будет использовать больше людей.Поэтому в том же году Сальваторе Санфилиппо выпустил Redis с открытым исходным кодом и начал вносить еще один значительный вклад в код с помощью Redis.Автор Питер Нордхуис продолжает развитие Redis по сей день.
Сам Сальваторе Санфилиппо не ожидал, что всего через несколько лет у Redis появится огромная пользовательская база. В 2012 году Hacker News опубликовали опрос об использовании базы данных и обнаружили, что почти 12% компаний используют Redis. Внутренние пользователи, такие как Sina Weibo, Jibeiwang, Zhihu.com, и зарубежные пользователи, такие как GitHub, Stack Overflow и Flickr, являются пользователями Redis.
VMware спонсирует разработку Redis с 2010 года, а Сальваторе Санфилиппо и Питер Нордхуис присоединились к VMware в марте и мае соответственно для разработки Redis на постоянной основе.
Сценарии применения
Кэш (запрос данных, короткое соединение, новостной контент, товарный контент и т. д.). (наиболее используемый) Разделение сеансов в распределенной кластерной архитектуре. Список онлайн-друзей для чатов. очередь задач. (Seckill, панические покупки, 12306 и т.д.) Таблица лидеров приложений. Статистика посещений сайта. Обработка истечения срока действия данных (может быть с точностью до миллисекунд)
2 Установка Редиса
скачать
Адрес официального сайта: http://redis.io/ Адрес загрузки: http://download.redis.io/releases/redis-3.0.0.tar.gz
Установить
#sftp 上传安装包到linux
#解压
tar -zxvf redis.3.0.0.tar.gz
#安装c语言环境
sudo apt-get install gcc-c++
#编译
cd redis-3.0.0
make
#安装
make install PREFIX = /usr/local/redis
# 查看
cd /usr/local/redis
ls
повторный запуск
Внешний запуск
- Команда запуска интерфейса
./redis-server
- Выключение, инициированное внешним интерфейсом
заставить закрыть
ctrl+c
изящное завершение работы./redis-cli shutdown
**Советы.** После закрытия клиента служба Redis также остановится.
запуск бэкэнда
- Скопируйте файл redis.conf из исходного пакета redis в каталог bin.
cp /root/redis-3.0.0/redis.conf
- Измените файл redis.conf и измените daemonize на yes.
vim redis.conf
- Запустите Redis с помощью бэкэнд-команды
./redis-server redis.conf
- Проверить успешность запуска
ps -aux | grep redis
- Отключите способ запуска бэкэнда
Принудительно закрыть:
kill -9 进程号
Изящное отключение:./redis-cli shutdown
3 Redis-клиент
собственный клиент
- запускать
./redis-cli -h 127.0.0.1 -p 6379
-h указывает IP-адрес для доступа к серверу Redis -p указывает порт порта сервера Redis для доступа Также можно записать как ./redis-cli Использовать конфигурацию по умолчанию, IP-адрес по умолчанию 127.0.0.1, порт по умолчанию 6379. - закрытие Ctrl + с 127.0.0.1:6379>выйти
клиент с графическим интерфейсом
redis-desktop-manager открывается следующим образом:
Выберите метод базы данных: Выбор плюс индекс базы данных может выбрать указанную базу данных для использования, а индекс начинается с 0.
127.0.0.1:6379> select 15
OK
127.0.0.1:6379[15]>
клиент джедая
вводить
Redis не только использует команды для работы, но в основном основные языки теперь имеют клиентскую поддержку, такую как java, C, C#, C++, php, Node.js, Go и т. д.
Некоторые Java-клиенты перечислены на официальном сайте, включая Jedis, Redisson, Jredis, JDBC-Redis и т. д. Среди них официально рекомендуются Jedis и Redisson. Jedis чаще всего используется на предприятии. Давайте сосредоточимся на изучении Jedis.
Jedis также размещены на github, адрес: https://github.com/xetorthio/jedis.
Инженерное сооружение
- добавить банку Commons-pool2-2.3.jar Джедис-2.7.0.jar
Одноэлементное подключение к Redis
Используйте пул соединений для подключения к Redis
Spring интеграция jedisPool
Добавить пакет весенней банки Настройте файл конфигурации spring applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
<!-- 连接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最大连接数 -->
<property name="maxTotal" value="30" />
<!-- 最大空闲连接数 -->
<property name="maxIdle" value="10" />
<!-- 每次释放连接的最大数目 -->
<property name="numTestsPerEvictionRun" value="1024" />
<!-- 释放连接的扫描间隔(毫秒) -->
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<!-- 连接最小空闲时间 -->
<property name="minEvictableIdleTimeMillis" value="1800000" />
<!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
<property name="softMinEvictableIdleTimeMillis" value="10000" />
<!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
<property name="maxWaitMillis" value="1500" />
<!-- 在获取连接的时候检查有效性, 默认false -->
<property name="testOnBorrow" value="false" />
<!-- 在空闲时检查有效性, 默认false -->
<property name="testWhileIdle" value="true" />
<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
<property name="blockWhenExhausted" value="false" />
</bean>
<!-- redis单机 通过连接池 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool"
destroy-method="close">
<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
<constructor-arg name="host" value="192.168.242.130" />
<constructor-arg name="port" value="6379" />
</bean>
</beans>
тестовый код
@Test
public void testJedisPool() {
JedisPool pool = (JedisPool) applicationContext.getBean("jedisPool");
Jedis jedis = null;
try {
jedis = pool.getResource();
jedis.set("name", "lisi");
String name = jedis.get("name");
System.out.println(name);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (jedis != null) {
// 关闭连接
jedis.close();
}
}
}
4 типа данных
Тип строки
присваивание заданного значения ключа
127.0.0.1:6379> set test 123
OK
значение получить ключ
127.0.0.1:6379> get test
"123"
Получить значение и присвоить значение ключа getset
127.0.0.1:6379> getset test 321
"123"
127.0.0.1:6379> get test
"321"
Установите, чтобы получить несколько ключевых значений mset значение ключа [значение ключа...] получить ключ [ключ...]
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> mget k1 k2
1) "v1"
2) "v2"
удалить ключ
127.0.0.1:6379> del test
(integer) 1
Значение увеличивается или уменьшается
- Увеличение числа
Когда хранимая строка является целым числом, Redis предоставляет удобную команду INCR, роль которой заключается в увеличении текущего значения ключа и возврате увеличенного значения.
Синтаксис: ключ incr
127.0.0.1:6379> set num 1 OK 127.0.0.1:6379> incr num (integer) 2 127.0.0.1:6379> incr num (integer) 3 127.0.0.1:6379> incr num (integer) 4
- Увеличить указанное целое число
приращение ключа
127.0.0.1:6379> incrby num 2 (integer) 8 127.0.0.1:6379> incrby num 2 (integer) 10
- Уменьшить значение
ключ decr
127.0.0.1:6379> decr num (integer) 9 127.0.0.1:6379> decr num (integer) 8
- Уменьшить указанное значение
Расшифроватьдекремент ключа
127.0.0.1:6379> decrby num 2 (integer) 6 127.0.0.1:6379> decrby num 2 (integer) 4
добавить значение в конец Роль APPEND заключается в добавлении значения в конец значения ключа. Если ключ не существует, установите значение ключа в значение, которое эквивалентно значению ключа SET. Возвращаемое значение — это общая длина добавленной строки. Синтаксис: добавить значение ключа
127.0.0.1:6379> set str hello
OK
127.0.0.1:6379> append str "world"
(integer) 10
127.0.0.1:6379> get str
"helloworld"
получить длину строки Команда STRLEN возвращает длину значения ключа или 0, если ключ не существует. Синтаксис: ключ strlen
127.0.0.1:6379> strlen str
(integer) 10
заявление
- автоматическое увеличение первичного ключа Номер продукта и номер заказа генерируются с использованием возрастающей числовой функции строки
Хеш хэш Тип
Проблемы со строкой
Предположим, что объект пользователя хранится в Redis в виде сериализации JSON. Объект пользователя имеет такие атрибуты, как идентификатор, имя пользователя, пароль, возраст и имя. Процесс хранения выглядит следующим образом: Сохранить, обновить: пользовательский объект json(string) redis
Что делать, если я обновляю только атрибут возраста в бизнесе, а другие атрибуты не обновляются? Если вышеуказанный метод все еще используется, это приведет к трате ресурсов при передаче и обработке.Хэш, упомянутый ниже, может очень хорошо решить эту проблему.
вводить
hash называется типом хэша, который обеспечивает сопоставление полей и значений полей. Значение поля может быть только строкового типа, а другие типы, такие как хеш-тип и тип коллекции, не поддерживаются. следующее:
Заказ
назначать Команда HSET не различает операции вставки и обновления.Команда HSET возвращает 1 при выполнении операции вставки и 0 при выполнении операции обновления.
- Устанавливайте только одно значение поля за раз
Синтаксис: значение ключевого поля hset
127.0.0.1:6379> hset user username zhangsan (integer) 1
- Задайте сразу несколько значений поля
Синтаксис: значение ключевого поля hmset [значение поля...]
127.0.0.1:6379> hmset user age 20 username lisi OK
- Назначение, когда поле не существует, аналогично hset, за исключением того, что команда ничего не делает, если поле существует.
Синтаксис: значение поля ключа hsetnx
127.0.0.1:6379> hsetnx user age 30 (integer) 0
ценность
- Получить значения полей по одному
Синтаксис: ключевое поле hget
127.0.0.1:6379> hget user username "lisi"
- Получить сразу несколько значений поля
Синтаксис: ключевое поле hmget [поле...]
127.0.0.1:6379> hmget user age username 1) "20" 2) "lisi"
- Получить все значения поля
Синтаксис: ключ hgetall
127.0.0.1:6379> hgetall user 1) "username" 2) "lisi" 3) "age" 4) "20"
удалить поле Одно или несколько полей могут быть удалены, а возвращаемое значение — количество удаленных полей. Синтаксис: ключевое поле hdel [поле...]
127.0.0.1:6379> hdel user age
(integer) 1
127.0.0.1:6379> hdel user age username
(integer) 1
увеличить число Синтаксис: hincrby приращение ключевого поля
127.0.0.1:6379> hincrby user age 2
(integer) 2
Проверить, существует ли поле Синтаксис: шестнадцатеричное ключевое поле
127.0.0.1:6379> hexists user age
(integer) 1
Получить только имя поля или значение поля грамматика: ключ ключ hvals
127.0.0.1:6379> hkeys user
1) "age"
Получить количество полей Синтаксис: ключ hlen
127.0.0.1:6379> hlen user
(integer) 1
заявление Хранить информацию о продукте
127.0.0.1:6379> hlen user
(integer) 1
Получить информацию о продукте
127.0.0.1:6379> hgetall items:1001
1) "id"
2) "3"
3) "name"
4) "apple"
5) "price"
6) "5.00"
Тип списка
Разница между ArrayList и LinkedList
Arraylist использует массивы для хранения данных, функции: быстрый запрос, медленное добавление и удаление.
Linkedlist использует двусвязный список для хранения данных, который включает в себя: быстрое добавление и удаление, медленные запросы, а также быстрый запрос данных на обоих концах связанного списка.
Список Redis хранится в связанном списке, поэтому операция типа данных списка Redis заключается в обработке данных на обоих концах списка.
Заказ
Добавить элементы в оба конца списка
- Добавить элементы слева от списка Синтаксис: значение ключа lpush [значение...]
127.0.0.1:6379> lpush list:1 1 2 3
(integer) 3
- Добавить элементы справа от списка Синтаксис: значение ключа rpush [значение...]
127.0.0.1:6379> rpush list:1 4 5 6
(integer) 6
Посмотреть список Команда LRANGE — одна из наиболее часто используемых команд для типов списков.Чтобы получить сегмент в списке, она возвращает все элементы между началом и концом (включая элементы на обоих концах), а индекс начинается с 0. Индекс может быть отрицательным, например: "-1" представляет последний элемент.
Синтаксис: клавиша lrange start stop
127.0.0.1:6379> lrange list:1 0 2
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> lrange list:1 0 -1
1) "3"
2) "2"
3) "1"
4) "4"
5) "5"
6) "6"
Выталкивание элементов с обоих концов списка Команда LPOP извлекает элемент слева из списка и выполняется в два этапа:
- Первый шаг - удалить элемент слева от списка из списка
- Второй шаг - вернуть значение элемента, которое было удалено.
грамматика:
ключ lpop
Ключ RPOP
127.0.0.1:6379> lpop list:1 "3" 127.0.0.1:6379> rpop list:1 "6"
Получить количество элементов в списке Синтаксис: ключ llen
127.0.0.1:6379> llen list:1
(integer) 4
удаляет значение, указанное в списке Команда LREM удаляет первые элементы count в списке, значение которых равно value, и возвращает фактическое количество удаленных элементов. В зависимости от значения счетчика команда выполняется по-разному:
- Когда count>0, LREM удалит слева список.
- Когда count
- Когда count=0, LREM удаляет все элементы, значение которых равно value.
Синтаксис: значение счета ключа lrem
Получить/установить значение элемента по указанному индексу
- Получить значение элемента по указанному индексу
Синтаксис: индекс ключей lindex
127.0.0.1:6379> lindex list:1 2 "4"
- Устанавливает значение элемента по указанному индексу
Синтаксис: lset значение индекса ключа
127.0.0.1:6379> lset list:1 2 2 OK
Сохранить только указанный фрагмент списка Указанный диапазон такой же, как lrange Синтаксис: ltrim key start stop
127.0.0.1:6379> lrange list:1 0 -1
1) "2"
2) "1"
3) "2"
4) "5"
127.0.0.1:6379> ltrim list:1 0 2
OK
127.0.0.1:6379> lrange list:1 0 -1
1) "2"
2) "1"
3) "2"
вставить элемент в список Команда сначала ищет в списке слева направо элемент, значение которого является сводным, а затем решает, следует ли вставить значение до или после элемента в зависимости от того, находится ли второй параметр ДО или ПОСЛЕ. Синтаксис: клавиша linsert перед | после опорного значения
127.0.0.1:6379> lrange list:1 0 -1
1) "2"
2) "1"
3) "2"
127.0.0.1:6379> linsert list:1 after 1 9
(integer) 4
127.0.0.1:6379> lrange list:1 0 -1
1) "2"
2) "1"
3) "9"
4) "2"
Переместить элементы из одного списка в другой Синтаксис: rpoplpush источник назначения
127.0.0.1:6379> lrange list:1 0 -1
1) "2"
2) "1"
3) "9"
4) "2"
127.0.0.1:6379> rpoplpush list:1 newlist
"2"
127.0.0.1:6379> lrange newlist 0 -1
1) "2"
127.0.0.1:6379> lrange list:1 0 -1
1) "2"
2) "1"
3) "9"
заявление Создайте список обзоров продуктов в Redis Пользователи публикуют обзоры продуктов, преобразуют информацию отзывов в json и сохраняют их в списке. Пользователь запрашивает список комментариев на странице, берет данные json из Redis и отображает их на странице.
Определите ключ списка обзора продукта: Ключ комментария к продукту [items: comment:1001] с номером продукта 1001
Тип набора
Тип сбора: неупорядоченный, неповторяемый Тип списка: упорядоченный, повторяемый
Заказ
добавить/удалить элементы Синтаксис: sadd key member [член...]
127.0.0.1:6379> sadd set a b c
(integer) 3
127.0.0.1:6379> sadd set a
(integer) 0
Синтаксис: ключевой элемент srem [член...]
127.0.0.1:6379> srem set c
(integer) 1
получить все элементы коллекции Синтаксис: ключ smembers
127.0.0.1:6379> smembers set
1) "b"
2) "a"
Проверить, находится ли элемент в коллекции Синтаксис: ключевой элемент sismember
127.0.0.1:6379> sismember set a
(integer) 1
127.0.0.1:6379> sismember set h
(integer) 0
Команда операции
Установить разностную операцию A-B множество элементов, принадлежащих A и не принадлежащих B
Синтаксис: ключ sdiff [ключ...]127.0.0.1:6379> sadd setA 1 2 3
(integer) 3
127.0.0.1:6379> sadd setB 2 3 4
(integer) 3
127.0.0.1:6379> sdiff setA setB
1) "1"
127.0.0.1:6379> sdiff setB setA
1) "4"
Операция пересечения множеств Множество элементов, которые принадлежат A и принадлежат B
Синтаксис: sinter key [key...]127.0.0.1:6379> sinter setA setB
1) "2"
2) "3"
объединение множеств множество элементов, которые принадлежат A или принадлежат B
Синтаксис: sunion key [key...]127.0.0.1:6379> sunion setA setB
1) "1"
2) "2"
3) "3"
4) "4"
Получить количество элементов в коллекции Синтаксис: шрамовый ключ
127.0.0.1:6379> smembers setA
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> scard setA
(integer) 3
вытолкнуть элемент из коллекции Примечание. Поскольку коллекции неупорядочены, все команды spop извлекают элемент из коллекции случайным образом. Синтаксис: ключ spop
127.0.0.1:6379> spop setA
"2"
Тип сортировки
Sortedset, также известный как zset Sortedset — это упорядоченная коллекция, сортируемая, но уникальная. Разница между Sortedset и set заключается в том, что к элементам в наборе будет добавлена оценка, а затем отсортирована по этой оценке.
Заказ
добавить элементы
Добавляет элемент и его оценку в отсортированный набор, заменяя старую оценку новой оценкой, если элемент уже существует. Возвращаемое значение — это количество новых элементов, добавленных в коллекцию, за исключением ранее существовавших элементов. Синтаксис: zadd key score member [score member...]
127.0.0.1:6379> zadd scoreboard 80 zhangsan 89 lisi 94 wangwu
(integer) 3
127.0.0.1:6379> zadd scoreboard 97 lisi
(integer) 0
получить балл за элемент
Синтаксис: ключевой член zscore
127.0.0.1:6379> zscore scoreboard lisi
"97"
удалить элемент
Удаляет один или несколько элементов из ключа отсортированного множества, несуществующие элементы игнорируются. Возвращает ошибку, если ключ существует, но не относится к типу упорядоченного набора.
Синтаксис: ключевой элемент zrem [член...]
127.0.0.1:6379> zrem scoreboard lisi
(integer) 1
Получить список элементов, ранжированных в диапазоне
Получить список элементов, ранжированных в диапазоне
- Возвращает все элементы с индексами от начала до конца в порядке возрастания оценок элементов (включая элементы на обоих концах)
Синтаксис: zrange key start stop [withscores]
127.0.0.1:6379> zrange scoreboard 0 2 1) "zhangsan" 2) "wangwu"
- Возвращает все элементы с индексами от начала до конца в порядке убывания оценок элементов (включая элементы на обоих концах)
Синтаксис: ключ zrevrange start stop [withscores]
Если вам нужно получить оценку элемента, вы можете добавить параметр withscores в конце команды. 127.0.0.1:6379> табло zrevrange 0 2 withscores127.0.0.1:6379> zrevrange scoreboard 0 2 1) "wangwu" 2) "zhangsan"
- "wangwu"
- "94"
- "zhangsan"
- "80" ···
Получить ранг элемента
- От малого к большому Синтаксис: ключевой член zrank
127.0.0.1:6379> zrank scoreboard zhangsan
(integer) 0
- От большого к маленькому Синтаксис: ключевой элемент zrevrank
127.0.0.1:6379> zrevrank scoreboard zhangsan
(integer) 1
получить элементы указанного диапазона оценок
Синтаксис: ключ zrangebyscore min max [withscores] [ограничение количества смещений]
127.0.0.1:6379> ZRANGEBYSCORE scoreboard 90 97 WITHSCORES
1) "wangwu"
2) "94"
3) "lisi"
4) "97"
127.0.0.1:6379> ZRANGEBYSCORE scoreboard 70 100 limit 1 2
1) "wangwu"
2) "lisi"
увеличить оценку элемента
Возвращаемое значение - измененный счет Синтаксис: элемент приращения ключа цинка
127.0.0.1:6379> ZINCRBY scoreboard 4 lisi
"101“
Получить количество элементов в коллекции
Синтаксис: ключ zcard
127.0.0.1:6379> zcard scoreboard
(integer) 3
Получить количество элементов в указанном диапазоне оценок
Синтаксис: ключ zcount min max
127.0.0.1:6379> zcount scoreboard 80 90
(integer) 1
Удалить элементы по диапазону рангов
Синтаксис: zremrangebyrank key start stop
127.0.0.1:6379> zremrangebyrank scoreboard 0 1
(integer) 2
127.0.0.1:6379> zrange scoreboard 0 -1
1) "wangwu"
Удалить элементы по диапазону баллов
Синтаксис: ключ zremrangebyscore min max
127.0.0.1:6379> zadd scoreboard 84 zhangsan
(integer) 1
127.0.0.1:6379> ZREMRANGEBYSCORE scoreboard 80 100
(integer) 1
заявление
Рейтинг продаж товаров
Спрос: ранжируйте и отображайте продукты в соответствии с их объемом продаж. Идея: определить список ранжирования продаж продукта (коллекцию отсортированных наборов), ключ — items:sellsort, а оценка — объем продаж продукта.
Напишите продажи товара:
-
Объем продаж продукта № 1001 равен 9, а объем продаж продукта № 1002 равен 10. 192.168.101.3:7007> Элементы ZADD: сортировка на продажу 9 1001 10 1002
-
Добавьте 1 к продажам артикула 1001 192.168.101.3:7001> Элементы ZINCRBY: сортировка на продажу 1 1001
-
10 самых продаваемых продуктов: 192.168.101.3:7001> ZRANGE items:sellsort 0 9 withscores
ключи команда
Общие команды
-
ключи Возвращает все ключи, соответствующие заданному шаблону redis 127.0.0.1:6379> мой список ключей *
- "mylist"
- "mylist5"
- "mylist6"
- "mylist7"
- "mylist8"
-
существуют Проверить, существует ли ключ Пример: из результатов следует, что ключ HongWan не существует в базе данных, но возраст ключа существует. redis 127.0.0.1:6379> существует HongWan (целое число) 0 redis 127.0.0.1:6379> существует возраст (целое) 1 редис 127.0.0.1:6379>
-
дель удалить ключ Redis 127.0.0.1:6379 > возраст (целое) 1 redis 127.0.0.1:6379> существует возраст (целое число) 0
-
переименовать ключ переименования Пример: age был успешно переименован нами как age_new redis 127.0.0.1:6379[1]> ключи *
- "age" redis 127.0.0.1:6379[1]> rename age age_new OK redis 127.0.0.1:6379[1]> keys *
- "age_new" redis 127.0.0.1:6379[1]>
-
тип тип возвращаемого значения Пример: этот метод может быть очень простым для определения типа значения. redis 127.0.0.1:6379> введите адрес нить redis 127.0.0.1:6379> введите myzset2 zустановить redis 127.0.0.1:6379> введите мой список список редис 127.0.0.1:6379>
Установите время жизни для ключа
Redis больше используется в качестве кеша в процессе фактического использования, но кешированные данные обычно должны устанавливать время жизни, то есть данные уничтожаются по истечении срока действия.
EXPIRE key seconds | Установите время жизни ключа (единица измерения: секунды), через сколько секунд ключ будет автоматически удален. |
TTL key | Проверить оставшееся время жизни для ключа |
PERSIST key | Ясное время жить |
PEXPIRE key milliseconds | Единица настройки времени жизни: миллисекунды. |
пример:
192.168.101.3:7002> set test 1 设置test的值为1
OK
192.168.101.3:7002> get test 获取test的值
"1"
192.168.101.3:7002> EXPIRE test 5 设置test的生存时间为5秒
(integer) 1
192.168.101.3:7002> TTL test 查看test的生于生成时间还有1秒删除
(integer) 1
192.168.101.3:7002> TTL test
(integer) -2
192.168.101.3:7002> get test 获取test的值,已经删除
(nil)
Схема сохранения Redis
РДБ путь
По умолчанию Redis сохраняет данные на диск с помощью моментальных снимков.
Задайте условия для постоянных снимков
Измените условия для постоянных снимков в redis.conf:
Каталог хранения для постоянных файлов
Каталог хранения для постоянных файлов можно указать в redis.conf.
Проблемы с РДБ
Как только Redis будет закрыт незаконно, данные после последнего сохранения будут потеряны.
Если данные не важны, все равно. Если нельзя допустить потери данных, используйте метод aof.
далеко
Redis не использует этот метод для сохранения по умолчанию. Постоянство метода Aof заключается в том, чтобы один раз запустить базу данных Redis, а затем сохранить записи операций в постоянном файле aof.
-
Шаг 1: Включите схему сохраняемости aof. Измените appendonly в redis.conf на yes, то есть включите схему сохранения режима aof.
-
Каталог, в котором хранятся файлы Aof, совпадает с каталогом rdb. Имя файлового хранилища Aof
При использовании методов aof и rdb при перезапуске redis данные загружаются из файла aof.
Репликация Redis master-slave
Что такое master-slave репликация
Постоянство гарантирует, что данные не будут потеряны даже в случае перезапуска службы Redis, поскольку постоянные данные на жестком диске будут восстановлены в памяти после перезапуска службы Redis.Однако, когда жесткий диск сервера Redis поврежден, данные Механизм репликации master-slave может избежать этой единственной точки отказа, как показано ниже:
проиллюстрировать:- Данные в главном Redis имеют две реплики, а именно подчиненный redis 1 и подчиненный Redis 2. Даже если один сервер Redis выходит из строя, две другие службы Redis могут продолжать предоставлять услуги.
- Данные в главном Redis и данные в подчиненном Redis синхронизируются в режиме реального времени.Когда главный Redis записывает данные, они будут скопированы в две подчиненные службы Redis через механизм репликации master-slave.
- Существует только один главный Redis, а подчиненных Redis может быть несколько.
- Репликация master-slave не блокирует мастер, при синхронизации данных мастер может продолжать обрабатывать запросы клиентов
- Redis может быть как ведущим, так и подчиненным, как показано ниже:
Параметры репликации master-slave
конфигурация хоста
Настройка не требуется
Ведомая конфигурация
- Шаг 1: Скопируйте ведомое устройство
cp bin/ bin2 -r
- Шаг 2: Измените redis.conf подчиненного устройства. Синтаксис: slaveof masterip masterport раб 192.168.242.137 6379
- Шаг 3: Измените адрес порта подчиненного устройства на 6380.
- Шаг 4: Очистите постоянные файлы подчиненного устройства
rm -rf appendonly.aof dump.rdb
- Шаг 5: Запустите подчиненное устройство
./redis-server redis.conf
- Шаг 6: Запустите клиент 6380
./redis-cli -p 6380
Уведомление:Как только мастер добавляет, удаляет и изменяет операцию, ведомый синхронизирует данные с ведомым. Ведомый не может выполнить операцию записи
Кластер Redis
схема архитектуры кластера redis
Детали архитектуры: (1) Все узлы redis взаимосвязаны друг с другом (механизм PING-PONG), а бинарный протокол используется внутри для оптимизации скорости передачи и пропускной способности. (2) Сбой узла вступает в силу только тогда, когда более половины узлов в кластере обнаруживают сбой. (3) Клиент напрямую подключен к узлу redis, промежуточный прокси-уровень не требуется.Клиенту не нужно подключаться ко всем узлам в кластере, достаточно подключиться к любому доступному узлу в кластере. (4) redis-cluster сопоставляет все физические узлы со слотом [0-16383], кластер отвечает за поддержание значения nodeslot В кластере Redis встроено 16384 хеш-слота.Когда ключ-значение необходимо поместить в кластер Redis, Redis сначала использует алгоритм crc16 для вычисления результата для ключа, а затем вычисляет оставшуюся часть результата до 16384, так что каждый ключ будет соответствовать хеш-слотам с номерами от 0 до 16383, Redis будет сопоставлять хеш-слоты с разными узлами примерно одинаково в зависимости от количества узлов.
отказоустойчивость голосования redis-cluster
(1) В голосовании участвуют все мастера в кластере.Если более половины мастер-узлов взаимодействуют с одним из мастер-узлов более (cluster-node-timeout), мастер-узел считается зависшим. (2): Когда весь кластер недоступен (cluster_state: сбой)?
- Если какой-либо мастер кластера зависает, а текущий мастер не имеет подчиненного устройства, кластер переходит в состояние сбоя. Также можно понять, что кластер переходит в состояние сбоя, когда отображение слота [0-16383] является неполным.
- При отказе более половины мастеров в кластере, независимо от наличия ведомых, кластер переходит в состояние отказа.
Установить Руби
Инструмент управления кластером (redis-trib.rb) написан на языке сценариев ruby.
- установить рубин
sudo apt-get install ruby
- Загрузите redis-3.0.0.gem в Linux
- Установить интерфейс ruby и redis
gem install redis-3.0.0.gem
- Скопируйте следующие файлы из каталога src пакета redis-3.0.0 в redis/redis-cluster/
cd /usr/local/redis/
mkdir redis-cluster
cd /root/redis-3.0.0/src/
cp redis-trib.rb /usr/local/redis/redis-cluster
Создайте кластер
Для построения кластера требуется не менее 3 хостов.Если каждый хост сконфигурирован с ведомым устройством, требуется не менее 6 машин. Дизайн порта: 7001-7006
- Скопируйте машину 7001
cp bin ./redis-cluster/7001 -r
- Удалить постоянные файлы, если они существуют
rm -rf appendonly.aof dump.rdb
- Установите параметры кластера и измените redis.conf
- изменить порт
- Скопируйте машину 7002-7006
cp 7001/ 7002-r
cp 7001/ 7003-r
cp 7001/ 7004-r
cp 7001/ 7005-r
cp 7001/ 7006-r
- Изменить машинный порт 7002-7006
- Создайте файл start-all.sh
cd 7001
./redis-server redis.conf
cd ..
cd 7002
./redis-server redis.conf
cd ..
cd 7003
./redis-server redis.conf
cd ..
cd 7004
./redis-server redis.conf
cd ..
cd 7005
./redis-server redis.conf
cd ..
cd 7006
./redis-server redis.conf
cd ..
- Изменить права доступа к файлам
chmod u+x start-all.sh
- Выполнить файл, запустить шесть машин
./start-all.sh
- Создать кластер
./redis-trib.rb create --replicas 1 192.168.126.128:7001 192.168.126.128:7002 192.168.126.128:7003 192.168.126.128:7004 192.168.126.128:7005 192.168.126.128:7006
Подключиться к кластеру
root@ubuntu:/usr/local/redis/redis-cluster/7001# ./redis-cli -p 7001 -c
-c указывает подключение к кластеру
Просмотр информации о кластере
-
Просмотр информации о кластере
192.168.126.128:7002> cluster info cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:2 cluster_stats_messages_sent:260 cluster_stats_messages_received:260
-
Просмотр узлов кластера
192.168.126.128:7002> cluster nodes 3a15e73dacb512745156535ae7f959acf65ae12e 192.168.126.128:7005 slave 23e173cdc0b7673dc28cae70efaabbc41308bfdc 0 1531452321139 5 connected 2a58a53a5b10f7bd91af04128a6ed439d534c0ee 192.168.126.128:7001 master - 0 1531452322145 1 connected 0-5460 d0808388485dd08f1a2ecdfe3d2b213742d0050d 192.168.126.128:7004 slave 2a58a53a5b10f7bd91af04128a6ed439d534c0ee 0 1531452318117 4 connected 23e173cdc0b7673dc28cae70efaabbc41308bfdc 192.168.126.128:7002 myself,master - 0 0 2 connected 5461-10922 2af2312acc56552f9f73470f90d9a51973fc74d3 192.168.126.128:7006 slave 78faf92cfdbd12e1b27b270fb0798e67017f4d0b 0 1531452320132 6 connected 78faf92cfdbd12e1b27b270fb0798e67017f4d0b 192.168.126.128:7007 master - 0 1531452319123 3 connected 10923-16383
джедаи коннект кластер
@Test
public void jedisCluster() {
// 创建jedisCluster
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.242.137", 7001));
nodes.add(new HostAndPort("192.168.242.137", 7002));
nodes.add(new HostAndPort("192.168.242.137", 7003));
nodes.add(new HostAndPort("192.168.242.137", 7004));
nodes.add(new HostAndPort("192.168.242.137", 7005));
nodes.add(new HostAndPort("192.168.242.137", 7006));
nodes.add(new HostAndPort("192.168.242.137", 7007));
JedisCluster cluster = new JedisCluster(nodes);
cluster.set("s4", "444");
String result = cluster.get("s4");
System.out.println(result);
cluster.close();
}
использовать пружину
Настройка applicationContext.xml
<!-- 连接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最大连接数 -->
<property name="maxTotal" value="30" />
<!-- 最大空闲连接数 -->
<property name="maxIdle" value="10" />
<!-- 每次释放连接的最大数目 -->
<property name="numTestsPerEvictionRun" value="1024" />
<!-- 释放连接的扫描间隔(毫秒) -->
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<!-- 连接最小空闲时间 -->
<property name="minEvictableIdleTimeMillis" value="1800000" />
<!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
<property name="softMinEvictableIdleTimeMillis" value="10000" />
<!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
<property name="maxWaitMillis" value="1500" />
<!-- 在获取连接的时候检查有效性, 默认false -->
<property name="testOnBorrow" value="true" />
<!-- 在空闲时检查有效性, 默认false -->
<property name="testWhileIdle" value="true" />
<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
<property name="blockWhenExhausted" value="false" />
</bean>
<!-- redis集群 -->
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg index="0">
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.101.3"></constructor-arg>
<constructor-arg index="1" value="7001"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.101.3"></constructor-arg>
<constructor-arg index="1" value="7002"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.101.3"></constructor-arg>
<constructor-arg index="1" value="7003"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.101.3"></constructor-arg>
<constructor-arg index="1" value="7004"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.101.3"></constructor-arg>
<constructor-arg index="1" value="7005"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.101.3"></constructor-arg>
<constructor-arg index="1" value="7006"></constructor-arg>
</bean>
</set>
</constructor-arg>
<constructor-arg index="1" ref="jedisPoolConfig"></constructor-arg>
</bean>
тестовый код
private ApplicationContext applicationContext;
@Before
public void init() {
applicationContext = new ClassPathXmlApplicationContext(
"classpath:applicationContext.xml");
}
// redis集群
@Test
public void testJedisCluster() {
JedisCluster jedisCluster = (JedisCluster) applicationContext
.getBean("jedisCluster");
jedisCluster.set("name", "zhangsan");
String value = jedisCluster.get("name");
System.out.println(value);
}