使用 Redis 缓存实时单页应用程序中使用的数据

Using Redis to cache data that is in use in a Real TIme Single Page App

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

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

我想让这个 table 实时,跨多个用户。即多个用户可以打开页面编辑数据并实时查看其他用户编辑 table.

所做的更改

我的想法是在 Redis 中缓存 table 的数据,然后在 Redis 中执行所有操作,比如让所有客户端保持最新状态。

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

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

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

我将讨论使用 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) 您要处理多少数据?假设 table 的 10000 行和 10 列在 redis 中需要 1 GB 的内存(只是假设实际内存会少得多)。如果你的 redis 是 10GB 集群那么你只能处理 10 个这样的 tables。计算一下您将使用多少 rows * column * live tables 以及它消耗的内存。

2) Redis 对http://redis.io/topics/memory-optimization 范围内的数据使用压缩。假设您决定使用散列图保存 table,您有两个选择,对于每一列您可以有一个散列图,或者对于每一行您可以有一个散列图。第二种选择将是最佳选择。因为存储 1000 (hashmaps -> rows) * 20 (records in each hash map -> columns) 比以其他方式存储占用的内存少 10 倍。同样以这种方式,如果更改了单元格,您可以在 20 个值以内的哈希图中进行本地化。

3) 将数据加载回您的 MYSQL。这将多久发生一次?如果您的工作负载很高,那么 MYSQL 开始对其他操作执行更差。

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

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