目录
- 1.添加redis依赖
- 2.配置redis
- 3.操作redis
- 3.1 操作string
- 3.1 操作其它数据类型
- 4. Spring-Session基于Redis解决共享Session问题
- 4.1 问题提出
- 4.1 添加依赖
- 4.2 修改配置
- 4.3 存储和读取
1.添加redis依赖
方法①:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
方法②:
使用快速面板添加:
2.配置redis
application.properties配置:
注意:使用本机进行远程连接redis之后,IP地址才能填本机,否则填服务器IP
#数据库索引
spring.redis.database=1
#端⼝号
spring.redis.port=6379
#IP
spring.redis.host=127.0.0.1
#连接池最⼩空闲连接数
spring.redis.lettuce.pool.min-idle=5
#连接池最⼤空闲连接数
spring.redis.lettuce.pool.max-idle=10
#连接池最⼤连接数
spring.redis.lettuce.pool.max-active=8
#最⼤等待时间
spring.redis.lettuce.pool.max-wait=1ms
application.yml配置:
spring:redis:database: 1port: 6379host: 127.0.0.1
3.操作redis
redis命令官网:redis
引⼊Spring提供的模板类:
@Autowiredprivate RedisTemplate stringRedisTemplate;
3.1 操作string
@RequestMapping("/setStr")public String setStr(String key,String value){//参数校验if(!StringUtils.hasLength(key) ||!StringUtils.hasLength(value)){return "failed";}stringRedisTemplate.opsForValue().set(key,value);return "seccess";}
3.1 操作其它数据类型
//hashstringRedisTemplate.opsForHash().put("hashKey","k1","v1");stringRedisTemplate.opsForHash().put("hashKey","k2","v2");//liststringRedisTemplate.opsForList().leftPush("listKey","l1");stringRedisTemplate.opsForList().leftPush("listKey","l2");//setstringRedisTemplate.opsForSet().add("setKey","s1","s2","s3");//zsetstringRedisTemplate.opsForZSet().add("zsetKey","z1",80);stringRedisTemplate.opsForZSet().add("zsetKey","z2",90);stringRedisTemplate.opsForZSet().add("zsetKey","z3",10);
4. Spring-Session基于Redis解决共享Session问题
4.1 问题提出
Session的必要性
Http协议是⽆状态的,这样对于服务端来说,没有办法区分是新的访客还是旧的访客。但是,有些业务场景,需要追踪⽤户多个请求,此时就需要Session.
session信息不同步问题
⼀个Web应⽤, 可能部署在不同的服务器上, 通过Nginx等进⾏负载均衡. 此时,来⾃同⼀个⽤户的Http请求就会被分发到不同的服务器上. 这样就会出现Session信息不同步的问题.当⽤户刷新⼀次访问是可能会发现需要重新登录,这个问题是⽤户⽆法容忍的。
redis解决问题
为了解决这个问题,可以使⽤ Redis 将⽤户的 Session 信息进⾏集中管理,如下 图所示,在这种模式下,只要保证 Redis是⾼可⽤和可扩展性的,⽆论⽤户被均 衡到哪台 Web 服务器上,都集中从 Redis 中查询、更新 Session 信息。
Spring也给我们提供了共享Session的解决⽅案, 也就是Spring-Session.接下来看看Spring-Session 基于Redis如何来解决共享Session的问题
4.1 添加依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId>
</dependency>
4.2 修改配置
application.yml:
spring:redis:database: 1port: 6379host: 127.0.0.1session:store-type: redisredis:flush-mode: on_savenamespace: spring1:session
server:servlet:session:timeout: 30m
4.3 存储和读取
建一个内部类User。
模拟存取session。
@RequestMapping("/session")
@RestController
public class SessionController {@RequestMapping("/login")public String login(String name, Integer age, HttpSession session) throws JsonProcessingException {//模拟,不登录, 只存sessionUser user = new User();user.setName(name);user.setAge(age);ObjectMapper mapper = new ObjectMapper();session.setAttribute("user_session",mapper.writeValueAsString(user));return "success";}@RequestMapping("/getSess")public String getSess(HttpServletRequest request){HttpSession session = request.getSession(false);if (session!=null && session.getAttribute("user_session")!=null){return (String) session.getAttribute("user_session");}return null;}}
@Data
class User{private String name;private Integer age;
}