使用Redis存储会话安全吗?

115

我目前使用 MySql 存储我的会话信息。它运行良好,但速度有点慢。

有人建议我使用 Redis,但我在想这是否是个好主意,因为我听说 Redis 会延迟写入操作。我有些担心,因为会话需要实时更新。

有没有人遇到过类似的问题?


1
由于Redis表示它具有可选的耐久性,所以如果您选择在硬盘上进行持久化,那么我会认为使用它是安全的。然而,对于会话数据-我肯定会将它们保存到RAM中(这意味着我不会担心整个过程的耐久性部分)。如果您丢失会话数据,最糟糕的情况是用户注销登录。 - N.B.
1
是的,但这是我的要求的一部分,用户不应该需要重新登录,顺便说一下,有些用户的数据在用户未登录(访客用户)时会持久化到会话中。他们将使用启用了日志记录和/或备份的Redis RAM。如果我们丢失了一些会话,那是可以接受的。 - Trent
1
我的主要关注点是关于延迟写入的问题,如果用户登录并且会话被延迟写入,那么他将被重定向但未登录。 - Trent
2
想象一个电子商务网站,如果会话丢失,当前购物车也会丢失,这并不可怕,但对用户来说可能有些奇怪。访客用户仅通过会话进行识别,因此无法恢复其购物车。 - Boris Guéry
1
@BorisGuéry - 我并不是持反对意见,但如果需要提高性能-当出现问题时必须做出妥协。是的,用户突然被注销会很奇怪,这是肯定的-但问题是预计会发生多少次?如果每年只有一两次所有Redis节点都会崩溃,那么我认为没有理由为了整个集群不可用的少数孤立时间而破坏性能。但这只是我的想法。 - N.B.
显示剩余5条评论
3个回答

171

Redis非常适合用来存储会话。所有操作都在内存中进行,所以读写速度很快。

第二个方面是会话状态的持久性。 Redis让您可以以多种方式将会话状态持久化到硬盘中。您可以访问http://redis.io/topics/persistence了解更多信息,但在较高层次上,以下是您的选项 -

  1. 如果您不能承受任何会话丢失,请在配置文件中设置appendfsync always。通过这种方式,Redis保证任何写入操作都保存到磁盘上。缺点是写入操作会变慢。
  2. 如果您可以容忍大约1秒钟的数据丢失,请使用appendfsync everysec。这样可以在合理的数据保证下获得良好的性能。

20

这个问题实际上与实时会话有关,部分原因是由于误解“延迟写入操作”的短语而引起的。虽然在评论中最终澄清了细节,但我只想让它变得极其清晰明了...

您在实现实时会话方面不会遇到任何问题。

Redis是一个内存键值存储器,可选择将数据持久化到磁盘上。“延迟写入操作”是指对磁盘的写入,而不是一般的数据库,后者存在于内存中。如果你设置一个键/值对,你可以立即获取它(即实时获取)。你选择的持久性策略(你延迟写入多少)将决定在崩溃时可以丢失多少数据的上限。


14

基本上有两种主要类型可用:异步快照和fsync()。它们分别被称为RDB和AOF。更多关于持久性模式的官方页面

守护进程的信号处理在接收到例如SIGTERM时会同步到磁盘,因此数据将在重新启动后仍然存在。即使使用默认设置(RDB快照),我认为守护进程或操作系统在崩溃之前也必须崩溃,才会看到完整性损坏。

AOF设置使用一个只追加文件,记录服务器接收的命令,并且从保存的文件开始,在冷启动时从头重建数据库。默认的磁盘同步策略每秒刷新一次(如果我没记错的话),但可以设置为在每个命令上锁定并写入。

同时使用快照和增量日志似乎提供了长期的“不介意我错过几秒钟数据”的方法以及更安全但成本较高的增量日志。Redis支持开箱即用的集群,因此似乎也可以进行复制。

我自己使用默认的RDB设置,并将快照保存到远程FTP。我还没有看到导致数据丢失的故障。可能会发生急性硬件故障或停电,但我托管在VPS上,这种情况的几率很小 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接