使用Redis缓存Real TIme单页面应用程序中使用的数据

时间:2016-05-28 20:37:26

标签: mysql laravel redis real-time ioredis

我有一个Web应用程序,它具有正常的功能,用户设置等,这些都存储在MYSQL中,用户等......

应用程序a的一个特定部分是供用户编辑的数据表。

我想在多个用户之间实时创建此表。即多个用户可以打开页面编辑数据,并查看编辑表格的其他用户实时完成的更改。

我的想法是在Redis中缓存表中的数据,然后在redis中执行所有操作,就像保持所有客户端都是最新的一样。

一旦所有连接都关闭了特定的表,将数据保存回mysql以保持持久性,我知道Redis可以用作持久的NoSQL数据库,但由于RAM是有限的而我所有的其他数据都存储在MYSQL中,mysql似乎一个更好的选择。

这是redis的正确用例吗?我的想法是否正确?

1 个答案:

答案 0 :(得分:2)

这取决于可扩展性。您要处理的记录数以及用于保存它的结构。

我将讨论使用redis的优缺点。决定取决于你。

使用redis的优点:

    1) It can handle heavy writes and reads in comparison with MYSQL
    2) It has flexible structures (hashmap, sorted set etc) which can 
localise your writes instead of blocking the whole table.
    3) Read queries will be much faster as it is served from cache.

使用redis的缺点:

    1) Maintaining transactions. What happens if both users try to access a 
    particular cell at a time? Do you have a right data structure in redis to 
    handle this case?
    2) What if the data is huge? It will exceed the memory limit. 
    3) What happens if there is a outage?
    4) If you plan for persistence of redis. Say using RDB or AOF. Will you 
    handle those 5-10 seconds of downtime?

需要关注的事项:

1)您要处理多少数据?假设一个10000行的表,redis中的10列需要1 GB的内存(只是假设实际内存将非常少)。如果你的redis是10GB集群,那么你只能处理10个这样的表。算一下你将要使用多少rows * column * live tables以及它消耗的内存。

2)Redis对http://redis.io/topics/memory-optimization范围内的数据使用压缩。假设您决定使用散列图保存表,您有两个选项,对于每个列,您可以使用散列映射,或者对于每个行,您可以使用散列映射。第二种选择将是最佳选择。因为存储1000(散列图 - >行)* 20(每个散列映射中的记录 - >列)将比以其他方式存储少10倍的内存。同样,如果更改单元格,您可以在20个值内的hashmap中进行本地化。

3)将数据加载回MYSQL。这会发生多久?如果您的工作量很高,那么MYSQL开始对其他操作表现更差。

4)您如何处理多个客户通知更改?你会加载整个表或更改的部分吗?加载更改的部分将是最佳的部分。在这种情况下,您将在哪里维护已更改的单元格列表?

使用这些问题评估您的系统,您会发现它是否可行。