目录
- 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: 1
port: 6379
host: 127.0.0.1
3.操作redis
redis命令官网:redis
引⼊Spring提供的模板类:
@Autowired
private 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 操作其它数据类型
//hash
stringRedisTemplate.opsForHash().put("hashKey","k1","v1");
stringRedisTemplate.opsForHash().put("hashKey","k2","v2");
//list
stringRedisTemplate.opsForList().leftPush("listKey","l1");
stringRedisTemplate.opsForList().leftPush("listKey","l2");
//set
stringRedisTemplate.opsForSet().add("setKey","s1","s2","s3");
//zset
stringRedisTemplate.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: 1
port: 6379
host: 127.0.0.1
session:
store-type: redis
redis:
flush-mode: on_save
namespace: 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 {
//模拟,不登录, 只存session
User 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;
}