Приветствую читателей! Я уже довольно давно пишу на Python, но как мне кажется серьезно работать начал только в этом году. Раньше единственное чем было наполнено мое портфолио - простейшие telegram боты, парсеры и прочие программы которые делаются за пару часов и стоят на том же фрилансе от силы пару тысяч. Сейчас же я с головой погрузился в backend (Django, Flask) и сложных чат ботов. В следствии этого мне пришлось познакомиться с SQL, SQLITE, POSTGREE и так далее. Раньше мне казалось что это невероятно сложно, но как говориться: "Глаза бояться, а пальцы долбят по клаве", и через пару дней я уже спокойно писал SQL запросы. Позже я познакомился с ORM, и это наверное самая удобная вещь которую придумали для работы с базами данных. Но не об этом.

В процессе постижения таинств веб разработки и желания стать в ней профессионалом на просторах интернета я обнаружил информацию о неких NoSQL базах данных, а в частности Redis. Что? Зачем? Почему? Для чего? Вопросов изначально было довольно много, однако в процессе до меня начало доходить почему Redis - безумно классная вещь.

Redis хранит в себе данные в виде key:value, но сразу возникает закономерный вопрос, а как мы можем это применить в процессе разработки? Давайте разберем на банальном примере:

В этой статье я буду работать из терминала redis-cli, но если меня не закидают дизлайками :) выпущу вторую часть где покажу как это работает в связке с фреймворком Django.

Для установки redis в linux:
sudo apt install redis-server
Для macOS:
brew install redis

После установки прописываем redis-cli, а затем проверяем работу redis командой ping.

Установка значения для ключа в redis происходит с помощью команды set.
Синтаксис: set key value

Для того что бы получить значение по ключу мы используем команду get.
Синтаксис: get key

Так же redis нам предоставляет возможность с помощью уже знакомой нам команды set изменять значение. Как вы могли заметить по примерам с картинок я пытался моделировать работу сайта - когда пользователь находиться онлайн в redis, где ключом является ник пользователя, записывается что пользователь в сети. Если же пользователь покидает сайт значения изменяется на offline.

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

P.S. я знаю что offline пишется с двумя f.

Комментарии (12)


  1. kAIST
    13.12.2022 13:56
    +9

    А где собственно ответ на вопрос? Зачем?


    1. boopiz
      13.12.2022 15:16
      +18

      это был крик подсознания автора: "зачем я это написал".


  1. ovalsky
    13.12.2022 13:57
    +3

    так и не раскрыл тему - почему же редис. Такое и в пострегсе можно хранить, да sqlite вполне тянет, да и вообще без БД можно обойтись))) :
    users = dict()
    users[user1] = 'online'


  1. TimsTims
    13.12.2022 17:33
    +11

    Минус за низкий технический уровень. Автору ещё расти и расти, главное не останавливаться, а мы поможем! Поэтому постараюсь конкретно по пунктам:

    1) в статье действительно нет ответа на вопрос зачем редис, и почему он тут нужен. Да, он хранит пару ключ значение, но его фишка в том, что он делает это быстро, а ещё много других приколюх, например автоудаление (после протухания).

    2) модуляция работы сайта не получилась. Сайт это все несколько сложнее. Пользователь открывает страницу, загружает её, и его браузер отключается

    Вы не можете знать, закрыл ли он браузер, пользуется ли он ещё им, итд. Поэтому у вас признак online/offline будет скакать туда-сюда постоянно.

    Плюс из за особенностей key:value вам нужно не просто хранить пользователей, а как-то их различать (что если я открою сразу несколько вкладок в браузере, а какие-то закрою, буду ли я оффлайн?)

    3) в скриншоте у вас ошибка offline. Вы ее сами заметили, но вам настолько было лень переделать свой скриншот (который можно повторить за 30 секунд), что вам проще было написать извинение в статье. Это прямо неуважение к читателям, не надо так. Возьмите и исправьте)

    4) ну и сама тема редиса не раскрыта. Он гораздо больше чем key value storage. Он хранит всё в оперативной памяти, от этого он очень быстр, как молния, но и гигабайты данных там не похранишь - оперативная память очень скоро закончится. Ещё его можно использовать как небольшую очередь сообщений (но для этого лучше использовать другие решения), про автоудаление данных писал выше (например хранить сессию пользователя в редисе не дольше 2 часов. Все остальные вопросы по контролю этого времени редис возьмёт на себя).


    1. ovalsky
      13.12.2022 23:43
      -3

      Ну а там уже вкратце, сравнительно, можно пройтись и по всем брокерам сообщений и почему именно этот использовался. Вот и нарисовалась интересная познавательная, как ТС, имея своё видение и применяя инструменты определённым образом, для достижения нужного результата, если таковое имелось. Имы надеемся, что ТС не желал пересказать банальную истину, прокачав по быстрому карму или что там даёт написание статьи.


  1. nronnie
    13.12.2022 17:43
    +3

    через пару дней я уже спокойно писал SQL запросы

    Ой-вэй, батенька, это вы еще нормальных запросов, сложней чем select ... from ... where ... просто не видели :)


    1. zlat_zlat
      13.12.2022 19:07
      +1

      Тем не менее, простые запросы являются подмножеством всех запросов, поэтому автор не врёт!)


  1. Fafhrd
    13.12.2022 21:29
    +4

    POSTGREE -- Persistent Opensource Strong Transactional Geo Relational Enterprise Engine


  1. bBars
    14.12.2022 02:16

    Ожидал увидеть ответ на вопрос в духе «зачем бегать по сокетам за данными, когда их можно организовать в монолите прямо на уровне приложения, используя вот такую крутую библиотеку для языка X, которая поддерживает всё то же, что умеет редис, при этом она воот такая малюсенькая и аккуратная». Я как-то рассматривал вариант частичного отказа от мускля — в одном узком месте хотел общаться со хранилищем иннодб как-то покороче. Но до практики не дошло, хотя до сих пор любопытно проверить и померить.

    Редис — не просто не только key-val хранилище, не только протухание ключей, но он ещё и на диск скидывать умеет, и структур данных много, и дока замечательная, и даже песочница в вебе.


  1. pavelsc
    15.12.2022 11:34

    Разочарованию нет предела, я думал на питоне напишут key value хранилище, к которому любой редис библиотекой подключиться можно :)


    1. TimsTims
      16.12.2022 13:43

      А я думал, что здесь напишут что-то такое, чего я не знал о Redis. Кто-то подумал, что напишут, как написать игру на Redis в консоли. Как говорится:

      Ваши ожидания - ваши проблемы.


  1. NotMusk
    16.12.2022 12:09

    Основное использование Redis - это хранилище сессий на сервере. Например, зашёл к тебе новый пользователь залогинился. Ты генерируешь ему хеш, пишешь его в куки или хранилище сеанса браузера. А в Redis скидываешь пару hash:user. Теперь, когда пользователь снова сделает к тебе запрос, ты читаешь хэш из его куков и запрашиваешь у Redis значение по этому хэшу и получаешь пользователя. Естественно, ставишь время протухания и ещё желательно генерировать хэш основываясь на метаданных браузера, что-бы злоумышленник не утянул куки пользователя и не вошёл под этим хэшем с другой машины/браузера.

    Таким образом получается очень простая модель взаимодействия без sql- запросов, быстрая и абстрагированная от твоего сервиса. Например, если тебе нужно пересоздать контейнер для внесения изменений, пользователи сессии не потеряют, так как хранятся они в Redis, а не в твоём сервисе.