存储在Spring(HTTP)会话中的数据在销毁期间不会从Redis中删除

时间:2015-03-11 16:40:37

标签: spring redis spring-session

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

  1. 会话已在应用程序中创建
  2. 跑了" Keys *"在Redis CLI中命令并看到一个新条目(例如" spring:session:sessions:6b55103a-baf5-4a05-a127-3a9cfa15c164")
  3. 从应用程序中,向会话添加了自定义bean
  4. 跑了" Keys *"在Redis CLI中命令并再看到一个新条目 这个bean(比如" \ xac \ xed \ x00 \ x05t \ x00 \ tcustomer1",因为 bean有一个值为' customer1')
  5. 的字符串
  6. 我已将自动过期时间设置为30秒,并且当时未使用该应用程序
  7. sessionDestroyEvent被触发并在实现ApplicationListener的Listener中捕获
  8. 跑了" Keys *"在Redis CLI中执行命令,现在是第一个创建的命令 会话的条目已经消失,但是,自定义bean对象 (customer1)仍然留在Redis
  9. 问题

      

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

    更新

      

    虽然我发布了这个问题并且回去了(可能是在3/4分钟之后)   到Redis-CLI列出密钥,现在我找不到Customer1对象。   这是否意味着Redis会对一些常规的清理工作进行清理   区间,就像垃圾收集一样?

1 个答案:

答案 0 :(得分:2)

Session Expiration section Spring Session reference详细描述了会话的清理方式。

来自文档:

  

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

     

...

     

出于这个原因,每个会话到期也会被跟踪到   最近的分钟。这允许后台任务访问   可能过期的会话,以确保Redis过期事件   以更确定的方式解雇。