Рубрики
Без рубрики

Использование хранения Redis In-Memory для ваших приложений Python

Это было адского десятилетия для разработки программного обеспечения. Я лично наслаждался наблюдающим бесконечным мо … Теги с NoSQL, Python, SoftWaredEvelopepelment, архитектуру.

Это было адского десятилетия для разработки программного обеспечения. Я лично наслаждался наблюдающим бесконечным стоном и жалующимся из-за разработчиков о теме «Новые рамки». «Стандартная риторика могла бы подумать, что наша карьера каким-то образом находится под осаждением в результате изучения новых технологий. Я не могу не задаться вопросом, как одинаково непреднамеренно реагировала профессионалы на рост облачных услуг. Для тех, кто боится учиться, я могу представить только на чувствах, которые они держат за реализацию совершенно новых парадигм, которые приходят с подачными облачными услугами. В качестве альтернативы, есть такие люди, как я: взрослые дети маскируют в мире взрослый мир. Хотя мы можем показаться старше, мы просто перераспределили наши жизненные навязчивые навязки от наборов LEGO в облачные сервисы.

Я потерпел жертву тем больше «новых технологий», которые я хотел бы признать. Удаление пути тупиковых инструментов утомительно. Я уверен, что вы вспомните время, когда весь мир произвольно решил заменить реляционные базы данных с альтернативами NoSQL. Я признаю, насколько импульсными архитектурными решениями создают разрушительные технические долги. Таким образом, я бы никогда не подумал, чтобы подтолкнуть инструменты, которые еще предстоит выдержать испытание временем и полезности в дикой природе. Redis – один из таких инструментов, возможно, рейтинг где-то в моих топ-5 полезных новых технологий в последнее десятилетие.

Почему redis tho?

Почему я могу повернуть поверкурное дерьмо на базах данных NoSQL перед пропагандой для Redis: NoSQL DataStore? Без ошибки: Redis почти Ноль Сходство с базами данных NoSQL, таких как MongoDB, как как на намерениях, так и в исполнении. Mongodb хранит записи на дисковом пространстве, как и базы данных SQL. Выделение дискового пространства для хранения записи, поставляется с последним, что сохраненная информация предназначена для сохранения, например, учетных записей пользователей, сообщений блога, разрешения или что-то еще. Большинство данных, которые стоит экономить падения в эту категорию.

Конечно, не все, что мы делаем в Интернете, стоит экономить навсегда. Это было бы странно (и неэффективно), если мы сохранили информацию, как Предметы в корзине пользователя или Последняя страница нашего приложения Пользователь посетил Отказ Такая информация может быть полезна в краткосрочной перспективе, но давайте не будем трахнуть кислотно-совместимые базы данных, наши компании зависят от бесконечного диска O/o. К счастью для нас, есть мелочь под названием RAM, которая обрабатывала аналогичные сценарии с момента рассвета вычислений. Redis – это в память База данных, которая хранит значения как пары ключа/значения. Чтение и запись в память быстрее, чем запись диска, что делает память подходящей для хранения вторичный данные. Эти данные могут включать лучший пользовательский опыт, одновременно поддерживая наши базы данных. Если мы решим позже, что данные в памяти стоит сохранить, мы всегда можем писать на диск (например, базу данных SQL) позже.

Данные в памяти магазины, такие как Redis или Memcached, лежат где-то в вашей архитектуре между вашим приложением и вашей базой данных. Хороший способ подумать об этих услугах, будет как альтернативы для хранения информации через файлы cookie. Печенье связаны с одним браузером и не может надежно зависеть от работы, как и ожидалось, поскольку любой пользователь может в любое время очистить или отключить файлы cookers браузера. Хранение данных сеанса в облаке Устраняет эту проблему с дополнительным преимуществом данных сеанса, обмениваемых через устройства! Корзина нашего пользователя теперь может быть видна из любого из их устройств, в отличие от того, какой браузер, который они использовали в то время.

Сегодня мы знакомимся с пакетом Go-redis Python: Redis-Py. Redis-Py отвратительно называют Redis Внутри Питона, по-видимому, потому что автор Redis-Py любит причинять боль. Посмотрите сами, посетив Официальные документы Redis-Py : Это одна страница каждого метода в библиотеке, перечисленной в алфавитный порядок – Довольно веселое дерьмо.

Если вы планируете использовать Redis с веб-структурой Python, вы можете быть лучше с использованием рамки-специфического пакета (например, Flask-redis) над Redis-Py. Не волнуйтесь: почти все библиотеки Redis Python следуют точным синтаксисом Redis-Py с незначительным преимуществом структурной интеграции. Независимо от того, какие библиотеки вы будете использовать, все ниже по-прежнему относится.

Настройка Redis.

Если у вас еще нет экземпляра Redis, ребята на Redis Labs Предложите щедрый свободный уровень для сломанных неудачников, как ты и я. Они довольно уважаемые Redis Host, вероятно, потому что они изобрели Redis в первую очередь. Как только у вас установлено экземпляр, обратите внимание на хозяин , пароль и порт Отказ

Достаточно Chit Chat, давайте копаемся в Python. Ты знаешь что делать:

$ pip install redis

РЕДИС УРИС

Как правильные базы данных, мы можем подключиться к нашему экземпляру Redis, создав соединительную строку URI. Вот что может выглядеть настоящая жизнь redis Uri:

redis://:hostname.redislabs.com@mypassword:12345/0

Вот что происходит кусок:

[CONNECTION_METHOD]:[HOSTNAME]@[PASSWORD]:[PORT]/[DATABASE]
  • Connection_method. : Это суффикс, предшествующий всем УРИС Redis URI Как Вы хотели бы подключиться к вашему экземпляру. Redis:// это стандартное соединение, Rediss:// (двойные s) пытаются подключить SSL, Redis-Socket:// Зарезервирован для доменных сокетов Unix, а также Redis-Sentinel:// Это тип подключения для высококачественных кластеров Redis … предположительно для людей меньше сломаться, чем мы сами.
  • Имя хоста: URL или IP-код вашего экземпляра Redis. Если вы используете облачный экземпляр, шансы это похоже на адрес AWS EC2. Это небольшой побочный эффект современного капитализма, переходя в модель, где все предприятия AWS Resellers с предварительно настроенным программным обеспечением.
  • Пароль : Redis экземпляр имеют пароли, но не хватает пользователей, по-видимому, потому что магазин данных на основе памяти, по-прежнему упорно управлять постоянными именами пользователями.
  • Порт: Ваш предпочтительный порт вызова после разграбления британских торговых судов. Просто убедившись, что вы все еще здесь.
  • БАЗА ДАННЫХ: Если вы не уверены, что это должно быть, установите его на 0 Отказ Люди всегда делают это.

Создайте клиент Redis

Удивительно, у нас есть наш URI. Давайте подключаемся к Redis, создавая объект клиента Redis:

import redis
from config import redis_uri

r = redis.StrictRedis(url=redis_uri)

Почему Стриттредис Вы можете спросить? Есть два способа создания клиентов Redis: редис. Redis () и редис. STRITREDIS () Отказ Стриттредис Прилагает усилия, чтобы правильно принудительно принудительно привести к детатипам DataTypes Redis таким образом, что старые экземпляры Redis не делали. редис. Redis () Обратно совместим с устаревшими экземплярами Redis с данными для мусора, где редис. STRITREDIS () не является. Под сомнением, используйте Стриттредис Отказ

Есть много других аргументов, которые мы можем (и должны) перейти в редис. STRITREDIS () сделать нашу жизнь проще. Я настоятельно рекомендую пройти аргумент ключевых слов decode_Reponses = Правда , поскольку это спасает вам неприятности, явно декодируя каждое значение, которое вы извлекаете от Redis. Это не повредит набор символов:

...

r = redis.StrictRedis(url=redis_uri
                      charset="utf-8",
                      decode_responses=True)

Птичий вид на глаза redis

Key/Value/Value Redis ‘- это аналогичная концепция для словарей Python, поэтому смысл за именем: Удаленный Словарь Отказ Ключи всегда строки, но есть несколько типов данных, доступных для нас для хранения в качестве значений. Давайте заполним наш экземпляр Redis с несколькими записями, чтобы лучше посмотреть, как работают базы данных Redis:

r.set('ip_address', '0.0.0.0')
r.set('timestamp', int(time.time()))
r.set('user_agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3)')
r.set('last_page_visited', 'account')

R.Set ([КЛЮЧ], [Значение]) Ваш хлеб и масло для настройки одного значения. Это так же просто, как выглядит: первый параметр – ваша пара ключ , пока второй – ценность назначен указанным ключом.

Как обычная база данных, мы можем подключиться к нашему экземпляру Redis через TABLPLUS GUI, чтобы проверить наши данные. Вот как выглядит моя база данных после запуска с фрагментами выше:

user_agent. -1 НИТЬ Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_15_3)
last_page_visited. -1 НИТЬ Счет
айпи адрес -1 НИТЬ 0.0.0.0
Timestamp -1 НИТЬ 1580866091

Похоже, все прошло скромно, а? Мы можем немного узнать о Redis, просто посмотрев на эту таблицу. Давайте начнем с Тип столбец.

Типы данных в Redis

Значения, которые мы храним в Redis, могут быть любым из 5 типов данных:

  • Строка : Любое значение, которое мы создаем с R.Set () хранится как тип строки. Вы заметите, что мы устанавливаем значение Timestamp Быть целым числом в нашем скрипте Python, но оно появляется здесь как строка. Это может показаться непринужденно неудобным, для Редис строки, чем встречаются на глаз. Для одного, Redis Strings являются двоичными безопасными, то есть их можно использовать для хранения содержимого почти всего, включая изображения или сериализованные объекты. Строки также имеют несколько встроенных функций, которые могут манипулировать строками, как будто они были числами, такими как наращивание с Inc команда Отказ
  • Список : Списки Redis являются сочельными массивами строк, где каждая строка отсортирована по порядку, в котором они впервые появились. Как только список создан, новые элементы могут быть добавлены до конца массива с Рпуш команда или добавлена при нулевом индексе через Lpush команда. Также возможно ограничить максимальное количество элементов в списке, используя ЛТРИМ команда . Если вы такой ботаник, который любит делать такие вещи, как Build LRU кэши, вы, вероятно, признаете непосредственное преимущество этого.
  • Установить : Набор – это неупорядоченный Список строк. Как и наборы Python, наборы Redis не могут содержать дубликаты. Устанавливает уникальную способность выполнять профсоюзы или пересечения между другими наборами, что является отличным способом быстро объединения или сравнения данных.
  • Zset : Придерживайтесь меня здесь … Зсеты наборы, которые являются заказал- Они сохраняют такое же ограничение от подачи дубликатов. Элементы в списке могут быть изменены свой заказ после создания, что делает Zsets очень полезным для ранжирования уникальных элементов. Они несколько похожи на упорядоченные словари в Python, за исключением ключа на значение (что было бы ненужно, так как все установленные значения являются уникальными).
  • Хеш : Redis Hashes сами по себе – это пары ключа/значений, позволяя вам назначить коллекцию пары ключа/значения в качестве значения пары ключа/значения. Хэши не могут быть вложены, потому что это было бы сумасшедшим.

Даты истечения срока действия данных

Наша база данных Redis содержит четвертую колонну, помеченную TTL. До сих пор каждый из наших строков имеет ценность -1 Для этого столбца. Когда этот номер установлен на положительное целое число, он представляет количество секунд осталось до истечения данных . Мы установили, что Redis – отличный способ хранить временные полезные данные, но обычно не Достаточно ценно, чтобы держать. Именно поэтому установка истечения срока действия на новом значении пригодится: он автоматически гарантирует память нашего экземпляра не увязнет с информацией, которая стала неактуальной.

Пересмотр нашего примера, где мы сохранили некоторые пользовательские сеансы, давайте попробуем установить значение с истечением:

...

r.set('last_page_visited', 'account', 86400)

На этот раз мы проходим третье значение для R.Set () который представляет количество секунд, которые наша пара будет храниться до самоуничтожения. Давайте проверим базу данных сейчас:

user_agent. -1 НИТЬ Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_15_3)
last_page_visited. 86400 НИТЬ Счет
айпи адрес -1 НИТЬ 0.0.0.0
Timestamp -1 НИТЬ 1580866091

Если мы используем наш графический интерфейс, чтобы периодически обновить наш стол, мы действительно можем увидеть этот номер, подсчитывающий:

Ключ Redis медленно приближается к смерти.

Работа с каждым типом данных

Я уверен, что любишь, услышав меня, дрон, но мы оба знаем, почему вы здесь: копировать и вставить какой-то код, который вам нужен для вашей дневной работы. Я испортию вас несколькими обманщиками, которые демонстрируют некоторые общие случаи использования при работе с каждым из 5 типов данных Redis.

Строки

Если строки содержат целочисленные значения, есть много методов, которые мы можем использовать для изменения строки, как будто это было целым числом. Проверьте, как мы используем .incr. () , .decr. () и .incrby () здесь:

# Create string value
r.set('index', '1')
logger.info(f"index: {r.get('index')}")

# Increment string by 1
r.incr('index')
logger.info(f"index: {r.get('index')}")

# Decrement string by 1
r.decr('index')
logger.info(f"index: {r.get('index')}")

# Increment string by 3
r.incrby('index', 3)
logger.info(f"index: {r.get('index')}")

Это присваивает значение '1' к Индекс увеличивает значение Индекс на 1, уменьшение стоимости Индекс к 1 и, наконец, увеличивает ценность Индекс К 3:

index: 1
index: 2
index: 1
index: 4

Списки

Ниже мы добавляем элементы в список Redis, используя комбинацию .lpush () и .rpush () , а также выскакивание товара, используя .lpop () Отказ Вы знаете, типичный список вещей:

r.lpush('my_list', 'A')
logger.info(f"my_list: {r.lrange('my_list', 0, -1)}")

# Push second string to list from the right.
r.rpush('my_list', 'B')
logger.info(f"my_list: {r.lrange('my_list', 0, -1)}")

# Push third string to list from the right.
r.rpush('my_list', 'C')
logger.info(f"my_list: {r.lrange('my_list', 0, -1)}")

# Remove 1 instance from the list where the value equals 'C'.
r.lrem('my_list', 1, 'C')
logger.info(f"my_list: {r.lrange('my_list', 0, -1)}")

# Push a string to our list from the left.
r.lpush('my_list', 'C')
logger.info(f"my_list: {r.lrange('my_list', 0, -1)}")

# Pop first element of our list and move it to the back.
r.rpush('my_list', r.lpop('my_list'))
logger.info(f"my_list: {r.lrange('my_list', 0, -1)}")

Вот как выглядит наш список после каждой команды:

my_list: ['A']
my_list: ['A', 'B']
my_list: ['A', 'B', 'C']
my_list: ['A', 'B']
my_list: ['C', 'A', 'B']
my_list: ['A', 'B', 'C']

Набор

Наборы Redis – мощная вечеринка из-за их способности взаимодействовать с другими наборами. Ниже мы создаем два отдельных набора и выполняем .sunion () и .sinter. () на обоих:

# Add item to set 1
r.sadd('my_set_1', 'Y')
logger.info(f"my_set_1: {r.smembers('my_set_1')}'")

# Add item to set 1
r.sadd('my_set_1', 'X')
logger.info(f"my_set_1: {r.smembers('my_set_1')}'")

# Add item to set 2
r.sadd('my_set_2', 'X')
logger.info(f"my_set_2: {r.smembers('my_set_2')}'")

# Add item to set 2
r.sadd('my_set_2', 'Z')
logger.info(f"my_set2: {r.smembers('my_set_2')}'")

# Union set 1 and set 2
logger.info(f"Union: {r.sunion('my_set_1', 'my_set_2')}")

# Interset set 1 and set 2
logger.info(f"Intersect: {r.sinter('my_set_1', 'my_set_2')}")

Как и ожидалось, наш Union сочетает в себе множество без дубликатов, а пересечение находит значения, общие для обоих наборов:

my_set_1: {'Y'}'
my_set_1: {'X', 'Y'}'
my_set_2: {'X'}'
my_set2: {'X', 'Z'}'
Union: {'X', 'Z', 'Y'}
Intersect: {'X'}

Сортированные наборы

Добавление записей в отсортированные множества, используя .zadd. () имеет немного интересного синтаксиса. Примечание Примечание ниже, как добавление записей отсортированного набора ожидает словарь в формате {[ЦЕННОСТЬ]: [Индекс]} :

# Initialize sorted set with 3 values
r.zadd('top_songs_set', {'Never Change - Jay Z': 1,
                         'Rich Girl - Hall & Oats': 2,
                         'The Prayer - Griz': 3})
logger.info(f"top_songs_set: {r.zrange('top_songs_set', 0, -1)}'")

# Add item to set with conflicting value
r.zadd('top_songs_set', {'Can\'t Figure it Out - Bishop Lamont': 3})
logger.info(f"top_songs_set: {r.zrange('top_songs_set', 0, -1)}'")

# Shift index of a value
r.zincrby('top_songs_set', 3, 'Never Change - Jay Z')
logger.info(f"top_songs_set: {r.zrange('top_songs_set', 0, -1)}'")

Предметы в отсортированном наборе никогда не могут делиться тем же индексом, поэтому при попытке вставить значение в индекс, где можно существовать, существующее значение (и те, которые следуют) Get толкнул вниз освободить место. Мы также можем изменить индексы значений после того, как мы их создали:

top_songs_set: ['Never Change - Jay Z',
        'Rich Girl - Hall & Oats',
                'The Prayer - Griz']
top_songs_set: ['Never Change - Jay Z',
        'Rich Girl - Hall & Oats',
        'Can\'t Figure it Out - Bishop Lamont',
        'The Prayer - Griz']
top_songs_set: ['Rich Girl - Hall & Oats',
        'Can\'t Figure it Out - Bishop Lamont',
        The Prayer - Griz',
        'Never Change - Jay Z']

Хэши

Хорошо, я не делал много интересного с хэшими. Подать в суд на меня. Тем не менее, создание и выявление хеш-знача есть Вид круто, верно?

record = {
    "name": "Hackers and Slackers",
    "description": "Mediocre tutorials",
    "website": "https://hackersandslackers.com/",
    "github": "https://github.com/hackersandslackers"
}
r.hmset('business', record)
logger.info(f"business: {r.hgetall('business')}")

Вывод точно такой же, как ввод … Нет сюрпризов там:

business: {'name': 'Hackers and Slackers',
           'description': 'Mediocre tutorials',
           'website': 'https://hackersandslackers.com/',
       'github': 'https://github.com/hackersandslackers'}

Идти

Есть много редис и Redis-Py Особенности, которые мы оставили неисследованные, но у вас должно быть более чем достаточно, чтобы идти. Более важно, надеюсь, этот учебник, надеюсь, имел некоторую часть в демонстрации Почему Redis может быть полезен в вашем стеке … или нет! Если я могу претендовать на любую часть в предотвращении ужасной системы системной архитектуры, это победа.

О да, и проверьте репо на этот урок здесь:

https://github.com/hackersandslackers/redis-python-tutorial

Оригинал: “https://dev.to/hackersandslackers/using-redis-in-memory-storage-for-your-python-applications-1pmc”