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