Статьи

SubRedis: ключи в Redis

Мы активно используем Redis для Quepid , нашего холста для совместной работы в области поиска. Redis — это удобный и эффективный способ взаимодействия со структурами данных в памяти. На самом деле, мы использовали его в качестве нашей основной базы данных.

Одной из проблем, которая кажется нам проблематичной, является изоляция и сегментирование частей нашего приложения в Redis. Я хочу дать каждой части бэкенда Quepid безопасную и надежную песочницу Redis без запуска 10 экземпляров Redis на моем компьютере. Например, если база данных пользователей выполняет flushdb, я хочу, чтобы она только сбрасывала набор пользователей. Точно так же я не хочу беспокоиться о том, что ключи в пользовательской базе данных будут конфликтовать с ключами в базе данных рейтинг-запросов. Изоляция это хорошая вещь!

Представляем SubRedis

Итак, я создал Subredis — простую оболочку ключей Python для Redis. Короче говоря, SubRedis позволяет вам сделать это:

r = redis.from_url("redis://localhost:6379")
sub = SubRedis("keyspacename", r) #My very own Redis!
sub.set("foo", "bar")
sub.get("foo")
sub.flushdb()

Каждый SubRedis играет полностью в своем собственном пространстве клавиш. Например, здесь «flushdb» будет сбрасывать только ключи в «keyspacename», а ключ «foo» будет существовать только здесь, в этом пространстве ключей.

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

queryRedis = SubRedis(userId + "-queries", redis)

И альт, у каждого пользователя есть свой собственный экземпляр Redis, готовый к работе и полностью принадлежащий им. Более того, нет причин, по которым SubRedis не может в свою очередь агрегировать сам SubRedis, достигая произвольных уровней иерархии:

queryRedis = SubRedis(userId + "-queries", redis)
ratingsRedis = SubRedis(queryId + "-ratings", queryRedis)

Довольно мощный материал!

Подробнее

Subredis — это простая оболочка, все, что она делает, это добавляет имя «имя-ключа» к ключам, которые она получает. Таким образом, вызов redis-cli для «keys *» перед flushdb, приведенным выше, даст:

keyspacename_foo

SubRedis реализует большинство методов StrictRedis в Redispy с несколькими исключениями, когда может быть невозможно перехватить ключи. Каждая структура данных поддерживается. Транзакции поддерживаются через конвейеры. В настоящее время мы не поддерживаем многие из методов администратора для безопасности (например, bgsave и т. Д.), И сценарии Lua не осуществимы при таком подходе. Поскольку SubRedis использует разделитель «_», не рекомендуется создавать имена ключей с «_» в них.

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

So if you’re a Redis user, give SubRedis a try! Simply pip install subredis and let me know what you think (and if you find bugs!). I hope to blog about the fun Python metaprogramming that made this relatively simple to perform in the future.

And if you’re one of those people still wondering what data structure is right for your job, let us know! It may be Redis, or it could be any number of other things we specialize in (Cassandra, Solr, Hadoop, etc).