Pet*_*ete 9 ruby architecture html5 redis ruby-on-rails-3
我正在开发一个具有多个音乐播放列表的应用程序,每个播放列表和播放器的视图.
我已经在我的系统中使用HTML5历史记录API(用于其他功能),并将进一步使用它来防止请求之间的页面重新加载,从而停止每页上的音乐.
我仍然坚持管理玩家将在视图之间播放的曲目的最佳方法.目前,正如您所料,用户点击链接,获取曲目列表.曲目被加载到播放器中并按顺序播放,简单.然而,随着连续播放音乐,我需要确保正确播放曲目的播放列表,尽管页面上的内容不断变化,现在它是动态URL.
然而,当用户确实导航到另一页面时,按下在新播放列表中的轨道上播放,我需要能够将该项目加载到播放器中并在用户继续导航时有效地加载到播放列表的其余部分.
我正在使用Redis存储播放列表的曲目ID列表,以便快速参考以减少曲目之间的延迟.因此,我为每个播放列表设置了不同的Redis.我还根据当前曲目播放构建了我的Next和Previous Track API调用,以便Redis集中的下一首曲目可以加载到播放器中.
如上所述,虽然我无法决定引用哪个播放列表当前正在播放的最佳方式,因此播放器知道哪个Redis设置为从中调用音轨.我的想法给我留下了一些不同的想法:
a)HTML5自定义数据属性 - 我可以将当前播放的播放列表设置为播放器上的数据属性,并在何时更新.然后我可以在决定哪个Redis设置为加载我的下一个曲目时引用此属性.
或者,我可以将当前播放列表以及所有轨道(及其属性)作为JSON对象转储到页面上的数据属性中.播放列表可能长达数千首曲目但是因为源代码看起来很糟糕,更不用说可能出现的性能问题了.我对吗?
b)LocalStorage - 跨浏览器支持有限.在这种特殊情况下,对此解决方案的支持越多越好.尽管如此,我可以在用户浏览器中保存当前播放列表.这让我想知道在LocalStorage中保存跟踪JSON对象是否也是可行的,以防止额外的数据库调用.
c)在会话中 - 我可以更新会话以存储当前正在播放的播放列表的变量.
d)Redis - 我可以扩展我对Redis的使用,以保存一个引用当前播放列表名称的字符串.然后我可以在每个下一个/上一个跟踪呼叫之间进行检查.
通过写这个问题,我已经更好地了解了我将要采取的路线,但如果有人对这种情况有任何建议,那么我很乐意听取.
谢谢.
更新:我已经实现了95%的使用Redis的解决方案.虽然页面需要大约10秒才能加载,但我遇到了一些性能问题.一点也不好.
基本上每个用户都有2个播放列表:Current和Armed.每个请求都会将轨道ID加载到Redis Armed播放列表中,如果在轨道上按下播放按钮,则当前Redis播放列表将过期并替换为Armed播放列表.
然后,我的下一个和上一个按钮只需获取当前播放列表中下一首或上一首曲目的ID,然后加载播放器的音乐源.这个概念很好用,我很满意.
但是,如上所述,页面请求之间的性能很慢,需要显着改进.我的SQL被优化了,我只是提取所需的属性,并且我有必要的SQL索引,所以我正在寻找其他替代方案.
我正在考虑的选项:
如果在新页面上单击了某个曲目,则仅填充"武装"播放列表.如果用户实际上不想收听其中一个新曲目,这将节省额外的处理.
更多地使用Redis并将精益轨道对象存储在Redis播放列表中而不仅仅是轨道ID中 - 性能滞后主要在页面请求之间,而不是在实际播放轨道和导航播放列表中.
使用Redis主播放列表,其中包含Current和Armed播放列表可以从中选择的所有应用程序轨道.这可以通过每小时的rake任务来维护,并且可以防止对页面请求进行冗长的DB调用.我只是担心这会在服务器上的内存使用量和数据库中的磁道数量方面达到多大程度.
我建议 c) 在会议中。
在客户端和服务器端都可以相对轻松地访问会话数据。
用特定用户数据填充 Redis 缓存并不能很好地扩展。
LocalStorage - 正确,目前对于大部分用户来说这将失败。
CustomData 属性 - 如前所述,简直是一团糟。
只是我的2分钱。
归档时间: |
|
查看次数: |
1404 次 |
最近记录: |