【问题标题】:Data stored in Spring (HTTP) Session is not removed from Redis during destroy在销毁期间不会从 Redis 中删除存储在 Spring (HTTP) Session 中的数据
【发布时间】:2015-03-12 00:49:36
【问题描述】:

我正在使用新发布的 Spring Session 组件进行 PoC。这是由 Redis 存储库备份的,其中 Session 和存储在 session 中的对象/数据都被持久化。

  1. 在应用程序中创建了会话
  2. 在 Redis CLI 中运行“Keys *”命令并看到一个新条目(如“spring:session:sessions:6b55103a-baf5-4a05-a127-3a9cfa15c164”)
  3. 从应用程序中,向会话添加了一个自定义 bean
  4. 在 Redis CLI 中运行“Keys *”命令并看到一个新条目 这个 bean(如 "\xac\xed\x00\x05t\x00\tcustomer1" ,因为 bean 有一个值为“customer1”的字符串)
  5. 我已经配置了 30 秒的自动到期时间,并让应用程序在这段时间内未使用
  6. sessionDestroyEvent 被触发并在实现 ApplicationListener 的监听器中被捕获
  7. 在 Redis CLI 中运行“Keys *”命令,现在第一个创建 会话条目消失了,但是自定义 bean 对象 (customer1) 仍然留在 Redis 中

问题

清理 Redis Store 是用户的责任吗?如果我有 许多数据元素存储在我的会话中,我是否必须手动操作 在会话销毁期间从 redis 存储中清除它们(注销和 超时事件)。

更新

虽然我发布了这个问题并返回(可能在 3/4 分钟后) 到 Redis-CLI 列出键,现在我找不到 Customer1 对象。 这是否意味着 Redis 定期执行清理 间隔,比如垃圾收集?

【问题讨论】:

    标签: spring redis spring-session


    【解决方案1】:

    Session Expiration section Spring Session reference 详细描述了如何清理会话。

    来自文档:

    这种方法的一个问题是 Redis 不保证 如果他们的键没有被触发,过期事件将被触发 访问。特别是 Redis 用来清理的后台任务 过期密钥是低优先级任务,可能不会触发密钥 到期。有关更多详细信息,请参阅Timing of expired events Redis 文档中的部分。

    ...

    因此,每次会话过期也会被跟踪到 最近的分钟。这允许后台任务访问 可能过期的会话,以确保 Redis 过期的事件是 以更确定的方式发射。

    【讨论】:

      猜你喜欢
      • 2019-07-04
      • 1970-01-01
      • 1970-01-01
      • 2013-08-23
      • 2017-07-27
      • 2019-10-15
      • 1970-01-01
      • 2014-09-08
      • 2021-01-11
      相关资源
      最近更新 更多