SpringBoot 学习笔记_整合NoSQL —— Redis

SpringBoot 学习笔记_整合NoSQL —— Redis

声明:

本次学习参考 《SpringBoot + Vue 开发实战》 · 王松(著) 一书。

本文的目的是记录我学习的过程和遇到的一些问题以及解决办法,其内容主要来源于原书。

如有侵权,请联系我删除

SpringBoot 整合 NoSQL

NoSQL 指 非关系型数据库,NoSQL 不使用 SQL 作为查询语言,其数据存储可以不需要固定的表格模式,一般都有水平可扩展的特性。

NoSQL 主要分四类:

  • 键值对存储数据库

    Redis 为代表。 这种数据存储通常都是无数据结构的,一般被当做字符串或者二进制数据,但是数据加载速度快。一般用来 处理高并发 或者用于 日志系统

  • 列存储数据库

    HBaseCassandra 为代表。 功能相对局限,但查找速度快,容易分布式扩展,一般用于 分布式文件系统

  • 文档型数据库

    MongoDB 为代表。 与键值对存储类似,不需要预先创建表结构,数据格式灵活,一般用于 Web应用

  • 图形数据库

    Neo4JDEX 为代表。 专注于构建 关系图谱 。例如社交网络、推荐系统等。

整合 Redit

Redis 是使用 C 编写的基于内存的 NoSQL 数据库,它是目前最流行的键值对存储数据库。 Redis 中 Value 的类型不局限于字符串,还支持列表、集合、有序集合、散列等。

Redis 不仅可以当做缓存使用,也可以配置数据持久化后当做 NoSQL 数据库使用。 目前支持快照持久化和AOF持久化。

Redis 也可以搭建集群或者主从复制结构,在高并发环境下具有很高可用性。

Redis 安装

  • CentOS 7

    • 安装 wget:

      • yum install wget
    • 使用 wget 下载 Redis:

      • wget http://download.redis.id/releases/redis-4.0.10.tar.gz
    • 解压 Redis

      • tar -zxvf redis-4.0.10.tar.gz
    • 安装 gcc 命令

      • yum install gcc
    • 进入 Redis 目录,编译

      • cd redis-4.0.10
      • make MALLOC=libc
      • make install
    • 配置 Redis

      在 Redis 的根目录下,打开配置文件 redis.conf

      # 允许 Redis 后台启动
      daemonize yes
      # 允许连接 Redis 实例地址。默认只允许本地连接,将下面这行默认配置注释掉,外网就可以连接了
      # bind 127.0.0.1
      # 设置登录 Redis 的密码
      requirepass 123456
      # 关闭 Redis 保护模式,配置密码之后就可以关闭了
      protected-mode no
      
    • 关闭 CentOS 7 防火墙

      systemctl stop firewalld.service
      systemctl disable firewalld.service
      
    • 启动 Redis

      redis-server redis.conf
      
    • 输入密码,进入 Redis 控制台

      redis-cli -a 123456
      
    • 关闭 Redis

      • 控制台
        127.0.0.1:6379> SHUTDOWN
        not connected> exit
        
      • 命令行
        redis-cli -p 6379 -a 123456 shutdown
        
  • Windows

    • 下载 Redis 安装程序

      • https://github.com/MicrosoftArchive/redis/releases

        download

    • 安装 Redis 程序

      1
      2
      3
      4

      点击 install 等待安装完成即可

    • 配置 Redis 程序

       # 允许 Redis 后台启动
       daemonize yes
       # 允许连接 Redis 实例地址。默认只允许本地连接,将下面这行默认配置注释掉,外网就可以连接了
       # bind 127.0.0.1
       # 设置登录 Redis 的密码
       requirepass 123456
       # 关闭 Redis 保护模式,配置密码之后就可以关闭了
       protected-mode no
      
    • 启动 Redis 服务

      redis-server redis.windows.conf
      
    • 遇到的问题(一)

      执行 redis-server redis.windows.conf 启动 Redis 报错

      Invalid argument during startup: Failed to open the .conf file: Files\Redis\redis.windows.conf CWD=C:\Users\XXX
      

      error1
      问题原因:无法打开配置文件

      解决办法1:通过 cmd 命令进入 Redis 安装目录下,执行 redis-server redis.windows.conf
      e1
      解决办法2:配置环境变量 REDIS_HOME 的值为 Redis 安装目录,然后执行 redis-server %REDIS_HOME%\redis.windows.conf
      e2

    • 遇到的问题(二)

      执行 redis-server 测试 Redis 安装是否正确或者 redis-server redis.windows.conf运行时报错

      Creating Server TCP listening socket *:6379: bind: No such file or directory
      

      error2
      问题原因:Redis 服务已经启动

      解决办法1:如果第3步没有配置 Redis 密码,在 cmd 中输入 redis-cli 进入 Redis 控制台;执行 SHUTDOWN 命令终止 Redis

      在这里插入图片描述

      解决办法2:如果第3步配置了 Redis 密码 requirepass 123456 或者配置了 Redis 端口 port 6379,直接输入 redis-cli 命令进入后执行 SHUTDOWN 会报 (error) NOAUTH Authentication required. 错误,需要在 cmd 中输入 redis-cli -p 6379 -a 123456 进入 Redis 控制台;执行 SHUTDOWN 命令终止 Redis

      e3

      解决办法3(不建议):直接通过 kill 命令杀死 Redis 服务进程

整合 Redis

Redis 的 Java 客户端有 Jedis、JRedis、Spring Data Redis 等。

  • 创建 SpringBoot 项目,添加依赖

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

    默认情况下, spring-boot-starter-data-redis 使用的 Redis 工具是 Lettuce。如果需要引入 Jedis,需要排除 Lettuce 引入 Jedis

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
        <!--    排除默认的 Lettuce 工具      -->
        <exclusions>
            <exclusion>
                <groupId>id.lettuce</groupId>
                <artifactId>lettuce-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!--   引入 Jedis 依赖     -->
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
    </dependency>
    
  • 配置 Redis (application.properties)

    ### Redis 配置 ###
    # 使用的 Redis 库编号,Redis 提供了 16 个 database,编号 0-15
    spring.redis.database=0
    # Redis 实例的地址
    spring.redis.host=localhost
    # Redis 端口号
    spring.redis.port=6379
    # Redis 登录密码
    spring.redis.password=123456
    # Redis 连接池中最大连接数
    spring.redis.jedis.pool.max-active=8
    # Redis 连接池中最大空闲连接数
    spring.redis.jedis.pool.max-idle=8
    # Redis 连接池的最大阻塞等待时间。默认 -1 表示无限制
    spring.redis.jedis.pool.max-wait=-1ms
    # Redis 连接池最小空闲连接数
    spring.redis.jedis.pool.min-idle=0
    

    在 SpringBoot 的自动配置类中提供了 RedisAutoConfiguration 进行 Redis 的配置。

    application.properties 中的配置信息将被注入 RedisProperties 中,如果开发者没有提供 RedisTemplate 或者 StringRedisTemplate 实例,则 SpringBoot 默认会提供这两个示例。

    RedisTemplate 和 StringRedisTemplate 实例则提供了 Redis 的基本操作方法。

  • 创建实体类

    public class BookRedis implements Serializable {
        private Integer id;
        private String name;
        private String author;
    	/* Getter & Setter */
    }
    
  • 创建 Controller

    @RestController
    public class BookRedisController {
    
        // RedisTemplate 可以用来操作对象,采用的序列化方案是 JdkSerializationRedisSerializer
        @Autowired
        RedisTemplate redisTemplate;
    
        // StringRedisTemplate 是 RedisTemplate 的一个 key 和 value 的子类,采用的序列化方案是 StringRedisSerializer
        @Autowired
        StringRedisTemplate stringRedisTemplate;
    
        /**
         * StringRedisTemplate 和 RedisTemplate 都是通过 opsForValue、 opsForZSet 或者 opsForSet等方案
         * 首先获取一个操作对象,再使用该操作对象完成数据的读写
         */
    
        @GetMapping("/test1")
        public void test1(){
            ValueOperations<String, String> ops1 = stringRedisTemplate.opsForValue();
            //向 Redis 中存储一条记录
            ops1.set("name", "木屋烧烤");
            //从 Redis 中取出一条记录
            String  name = ops1.get("name");
            System.out.println(name);
    
            ValueOperations ops2 = redisTemplate.opsForValue();
            BookRedis book = new BookRedis();
            book.setId(10);
            book.setName("牛排是怎样炼成的?");
            book.setAuthor("老板");
            //向 Redis 中存储一个对象
            ops2.set("book", book);
            //从 Redis 中取出一个对象
            BookRedis bookRedis = (BookRedis)ops2.get("book");
            System.out.println(bookRedis);
        }
    }
    
  • 测试

    https://localhost:8080/test1

    result

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章