【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;
}
相关推荐
小梁不秃捏2 小时前
深入浅出Java虚拟机(JVM)核心原理
java·开发语言·jvm
余衫马4 小时前
CentOS7 离线安装 Postgresql 指南
数据库·postgresql
E___V___E4 小时前
MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 高级篇 part 2
数据库·笔记·mysql
m0_748254885 小时前
mysql之如何获知版本
数据库·mysql
yngsqq5 小时前
c# —— StringBuilder 类
java·开发语言
mikey棒棒棒5 小时前
Redis——优惠券秒杀问题(分布式id、一人多单超卖、乐悲锁、CAS、分布式锁、Redisson)
数据库·redis·lua·redisson·watchdog·cas·并发锁
星星点点洲6 小时前
【操作幂等和数据一致性】保障业务在MySQL和COS对象存储的一致
java·mysql
xiaolingting6 小时前
JVM层面的JAVA类和实例(Klass-OOP)
java·jvm·oop·klass·instanceklass·class对象
风口上的猪20156 小时前
thingboard告警信息格式美化
java·服务器·前端
水手胡巴6 小时前
oracle apex post接口
数据库·oracle