玩轉Redis|學會這10點讓你分分鐘拿下Redis,滿足你的一切疑問

ITPUB社群 發表於 2022-11-25
Redis


前言

Redis是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。從2010年3月15日起,Reids的開發工作由VMware主持。Redis能執行在大多數POSIX(Linux,*BSD,OS X和Solaris等)系統上。

和普通的Key-Value結構不同,Redis的Key支援靈活的資料結構,除strings,還有hashes、lists、sets和sorted sets等結構。正是這些靈活的資料結構,豐富了Redis的應用場景,能滿足更多業務上的靈活儲存需求。

Redis的資料都儲存在記憶體中,而且底層實現上是自己寫了epoll enent loop部分,而沒有采用開源的libevent等通用框架,所以讀寫效率很高。為了實現Redis的持久化,Redis支援定期重新整理(可透過配置實現)或寫日誌的方式來儲存資料到磁碟。


1、Redis的核心概念

「Redis是什麼:」

  • MySql/Oracle:是一個關係型的資料庫(關係型的資料庫中存在表以及表與表之間關聯關係
  • Redis:是一個no sql的資料庫--->還是資料庫(非關係型的資料庫)
  • 非關係型的資料庫:簡單來說非關係型的資料庫不像關係型的資料庫那樣存在表以及表之間關聯關係,非關係型的資料庫中只存在鍵值對
  • 非關係型的資料庫中實際上,只有鍵值對形式的儲存,就像Map這種集合一樣,只存在鍵值對
  • Redis實際上就是一個基於鍵值對形式的檔案儲存系統而已
「疑問:」
  • 我們是否掌握Redis之後,就不會使用關係型資料庫(mysql/oracle)呢?



不是的 一般在進行開發的時候 我們一般情況下 都是使用 關係型資料庫和非關係型資料庫進行混用  各取所長 已達到使用者的好的體驗效果不是全部用Redis也不是全部用mysql常見的非關係型的資料庫:mogodb

2、Redis能幹什麼?

「主要用途:」

  • 百度上面的單點登入(SSO)
  • 商城上面的評論
  • 商城上面的積分
  • 購物車
  • 商城上的快取(主要是指的是:所有使用者公用的資料)
  • 最新最熱商品的計算
  • 訊息佇列的實現
  • ...


3、Redis的特點

「使用者管理命令:」

  • 基於記憶體的(資訊是在記憶體中的 訪問的速度特別快)
  • 資料結構簡單(Key-Value)
  • 支援資料的持久化(能夠將記憶體中的資料同步到硬碟)


4、Redis的安裝

「安裝流程:」

  • 下載地址:
安裝步驟:

    1 首先需要安裝gcc,把下載好的redis-3.0.0-rc2.tar.gz 放到linux /usr/local資料夾下
       yum install gcc

    2 進行解壓 tar -zxvf redis-3.0.0-rc2.tar.gz

    3 進入到redis-3.0.0目錄下,進行編譯 make

    4 進入到src下進行安裝 make install  驗證(ll檢視src下的目錄,有redis-server 、redis-cil即可)

    5 建立倆個資料夾存放redis命令和配置檔案

     mkdir -p /usr/local/redis/etc

     mkdir -p /usr/local/redis/bin

    6 把redis-3.0.0下的redis.conf 移動到/usr/local/redis/etc下,
 
      cp redis.conf /usr/local/redis/etc/

    7 把redis-3.0.0/src裡的mkreleasehdr.sh、redis-benchmark、redis-check-aof、redis-check-dump、redis-cli、redis-server 
     檔案移動到bin下,命令:

     mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis/bin

    8 啟動時並指定配置檔案:./redis-server /usr/local/redis/etc/redis.conf(注意要使用後臺啟動,所以修改redis.conf裡的      daemonize 改為yes)

    9 驗證啟動是否成功:
ps -ef | grep redis 檢視是否有redis服務 或者 檢視埠:netstat -tunpl | grep 6379

     進入redis客戶端 ./redis-cli 退出客戶端quit
/exit退出redis服務: 
    (1)pkill redis-server 、
    (2)kill 程式號、
                            
    (3)/usr/local/redis/bin/redis-cli shutdown 


5、Redis中的資料型別以及資料型別的使用場景

「資料型別及使用場景:」

 String

      應用場景是什麼?普通的資料快取這種一般就放到這裡面  應用場景比較廣   因為他就是一個鍵值對的字串而已

     List(可以重複的)

      應用場景:這個一般用在:部落格的關注、部落格的評論、部落格的積分

     Hash

      應用場景:SSO單點登入

     Set(無序但是不重複)

      應用場景:這個一般用在和List一樣但是不重複的   

    SetSort

      應用的場景:最新最熱的商品(有序)

6、Redis中的常用命令(資料型別相關)

「常用命令:」

 set key value:    設定值
  
    get key           獲取某一型別的值

    keys *            檢視所有的鍵

    
    del key1,key2..    刪除一個或者多個資料

    rename 原來的key   現在key的名字    從新給鍵命名

    keys *  將當前資料庫裡面的所有鍵排列出來


    //在Redis中預設有16個資料庫  資料庫的下標是0-15   預設儲存資料的是會儲存到 0號資料庫裡面

    select index    選中某一個資料庫

    keys *         支援模糊查詢

    exists key      判斷當前資料資料庫中是否存在某一個特定的key(注意:不是所有資料庫  而是當前操作的這個資料庫)

    type key       判斷值的型別

    expire key 時間(單位秒鐘)   設定key的過期時間

    ttl key     檢視key的過期時間

    persist  key    (把某一個key設定成永久有效)   

    set key value    儲存資料

    mset key value key value  key value    一次性設定多個鍵值對  注意:中間是沒有任何符號的

    mget a1 a2 a3 a4     一次性獲取多個值

    append key1 value    在某一個key對應的值上面追加值

    getset key value     先獲取key對應的值  然後再將後面的值 賦值給key

    mgetset key value key value   ....    同時為多個鍵設定值

    incr key    自增1

    incrby key step    每一次在原來的值上面增加 步長

    decr key    自減1

    decrby key step    每一次在原來的值上面減少 step


  Hash資料型別的方法

    Hset field key value   ---->設定相關的值                      HSet user userToken userInfo

    Hget field key value   ---->獲取設定的值

    hlen field             ---->獲取的是當前hash裡面一共的長度

    hmset field key value ...  --->一次性設定多個鍵值對到某一個名字中

    hsetnx field key value...  --->不存在的時候再來建立這個值和使用者

    hkeys *                ---->檢視所有的鍵

    hincrby field key      ---->自增

    hexists field          ----->檢視是否存在


  List資料型別對應的值

    lpush key value  ----->向裡面新增值

    lset key index value --->修改某一個位置的值

    lpop key         ----->彈棧(獲取這個值)

    lrem key count value ---->刪除list集合中的值

    
  Set集合

    sadd key value...   ---->向set集合中新增值

    spop key            ---->獲取set集合新增進去的值

    smove key           ---->刪除key

    
  SortSet 

     zadd key value score ---->表示的是新增元素到key中  score的意思是排序的位置

     zrange value 範圍(開始-結束) --->表示的是獲取某一範圍內的資料

     zrem value :刪除某一個值


7、Redis中的資料持久化問題

「持久化方式:」

  • 持久化方式有兩種 rdb aof
  • 持久化:簡單來說就是記憶體和資料寫入到硬碟的過程,就叫資料的持久化
  • 如果是記憶體的資料在斷電的情況下,資料會發生丟失,所以我們的記憶體資料是需要持久化的

「rdb模式:」


  rbd模式(開發一般都不用): 是根據我們的時間片來判斷什麼時候資料和硬碟進行同步  也就是說假設在一定的條件下才會將資料進行持久化(需要滿足一定的條件)、rdb模式在使用的時候會首先將記憶體資料寫入到零時檔案 、當這個記憶體的資料寫完成的時候 就會刪除原來的rdb檔案,重新將零時檔案中的內容寫入到rdb檔案中

    1>:條件要成立才寫(條件:)

    2>:先寫入零時的檔案---->刪除rdb檔案----->寫入rdb檔案

       因為要將記憶體中的所有資料寫入到零時檔案  相對來說需要更加頻繁的去操作IO

    rdb模式適合備份


   #表示的是在900秒之內有一個key發生改變那麼就要和硬碟同步
   save 900 1
   #在300秒時間之內 如果有10個key發生改變那麼就要和硬碟同步
   save 300 10
   #在60秒的時間內如果有10000個key發生改變那麼就要和硬碟同步
   save 60 10000


「aof模式:」


  aof模式:這種模式是相當於在原來的日誌基礎上來進行追加、實際上就相當於是 只是同步 改變了的內容  未改變的內容不用同步

      他不會頻繁的去操作IO

      要使用aof模式:

      appendonly yes

      #只要有一個key發生改變那麼立馬和後臺同步  這種模式呢不會丟資料但是  效率不高  一般不推薦
      # appendfsync always
      # 這個表示每秒鐘和硬碟同步一次
      appendfsync everysec
      # 這個和記憶體的緩衝區有關 緩衝區滿了自動同步  沒滿的話那麼就只有等
      # appendfsync no

8、Redis的主從複製問題(配置從伺服器)

「主從複製:」

 假設現在我有一種策略:這種策略就是 能夠將訪問Redis伺服器的請求分成兩類(讀、寫)
 
   然後將讀放到一部分的伺服器上、寫這個操作放到另外的一部分的伺服器上、這樣就能在3W併發上完成伺服器的所有的請求
   
   將伺服器上的讀和寫進行分離 又稱為讀寫分離資料庫的主從複製實際上完成的最終的功能就是讀寫分離

   主從複製:實際上指的是  主伺服器來實現寫,從伺服器來實現讀、所有的請求都經過主伺服器來完成

   主從複製的配置實現

「主從複製的步驟:」

 clone伺服器之後修改slave的IP地址

    修改配置檔案(從伺服器的配置檔案)  

 vim /usr/local/redis/etc/redis.conf 

    第一步:slaveof 主機地址(eg:119.23.220.148
 
 bind 0.0.0.0

    第一步下:
     
        #slaveof <masterip> <masterport>
        #改的第二個地方
        slaveof 112.74.49.17 6379

    第二步:masterauth<master-password>(這裡可以不用設定)
 
 cd /usr/local/redis/bin/
 
 ./redis-cli

    使用info 檢視role角色可以知道主服務或者從服務


9、Redis的哨兵模式

「哨兵模式:」

  • 單點問題:簡單來說就是一臺伺服器掛了,所有伺服器都不能用了
  • 哨兵模式的出現就是為了解決單點問題的
 哨兵:站崗的

   哨兵模式實際上是個程式、這個程式呢實際上就是用來檢測主伺服器的狀態的,一旦主伺服器掛了、那麼從伺服器就會進行投票選舉,按照預先設計的選舉策略,最終選舉出新的主伺服器

「哨兵模式的實現:」

  哨兵模式的實現:(哨兵是一個獨立的程式和redis本身的執行是沒有關聯的)

   任意的一臺機器上面去啟動哨兵的程式(從伺服器上)

   1>:quit  shutdown 退出redis

   2>:copy sentinel.xml到etc這個檔案下

   3>:修改 sentinel.xml這個檔案  

      dir   -> /usr/local/redis/etc(這個是告訴你路徑)

      sentinel monitor mymaster ip 埠 投票選舉的次數

      sentinel down-after-milliseconds mymaster 5000  多久進行檢測一下主節點活著沒有

   啟動哨兵  就必須跟上 sentinel這個配置檔案

   ...server/  ...sentinel.xml --sentinel &

10、Redis的叢集模式

「叢集搭建流程:」

  1>:你可以找6臺機器來進行安裝

  2>:你可以找一臺機器開6個埠來進行安裝

首先要將redis.conf 複製到我們的etc下
 cp /usr/local/redis-4.0.6/redis.conf /usr/local/redis/etc/

第一步驟:

    mkdir -p /usr/local/redis-cluster   //建立資料夾

第二步驟

     mkdir 500*    在剛剛建立的這個資料夾裡面建立6臺伺服器的 配置檔案的資料夾
 
第三步驟

     把原來的Redis.cnf檔案copy到我們的500*當中去

第四步驟

     修改配置
 
     daemonize yes

     port 500*

     bind 192.168.108.135 改成 0.0.0.0

     dir "/usr/local/redis-cluster/500*/" 最好打上""

     cluster-enabled yes 這個需要開啟註釋

     cluster-config-file nodes-500*.conf 這個需要開啟註釋

     cluster-node-timeout 5000 這個也需要開啟註釋

     appendonly yes


 第五步驟

   安裝ruby的相關工具

   yum install ruby

   yum install rubygems

   gem install redis  (報錯版本低了就執行 安裝rvm到第9步驟....)

   安裝rvm

    gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3

    \curl -sSL https://get.rvm.io | bash -s stable

    然後進入cd /usr/local/目錄下看是否多個了rvm
 
    然後進入 /usr/local/rvm/archives

   再進行壓縮檔案的解壓  tar-zxvf rvm-1.29.7.tgz

   3.source /usr/local/rvm/archives/rvm-1.29.7/scripts/rvm 新增一個軟連線 相當於windows建立一個快捷方式,相當於windows新增一個環境變數,找到這個命令的

    4. 檢視rvm庫中已知的ruby版本

    rvm list known

    5. 安裝一個ruby版本

    rvm install 2.3.3

    6. 使用一個ruby版本

    rvm use 2.3.3

    7. 設定預設版本

    rvm remove 2.0.0

    8. 解除安裝一個已知版本

    ruby --version

    9. 再安裝redis就可以了

    gem install redis   
  
    開啟每一個伺服器

 去阿里雲伺服器設定埠,並且伺服器重啟下

     ./redis-server /usr/local/redis-cluster/700*/redis.conf

     建立這個叢集
 進入cd /usr/local/redis-4.0.6/src/這個目錄中

  ./redis-trib.rb create --replicas 1 120.78.191.34:7001 120.78.191.34:7002 120.78.191.34:7003 120.78.191.34:7004 120.78.191.34:7005 120.78.191.34:7006

redis-cli --cluster create 106.54.13.167:5001 106.54.13.167:5002 106.54.13.167:5003 106.54.13.167:5004 106.54.13.167:5005 106.54.13.167:5006 --cluster-replicas 1

    登入客戶端實現驗證
  ./redis-cli -c -h 192.168.108.137 -p 5001

 Jedis進行單單機的訪問/連線池下的訪問/訪問叢集

   Redis資料庫的訪問是要依賴於Jedis



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2925239/,如需轉載,請註明出處,否則將追究法律責任。