• 在 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 极简入门教程!

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

  • 相关阅读:
    UVA——A Spy in the Metro(线性dp)
    IDEA运行jsp文件变成源码详细解决方案
    CF1105C Ayoub and Lost Array(dp+矩阵快速幂优化)
    牛客练习赛75——A广义肥波
    void * 指针和const 指针
    详解getchar()函数与缓冲区
    深入了解scanf() getchar()和gets()等函数之间的区别
    字符串和指针注意
    指针
    数组和字符串的小结
  • 原文地址:https://www.cnblogs.com/youcoding/p/13876875.html
Copyright © 2020-2023  润新知