在 Spring Boot 中使用 Redis

准备工作

在 Linux 上安装 redis 参考文章:阿里云 CentOS7安装redis4.0.9并开启远程访问

Spring Boot 官方提供了 spring-boot-starter-data-redis 依赖,可以很方便的操作 redis。

从 Spring Boot 2.1.5 版本之后,远程连接 Redis,必须使用 Spring Boot Security,当然,本地连接是不需要的。

redis 连接池有 lettuce 和 jedis 两种,Spring Boot 2.x.x 版本默认使用的 lettuce 客户端。

关于 lettuce 和 jedis 的异同,参考文章:Redis连接池Lettuce Jedis 区别

pom.xml 文件所需依赖如下:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

application.properties 配置文件如下:

# 配置 Redis 的基本属性
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.database=0

我在 Windows 本地安装的 redis,默认是没有密码,所以这里不需要配置密码。

如果要配置密码,参考文章:redis如何设置密码

示例

新建一个 HelloController 类,写入:

@RestController
public class HelloController {
    @Autowired
    StringRedisTemplate stringRedisTemplate;
    @GetMapping("/set")
    public void set(){
        ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
        ops.set("name", "hahaha");
    }

    @GetMapping("/get")
    public void get(){
        ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
        System.out.println(ops.get("name"));
    }
}

启动项目,先在浏览器访问 http://localhost:8080/set,再访问 http://localhost:8080/get,控制台的输出如下:

关于 StringRedisTemplate

这里用到了 StringRedisTemplate,这是 Spring Boot 官方自带的操作 Redis 数据库的模板。

StringRedisTemplate的源码如下:

public class StringRedisTemplate extends RedisTemplate<String, String> {
    public StringRedisTemplate() {
        this.setKeySerializer(RedisSerializer.string());
        this.setValueSerializer(RedisSerializer.string());
        this.setHashKeySerializer(RedisSerializer.string());
        this.setHashValueSerializer(RedisSerializer.string());
    }

    public StringRedisTemplate(RedisConnectionFactory connectionFactory) {
        this();
        this.setConnectionFactory(connectionFactory);
        this.afterPropertiesSet();
    }

    protected RedisConnection preProcessConnection(RedisConnection connection, boolean existingConnection) {
        return new DefaultStringRedisConnection(connection);
    }
}

可以看到,StringRedisTemplate 继承了 RedisTemplate,而 RedisTemplate 是在Spring Boot 中操作 redis 的基本模板。


利用 Redis 来实现 session 共享

在传统的单服务架构中,一般来说只有一个服务器,那么不存在 session 共享的问题。但是在分布式/集群项目中,session 共享是一个必须面对的问题。

解决 session 共享的方法,就是将各个服务之间需要共享的数据,保存到一个公共的地方(主流方案就是 Redis):

当所有 Tomcat 需要往 Session 中写数据时,都往 Redis 中写,当所有 Tomcat 需要读数据时,都从 Redis 中读。这样,不同的服务就可以使用相同的 Session 数据了。

session 共享示例

在 Spring Boot 中做 session 共享,主要使用依赖 spring-session-data-redis

相关依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>

application.properties 配置文件:

spring.redis.host=localhost
spring.redis.port=6379
spring.redis.database=0

server.port=8080

基本配置完毕,接下来写个 HelloController类:

@RestController
public class HelloController {

    @Value("${server.port}")
    Integer port;

    @GetMapping("/set")
    public String set(HttpSession session){
        session.setAttribute("name", "fanqie");
        return String.valueOf(port);
    }

    @GetMapping("/get")
    public String get(HttpSession session){
        return ((String) session.getAttribute("name")) + port;
    }
}

将该项目打成 jar 包,分别在 8080 端口和 8081 端口运行,访问浏览器:http://localhost:8080/set,再访问 http://localhost:8081/get,可以看到两个服务的 session已经实现共享。

下图是存储在 Redis 中的 session 数据:


Nginx 简介

Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务。

一般来说,如果我们在项目中引入了 Nginx ,我们的项目架构可能是这样:

在这样的架构中 , Nginx 所代表的角色叫做负载均衡服务器或者反向代理服务器,所有请求首先到达 Nginx 上,再由 Nginx 根据提前配置好的转发规则,将客户端发来的请求转发到某一个 Tomcat 上去。

Nginx 所代表的,是服务端负载均衡服务器;对应的,在 Spring Cloud 中,RestTemplate 代表的是客户端负载均衡。

正向代理,指的是代理客户端,比如通过 VPN 访问谷歌,这就是正向代理;反向代理,指的是代理服务端,如 10086 ,它就是代理的话务员,而不是客户。

Nginx 的优势
  • 使用 Nginx 做静态资源服务器

  • 使用 Nginx 做负载均衡服务器

  • 支持高并发、内存消耗少、成本低廉、配置简单、运行稳定等。

更多关于 Nginx 介绍和安装,参考文章:Nginx 极简入门教程!

每天学习一点点,每天进步一点点。

原文地址:https://www.cnblogs.com/youcoding/p/13876875.html