1

对于我正在构建的应用程序,我们使用 Redis 作为会话存储介质。

前几天,我们的一位测试人员注意到,当他注销并立即尝试访问受保护的 URI 时(在注销后大约 1 秒内),他的旧会话数据仍在使用中。

阶梯式:

  1. 用户以账户 A 登录。
  2. 用户注销。
  3. 用户立即访问受保护的 URI。
  4. 用户再次以账户 A 登录。

我认为正在发生的事情是这样的:

  1. 用户注销,因此应用程序清除用户的会话并将空会话发送到 Redis 进行存储。
  2. 在更改“生效”之前,用户访问不同的资源(例如,登录表单或受保护的 URI)。
  3. 应用程序从 Redis 请求会话,它仍然包含登录的会话值。
  4. 应用程序将更新后的会话发送回 Redis,覆盖注销的会话。

这是一个正确的诊断吗?SETRedis 在接受 a和实际更新存储值之间是否有延迟?还是我应该调查我的应用程序逻辑中的某些内容?

4

1 回答 1

2

SET 命令的执行没有延迟。如果 redis-server 成功返回,并且您的客户端库报告成功 - 您可以确定 redis 已写入数据。

我建议查看您的应用程序堆栈。也许会话处理程序正在异步使会话无效?

于 2012-10-25T15:25:59.890 回答