2012-04-23 36 views
63

我目前使用db(mysql)来存储我的会话。它很好用,但速度有点慢。与Redis存储会话安全性如何?

我被要求使用Redis,但我想知道这是不是一个好主意,因为我听说Redis延迟了写操作,所以我有点害怕因为会话需要真实时间。

您是否遇到过这样的问题?

+1

由于Redis说它具有可选的耐用性,那么我认为如果您选择硬盘上的持久性,则可以使用它。但是,对于会话数据 - 我肯定会将它们保存到RAM中(这意味着我不会担心整个考验中的耐久性部分)。如果您丢失会话数据,应该发生的最糟糕的情况是让您的用户注销。 – 2012-04-23 10:22:23

+1

是的,但这是我的要求的一部分,用户不应该必须登录回来,通过一些用户数据持久会话,而用户没有登录(访客用户)的方式。他们会使用Redis RAM,但启用日志记录和/或备份。如果我们失去了一些会议,这是可接受的 – Trent 2012-04-23 10:28:09

+0

那么,如果您使用的是硬盘存储,那么使用Redis有什么意义?它可能会延迟实际提交到磁盘以提高性能,如果按这种方式进行配置,MySQL可能会做同样的事情。你有没有考虑将MySQL移到更快的I/O子系统?如果Redis不得不使用相同的I/O子系统,那么在同样的硬件上,Redis将不可能神奇地工作50倍。 – 2012-04-23 10:30:32

回答

110

Redis非常适合存储会话。所有操作都在内存中执行,因此读取和写入将会很快。

第二个方面是会话状态的持久性。 Redis为您将会话状态持久保存到硬盘提供了很大的灵活性。你可以通过http://redis.io/topics/persistence了解更多,但在较高的水平,这是你的选择 -

  1. 如果你不能承受失去任何会话,在配置文件中设置appendfsync always。借此,Redis保证任何写入操作都被保存到磁盘。缺点是写操作会变慢。
  2. 如果您没有损失大约1秒的数据,请使用appendfsync everysec。这将给予卓越的性能与合理的数据保证
9

基本上有两种主要类型可用:异步snapsnots和fsync()。它们分别被称为RDB和AOF。更多关于persistence modes on the official page

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

AOF设置使用Append Only File记录服务器接收的命令,并从保存的文件中重新从头开始重新创建数据库。默认的磁盘同步策略是每秒刷新一次(IIRC),但可以设置为在每个命令上锁定和写入。

同时使用快照和增量日志似乎提供了一个长期的如果我错过了几秒钟的数据方法与一个更安全,但昂贵增量日志。 Redis支持开箱即用,因此复制也可以完成。

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