我目前正在使用 MySql 来存储我的会话。它工作得很好,但它有点慢。
我被要求使用 Redis,但我想知道这是否是个好主意,因为我听说 Redis 会延迟写入操作。我有点害怕,因为会话需要是实时的。
有没有人遇到过这样的问题?
Redis 非常适合存储会话。所有操作都在内存中执行,因此读写速度很快。
第二个方面是会话状态的持久性。Redis 在如何将会话状态持久保存到硬盘方面为您提供了很大的灵活性。您可以通过http://redis.io/topics/persistence了解更多信息,但在高层次上,这是您的选择 -
appendfsync always
请在配置文件中进行设置。有了这个,Redis 保证任何写操作都保存到磁盘上。缺点是写操作会比较慢。appendfsync everysec
. 这将在合理的数据保证下提供出色的性能基本上有两种主要类型可用:异步 snapsnots 和fsync()
. 它们分别称为 RDB 和 AOF。更多关于官方页面上的持久化模式。
例如,当接收到 SIGTERM 时,守护进程的信号处理会同步到磁盘,因此重启后数据仍然存在。我认为守护程序或操作系统必须在您看到完整性损坏之前崩溃,即使使用默认设置(RDB 快照)也是如此。
AOF 设置使用 Append Only File 记录服务器接收到的命令,并在冷启动时从保存的文件从头开始重新创建 DB。默认的磁盘同步策略是每秒刷新一次 (IIRC),但可以设置为在每个命令上锁定和写入。
同时使用快照和增量日志似乎提供了一种长期的不介意如果我错过了几秒钟的数据的方法,它具有更安全但成本更高的增量日志。Redis 支持开箱即用的集群,因此看起来也可以进行复制。
我自己使用默认的 RDB 设置并将快照保存到远程 FTP。我还没有看到导致数据丢失的故障。最有可能发生急性硬件故障或停电,但我托管在 VPS 上。发生这种情况的可能性很小:)
这个问题实际上是关于实时会话的,似乎部分原因是对“延迟写入操作”这个短语的误解虽然细节最终在评论中被梳理出来,但我只是想让它超级清楚。 ..
实施实时会话不会有任何问题。
Redis 是一种内存键值存储,具有可选的磁盘持久性。“延迟写入操作”是指写入磁盘,而不是一般的数据库,它存在于内存中。如果您设置一个键/值对,您可以立即获取它(即实时)。您选择的关于持久性的策略(延迟写入的时间)将决定崩溃中可能丢失多少数据的上限。