Spring session 对于什么时候将session 中的数据同步到redis 中提供了两种模式
一种是当响应结束后同步(默认时)
一种种是实时同步
RedisFlushMode
1、两种模式
ON_SAVE
:只有当 SessionRepository.save(Session)
方法被调用时,才会将session中的数据同步到redis中。在web 应用中,当请求完成响应后,才开始同步。也就是说在执行response 之前session数据都是缓存在本地的.
IMMEDIATE
:实时同步session 数据到redis。当执行 SessionRepository.createSession()
时, 会将session数据同步到redis中;当对session的attribute进行set/remove 等操作时,也会同步session中的数据到redis中。
public enum RedisFlushMode { /** * Only writes to Redis when * {@link SessionRepository#save(org.springframework.session.Session)} is invoked. In * a web environment this is typically done as soon as the HTTP response is committed. */ ON_SAVE, /** * Writes to Redis as soon as possible. For example * {@link SessionRepository#createSession()} will write the session to Redis. Another * example is that setting an attribute on the session will also write to Redis * immediately. */ IMMEDIATE }
2、配置方式
因此直接@EnableRedisHttpSession
上配置即可。
@EnableRedisHttpSession(redisFlushMode=RedisFlushMode.IMMEDIATE)
3、两种模式测试
测试采用debug方式测试,建议每次测试之前清空redis数据库
清空命令
redis-cli keys '*' | xargs redis-cli del
测试接口
测试时,return语句打上断点,查看redis 中数据库的值
ON_SAVE
:在执行到return 语句时,数据库中没有数据。当放过断点,执行完return 语句之后,会发现redis中已经有了新的session。IMMEDIATE
:在执行到return 语句时,数据库中已经有了session相关数据。
@ResponseBody @RequestMapping("/hello.json") public String hello(HttpSession session){ session.setAttribute("name", "zongf"); session.setAttribute("version", "2.0"); return LocalDateTime.now() + "-hello"; }
未经允许请勿转载:程序喵 » Spring Session 的两种刷新模式 RedisFlushMode