我理解,粗略地说,Trello使用Redis作为瞬态数据存储。
是否有人能够进一步阐述它在应用程序中扮演的角色?
答案 0 :(得分:26)
我们在Trello上使用Redis作为短暂数据,我们可以输掉。我们不会将Redis中的数据保存到磁盘,我们使用它allkeys-lru,因此我们只存储可以在任何时间启动的内容,只会给用户带来非常小的不便(例如,暂时看到不正确的用户状态) 。话虽这么说,我们给它的存储空间超过了存储其实际工作集所需的空间的5倍,并选择10个键到期,所以我们真的从来没有看到任何被我们正在使用的东西。
这是我们的pubsub服务器。当用户对板或卡执行某些操作时,我们希望将具有该增量的消息发送到订阅了更改的对象的所有websocket连接的客户端,因此我们的所有Node进程都订阅了一个传播的pubsub通道这些消息,并将它传播到适当的许可和订阅的websockets。
我们排序使用它来支持socket.io,但由于我们只使用websockets,并且因为socket.io是too chatty,所以我们现在需要它来扩展,我们有一个补丁,禁用除我们所需的一个通道以外的所有通道。
对于没有websockets的用户,我们必须保留自用户上次轮询请求以来每个对象通道上发生的操作的列表。为此我们使用一个列表,我们在最近的100个元素上限,以及一个辅助计数器,表示自创建以来已将多少元素添加到列表中。因此,当我们回答来自此类浏览器的轮询请求时,我们可以检查它所报告的最后一个元素,并且只发送自那时以来已添加到队列中的所有消息。因此,在大多数情况下,获取轮询请求只需要权限检查和单个Redis密钥检查,这非常快。
我们在Redis中存储了一些关于连接用户的活动状态的短暂数据,因为这些数据经常变化而且没有必要将其持久保存到磁盘。
我们存储短期密钥以支持Redis中的OAuth登录。
我们爱Redis;一旦你有一个实例启动并运行,你想用它来做各种事情。我们遇到的唯一真正麻烦是slow-consuming clients eating up the available space。
我们使用MongoDB来满足更传统的数据库需求。
答案 1 :(得分:1)
Trello使用Redis和Socket.IO(RedisStore)进行缩放,具有以下两个功能:
资源:
在这里查看Socket.IO中RedisStore的代码:https://github.com/LearnBoost/socket.io/blob/master/lib/stores/redis.js
带RedisStore的Socket.IO示例:http://www.ranu.com.ar/2011/11/redisstore-and-rooms-with-socketio.html