【redis】SpringBoot集成redis

目录

  • 1.添加redis依赖
  • 2.配置redis
  • 3.操作redis
    • [3.1 操作string](#3.1 操作string)
    • [3.1 操作其它数据类型](#3.1 操作其它数据类型)
  • [4. Spring-Session基于Redis解决共享Session问题](#4. Spring-Session基于Redis解决共享Session问题)
    • [4.1 问题提出](#4.1 问题提出)
    • [4.1 添加依赖](#4.1 添加依赖)
    • [4.2 修改配置](#4.2 修改配置)
    • [4.3 存储和读取](#4.3 存储和读取)

1.添加redis依赖

方法①:

java 复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

方法②:

使用快速面板添加:

2.配置redis

application.properties配置:

注意:使用本机进行远程连接redis之后,IP地址才能填本机,否则填服务器IP

java 复制代码
#数据库索引
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配置:

java 复制代码
spring:
  redis:
    database: 1
    port: 6379
    host: 127.0.0.1

3.操作redis

redis命令官网:redis

引⼊Spring提供的模板类:

java 复制代码
    @Autowired
    private RedisTemplate stringRedisTemplate;

3.1 操作string

java 复制代码
    @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 操作其它数据类型

java 复制代码
        //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 添加依赖

java 复制代码
<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:

java 复制代码
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。

java 复制代码
@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;
}
相关推荐
一屉大大大花卷43 分钟前
初识Neo4j之入门介绍(一)
数据库·neo4j
凯基迪科技1 小时前
exe软件壳的分类----加密保护壳
java
wuxuanok1 小时前
Web后端开发-分层解耦
java·笔记·后端·学习
周胡杰1 小时前
鸿蒙arkts使用关系型数据库,使用DB Browser for SQLite连接和查看数据库数据?使用TaskPool进行频繁数据库操作
前端·数据库·华为·harmonyos·鸿蒙·鸿蒙系统
wkj0011 小时前
navicate如何设置数据库引擎
数据库·mysql
ladymorgana1 小时前
【Spring Boot】HikariCP 连接池 YAML 配置详解
spring boot·后端·mysql·连接池·hikaricp
赵渝强老师1 小时前
【赵渝强老师】Oracle RMAN的目录数据库
数据库·oracle
暖暖木头1 小时前
Oracle注释详解
数据库·oracle
kyle~2 小时前
C/C++字面量
java·c语言·c++
neoooo2 小时前
别慌,Java只有值传递——一次搞懂“为啥我改了它还不变”!
java·后端·spring