1. 程式人生 > >Redis學習與總結

Redis學習與總結

vnr vid idl master 總結 config 核心 climb www

前言

本文為學習Redis的一個總結,包含了資料的整理,Redis的介紹,常用數據類型,常用命令,多數據庫與事務的特性以及持久化的概述;如何在Linux上部署,以及使用Java客戶端開發工具包來連接使用Redis,並記錄了常見的問題,關於Redis的高級特性與使用場景後續開新文章進行補充。

參考資料(記錄與分享)

視頻教程教常用命令、數據類型、Jedis簡單使用、事務與持久化簡單概述,屬於入門級別:

Redis入門【慕課網】

這篇很全的概述,包含特性、場景、還有基本的用法,都是概述性的簡要說明:

Redis從入門到實戰【GitChat技術雜談】

這篇稍微有點高級,哈哈哈:

Redis總結【JavaGuide】

可以在線的測試一些學會的命令:

Redis官方在線測試頁面

redis.conf相關的,懶翻譯配置文件中英語就看他吧 :

Redis配置文件詳解

在Linux上搞Redis的參考:

Redis在linux上的配置

Redis介紹&使用場景&特點&缺點

(參考資料裏,別人總結的很好,過去看看就好了,重要的再粘過來。)

數據類型&常用操作

數據類型
  • 字符串 String 【二進制存儲,最大512M】
  • 哈希 Hash
  • 字符串列表 List
  • 字符串集合 Set
  • 有序字符串集合(Sorted Set)
命令操作【這塊重點】

Redis從入門到實戰【GitChat技術雜談】

Redis的Java客戶端開發包

Jedis介紹
  • Jedis是Redis官方首選的Java客戶開發包
  • GitHub地址
  • Jedis中的操作方法基本上和Redis的操作命令是一致的
Jedis 代碼測試
  1. Maven&JUint單元測試依賴

    <dependencies>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.0.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    A candy:在線查詢Maven依賴

  2. 簡單的連接測試

    import org.junit.Test;
    import redis.clients.jedis.Jedis;
    
    public class JedisTest {
        /**
         * Jedis的簡單使用
         */
        @Test
        public void demo(){
            //設置IP地址以及端口
            Jedis jedis = new Jedis("192.168.121.128",6379);
            //保存數據
            jedis.set("name","菜鳥");
            //獲取數據
            String value = jedis.get("name");
            //打印數據
            System.out.println(value);
            //釋放資源
            jedis.close();
    
        }
    }
    
  3. 使用連接池

    import org.junit.Test;
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    import redis.clients.jedis.JedisPoolConfig;
    
    public class JedisTest {
    
        /**
         * 使用連接池
         */
        @Test
        public void demoPoll(){
            //連接池配置
            JedisPoolConfig config = new JedisPoolConfig();
            //最大連接數
            config.setMaxTotal(30);
            //最大空余連接數
            config.setMaxIdle(10);
            //根據 config host port 創建連接池
            JedisPool jedisPool = new JedisPool(config,"192.168.121.128",6379);
    
            //獲取核心對象
            Jedis jedis = null;
            try {
                jedis = jedisPool.getResource();
                //設置數據
                jedis.set("name","弱雞");
                //獲取數據
                String value = jedis.get("name");
    
                System.out.println(value);
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                //釋放資源
                if(jedis != null){
                    jedis.close();
                }
                if(jedisPool != null){
                    jedisPool.close();
                }
            }
        }
    }
    

問題&解決方案

Linux上安裝啟動問題
  1. Make報錯

    直接 make 如果報錯,則執行 make MALLOC=libc;然後 ./redis-server

  2. 啟動的一個小問題,還是要說一下

    教程裏面的redis版本低的原因吧,啟動是 ./bin/redis-server 我用的時候都在src目錄下,而非bin,所以不進入目錄情況下帶目錄名啟動應該是 ./src/redis-server

Jedis連接不上的問題
  1. Jedis連接Linux上的redis出現 DENIED Redis is running in protected mode問題的解決方案

    為什麽如上更改了配置還報錯? 啟動的時候記得加載配置文件 ./redis-server ./redis.conf

  2. 連接超時

    原因:Linux 上的6379端口沒有打開,需要在防火墻中打開該端口

    設置Linux的端口開放:
    (1)vim /etc/sysconfig/iptables

    (2)-A INPUT -m state -- state NEW -m tcp -p --dport 6379 -j ACCEPT

    [可以yy復制22端口那行然後,p粘貼]

    (3)重啟防火墻設置:service iptables restart

多數據庫與事務特性

多數據庫
  1. select 1 選擇數據庫 默認是0庫
  2. 移動某個key到其他數據庫 move key 1
事務

也就是命令串行化、原子化執行,似的數據具有一致性

  • 開啟事務 multi
  • 提交事務 exec
  • 回滾事務 discard

Redis的持久化

Redis之所以快,就是他的數據存儲在了內存中(難怪多了會崩),為了能夠重啟Redis後數據仍然能夠存在並讀取使用,就需要將數據存儲到磁盤裏。

兩種方式:

  • RDB 方式
  • AOF 方式
RDB方式

優勢:

  1. 數據庫只包含一個文件,通過文件備份策略,定期配置,恢復系統災難
  2. 壓縮文件轉移到其他介質上
  3. 性能最大化,redis開始持久化時,分叉出進程,由子進程完成持久化的工作
    ,避免服務器進程執行I/O操作,啟動效率高

劣勢:

  1. 無法高可用:系統一定在定時持久化之前宕機,數據還沒寫入,數據已經丟失
  2. 通過fock分叉子進程完成工作,數據集大的時候,服務器需要停止幾百毫秒甚至1秒

配置:
cd /usr/local/redis
vim redis.conf

默認:
save 900 1 #每900秒至少1個key變化,持久化一次,到內存一個快照
save 300 10 #每300秒至少10個key變化,往硬盤寫一次
save 60 10000 #每60秒至少10000個key變化,寫一次
dbfilename dump.rdb #數據的文件名
dir ./ #保存的路徑,redis路徑下

AOF方式

優勢:

  1. 同步:

    a. 每秒同步:異步完成,效率高,一旦系統宕機,修改的數據丟失 b. 每修改同步:同步持久化,每分鐘發生的變化記錄到磁盤中,效率低,安全

    c. 不同步

  2. 日誌寫入操作追加模式append

    a.系統宕機,不影響存在的內容
    b.寫入一半數據,若系統崩潰,下次啟動redis,redis-check-aof工具解決數據一致性

  3. 如果日誌過大,自動重寫機制,修改的數據寫入到到磁盤文件,創建新文件,記錄產生的修改命令,重寫切換時,保證數據安全

  4. 格式清晰的日誌文件,完成數據的重建

劣勢:

  1. 對於相同數據文件,相比RDB,A OF文件較大
  2. 效率低

配置:
vim redis.conf
默認:
appendonly no #AOF方式默認關閉
appendfilename appendonly.aof #配置文件
appendfsync always #每修改一次,同步到磁盤上
appendsync everysec 每秒同步到磁盤一次
appensync no 不同步

Redis學習與總結