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

标签 mysql laravel redis real-time ioredis

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

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

我想让这个表在多个用户之间实时显示。即多个用户可以打开页面编辑数据并实时查看其他用户编辑表格所做的更改。

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

一旦特定表的所有连接关闭,将数据保存回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) 您要处理多少数据?假设 Redis 中一个 10000 行 10 列的表需要 1 GB 内存(只是假设实际内存会少得多)。如果您的 Redis 是 10GB 集群,那么您只能处理 10 个这样的表。计算一下您将要使用的行 * 列 * 事件表数量及其消耗的内存。

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

3) 将数据加载回 MYSQL。这种情况会多久发生一次?如果您的工作负载很高,那么 MYSQL 对于其他操作的性能就会开始变差。

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

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

关于mysql - 使用 Redis 缓存实时单页应用程序中使用的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37503544/

相关文章:

Redis 转储.rdb |不是默认目录

java - 小型 JSP 应用程序不起作用

php - 按电子邮件分组并获取组中最早创建的日期 - Laravel Eloquent

mysql - 如何添加 SELECT 语句结果?

javascript - 在 Laravel/Vue.js 项目中共享静态/配置数据的最佳方式是什么

php - Laravel SAIL_XDEBUG_MODE 不适用于调试网络调用

redis-cli : Unrecognized option or bad number of args for: '--tls'

node.js - 无法在 app.get 方法中连接 redis

mysql - 带有空白变量的 Where 子句 Laravel

Mysql - 查找临时磁盘表的原因