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

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