### 18.3.2 使用Redis 本章将用Redis来保存Session,你需要安装Redis,如果未安装,请参考Redis一章,Spring Boot的配置如下: ~~~properties spring.session.store-type=Redis spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.password=Redis!123 ~~~ 还需要引入对Redis的依赖 ~~~xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ~~~ 再次访问/putsession.html后,我们通过redis客户端工具访问redis,比如使用redis-cli,键入如下命令 ~~~ keys spring:session:* ~~~ 查询所有“spring:session:”开头的keys,输出类似如下 ~~~ 3) "spring:session:sessions:expires:863c7e73-8249-4780-a08e-0ff2bdddda86" .... 7) "spring:session:sessions:863c7e73-8249-4780-a08e-0ff2bdddda86" ~~~ 会话信息存放在“spring:session:sessions:开头"的key里,863c7e73-8249-4780-a08e-0ff2bdddda86代表一个会话id,“spring:session:sessions“是一个Hash数据结构,可以用Redis HASH相关的命令来查看这个用户会话的数据,使用hgetall 查看会话所有的信息 ~~~ >hgetall "spring:session:sessions:863c7e73-8249-4780-a08e-0ff2bdddda86" 1) "sessionAttr:user" 2) "maxInactiveInterval" ....... ~~~ 使用如下命令来查看该session的user信息 ~~~ >HMGET "spring:session:sessions:863c7e73-8249-4780-a08e-0ff2bdddda86" sessionAttr:user ~~~ sessionAttr:user 是Spring Session存入Redis的key值,sessionAttr:是其前缀, user是我们在Spring Boot设置会话Key。其他Spring Boot默认还创建的key还有 * creationTime ,创建时间 * maxInactiveInterval 指定时间(秒)后过期 * lastAccessedTime 上次访问时间 * sessionAttr: 以“sessionAttr:”为前缀的会话信息,比如sessionAttr: user 因此,Redis保存的会话类似这样的格式用Redis来操作,类似如下 ~~~ >HMSET spring:session:sessions:863c7e73-8249-4780-a08e-0ff2bdddda86 creationTime 1404360000000 maxInactiveInterval 1800 lastAccessedTime 1404360000000 sessionAttr:attrName someAttrValue sessionAttr:attrName2 someAttrValue2 ~~~ > **注意** > > Spring Session 的Redis实现,并不是每次通过Session类获取会话信息或者保存的时候都会调用redis操作,他会先尝试从内部的HashMap读取值,如果没有,才调用redis 的HMGET 操作。同样,当保存会话的时候,也并没有立即调用Redis操作,而是先保存到HashMap中,等待服务请求结束后再将变化的值使用HMSET更新 。如果你想在保存会话操作后立即更新到Reids里,你需要配置成IMMEDIATE 模式,修改配置属性 > > ~~~properties > spring.session.redis.flushMode=IMMEDIATE > ~~~ > 我们注意到,还有另外一个Redis Key 是 “spring:session:sessions:expires:863c7e73-8249-4780-a08e-0ff2bdddda86”,这是因为redis会话过期并没有直接使用在session:sessions:key变量上,而是专门用在session:sessions:expires:key上,当此key过期后,会自动清除对应的会话信息.使用ttl查看会话过期时间 ~~~ >ttl spring:session:sessions:expires:863c7e73-8249-4780-a08e-0ff2bdddda86 (integer) 1469 ~~~ 默认是1800秒,即30分钟,现在只剩下1469秒。