何时在 PHP 应用程序中使用 Redis 而不是 MySQL?

Posted

技术标签:

【中文标题】何时在 PHP 应用程序中使用 Redis 而不是 MySQL?【英文标题】:When to use Redis instead of MySQL for PHP applications? 【发布时间】:2011-04-27 08:55:22 【问题描述】:

我一直在研究 Redis。它看起来很有趣。但是从实际的角度来看,在什么情况下使用 Redis 而不是 mysql 更好?

【问题讨论】:

你读过那个:mysqlperformanceblog.com/2009/08/27/looking-at-redis 吗?我不明白所有(我是法国人),但它似乎很有趣。 谢谢。是的,这很有趣。不过,我仍然不确定实际应用。 虽然不是 Redis 的替代品,但您应该记住 MySQL 支持哈希索引(默认是较慢但可排序的 btree)。然后,您可以通过增加 my.ini 值 key_buffer_size 将所有密钥存储在内存中。这可能不会取代 redis,但请记住,您可以使用这些东西更接近 NoSQL 性能。在将 Redis 添加到堆栈之前,您可以考虑这些。 【参考方案1】:

忽略整个 NoSQL 与 SQL 的争论,我认为最好的方法是将它们结合起来。换句话说,将 MySQL 用于系统的某些部分(复杂查找、事务),将 redis 用于其他部分(性能、计数器等)。

根据我的经验,与可伸缩性相关的性能问题(大量用户...)最终会迫使您添加某种缓存以从 MySQL 服务器中移除负载,而 redis/memcached 非常擅长于此。

【讨论】:

【参考方案2】:

我不是 Redis 专家,但从我收集到的信息来看,两者都有很大的不同。雷迪斯:

不是关系数据库(没有花哨的数据组织) 将所有内容存储在内存中(速度更快,空间更小,在发生崩溃时可能不太安全) 在各种网络主机上的部署较少(如果您不是自己托管)

我认为,当您拥有少量不需要 MySQL 提供的关系结构并且需要快速访问的数据时,您可能希望使用 Redis。例如,这可能是需要经常快速访问的动态 Web 界面中的会话数据。

Redis 也可以用作一些 MySQL 数据的缓存,这些数据将被非常频繁地访问(即:在用户登录时加载它)。

我认为你问错了问题,你应该问自己哪个更适合应用程序,而不是哪个应用程序适合系统;)

【讨论】:

谢谢 - 也许我问错了问题,但如果我不明白什么时候使用 Redis 比使用 MySQL 更合适,我无法回答任何一个问题!【参考方案3】:

MySQL 是一种关系数据存储。如果配置(例如使用 innodb 表),MySQL 是一个可靠 数据存储提供ACID 事务。

Redis 是一个 NoSQL 数据库。它更快(如果使用正确),因为它将速度与可靠性(很少使用 fsync 运行,因为这会极大地损害性能)和事务(可以用SETNX)来近似 - 慢慢地 - 。

Redis has some very neat features,例如集合、列表和排序列表。

These slides on Redis 列出统计信息收集和会话管理作为示例。还有一个用redis写的twitterclone作为例子,但这并不意味着twitter使用redis(twitter useMySQL with大量memcache缓存)。

【讨论】:

【参考方案4】:

MySql -

1) 结构化数据 2) 酸 3) 繁重的事务和查找。

Redis -

1) 非结构化数据 2) 简单快速的查找。例如 - 会话的令牌 3)将其用于缓存层。

【讨论】:

【参考方案5】:

Redis、SQL (+NoSQL) 各有优劣,经常并存:

Redis - 将局部变量移至单独的应用程序 易于从局部变量/原型迁移 永久存储 多个用户/应用程序都看到相同的数据 可扩展性 故障转移 (-) 很难对数据进行更高级的查询/问题 NoSQL 将原始数据转储到“数据库” 所有/大部分 Redis 功能 (-) 与 SQL 相比,执行高级查询更难 SQL 数据之间的高级查询 所有/大部分 Redis 功能 (-) 需要将数据放入“模式”(想想工作表/Excel) (-) 输入/输出简单值比 Redis/NoSQL 更难

(不同的 SQL/NoSQL 解决方案可能会有所不同。您应该阅读 CAP theorem 和 ACID,了解为什么一个系统不能同时为您提供所有服务)

【讨论】:

【参考方案6】:

根据官网介绍,Redis 是一个开源(BSD 许可)的内存数据结构存储,用作数据库、缓存和消息代理。实际上,Redis 是一种高级键值存储。它实际上是超快的,具有惊人的高吞吐量,因为它每秒可以执行大约 110000 次设置,每秒大约 81000 次获取。它还支持一组非常丰富的数据类型来存储。事实上,Redis 每次都将数据保存在内存中,但也将数据持久保存在磁盘数据库中。因此,它带来了一个权衡:惊人的速度和数据集的大小限制(根据内存)。在本文中,为了与 MySQL 进行一些基准比较,我们将仅使用 Redis 作为缓存引擎。

在这里阅读:Redis vs MySQL Benchmarks

【讨论】:

以上是关于何时在 PHP 应用程序中使用 Redis 而不是 MySQL?的主要内容,如果未能解决你的问题,请参考以下文章

何时更喜欢 XAMPP 而不是 Linux、Apache、MySQL 和 PHP 的完整安装

为啥以及何时在 Spring 中使用 @Inject 而不是 @Autowired? [复制]

何时在 Flutter 中使用新的 Screens 而不是 TabBarView

php redis 怎么删除hash,而不是只删除了单个或多个域

何时使用 Helpers 而不是 Partials

何时在 F# 中使用序列而不是列表?