【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;
}
相关推荐
langsiming1 分钟前
【无标题】
java·开发语言·数据库
weisian1517 分钟前
Java并发编程--45-分布式一致性协议入门:Raft、Paxos与ZAB的核心思想
java·分布式·raft·paxos·zab
木井巳9 分钟前
【递归算法】解数独
java·算法·leetcode·决策树·深度优先·剪枝
t***54414 分钟前
如何在 Dev-C++ 中切换编译器
java·开发语言·c++
Lisonseekpan16 分钟前
Git:如何将一个分支的特定提交合并到另一个分支?
java·大数据·git·后端·elasticsearch
Boop_wu17 分钟前
[Java EE 进阶]Mybatis进阶(动态SQL)
java·数据库·maven·mybatis
Elastic 中国社区官方博客21 分钟前
使用 EDOT Browser 和 Kibana 进行 OpenTelemetry 浏览器端埋点
大数据·服务器·数据库·elasticsearch·搜索引擎·单元测试·可用性测试
星轨zb34 分钟前
为什么Mysql需要索引以及如何应用到项目中
数据库·mysql
BullSmall39 分钟前
Redis 双机部署 完整方案(两种架构,适配两台机器)
java·redis·架构
Old Uncle Tom1 小时前
提示词编写规范
数据库·算法