Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How is Redis used in Trello?

Tags:

redis

I understand that, roughly speaking, Trello uses Redis for a transient data store.

Is anyone able to elaborate further on the part it plays in the application?

like image 546
William Avatar asked Dec 20 '11 17:12

William


2 Answers

We use Redis on Trello for ephemeral data that we would be okay with losing. We do not persist the data in Redis to disk, and we use it allkeys-lru, so we only store things there can be kicked out at any time with only very minor inconvenience to users (e.g. momentarily seeing an incorrect user status). That being said, we give it more than 5x the space it needs to store its actual working set and choose from 10 keys for expiry, so we really never see anything get kicked out that we're using.

  1. It's our pubsub server. When a user does something to a board or a card, we want to send a message with that delta to all websocket-connected clients that are subscribed to the object that changed, so all of our Node processes are subscribed to a pubsub channel that propagates those messages, and they propagate that out to the appropriately permissioned and subscribed websockets.

  2. We SORT OF use it to back socket.io, but since we only use the websockets, and since socket.io is too chatty to scale like we need it to at the moment, we have a patch that disables all but the one channel that is necessary to us.

  3. For our users who don't have websockets, we have to keep a list of the actions that have happened on each object channel since the user's last poll request. For that we use a list which we cap at the most recent 100 elements, and an auxilary counter of how many elements have been added to the list since it was created. So when we're answering a poll request from such a browser, we can check the last element it reports that it has seen, and only send down any messages that have been added to the queue since then. So that gets a poll request down to just a permissions check and a single Redis key check in most cases, which is very fast.

  4. We store some ephemeral data about the active status of connected users in Redis, because that data changes frequently and it is not necessary to persist it to disk.

  5. We store short-lived keys to support OAuth logins in Redis.

We love Redis; once you have an instance of it up and running, you want to use it for all kinds of things. The only real trouble we have had with it is with slow-consuming clients eating up the available space.

We use MongoDB for our more traditional database needs.

like image 142
Brett Avatar answered Nov 16 '22 02:11

Brett


Trello uses Redis with Socket.IO (RedisStore) for scaling, with the following two features:

  • key-value store, to set and get values for a connected client
  • as a pub-sub service

Resources:

Look at the code for RedisStore in Socket.IO here: https://github.com/LearnBoost/socket.io/blob/master/lib/stores/redis.js

Example of Socket.IO with RedisStore: http://www.ranu.com.ar/2011/11/redisstore-and-rooms-with-socketio.html

like image 30
alessioalex Avatar answered Nov 16 '22 03:11

alessioalex