NoSQL之Redis安裝配置與優化(理論+實踐)

關係數據庫與非關係型數據庫

關係型數據庫

  • 一個結構化的數據庫,建立在關係模型基礎,上,-般面向於記錄
  • 包括Oracle、MySQL、 SQL Server、Microsoft Access、DB2等

非關係型數據庫

  • 除了主流的關係型數據庫之外的數據庫, 都認爲是非關係型的
  • 包括Redis、MongBD、 Hbase、 CouhDB等

非關係型數據庫產生背景

  • High performance——對數據庫高併發讀寫需求
  • Huge Storage——對海量數據高效存儲與訪問需求
  • High Scalability && High Availability——對數據庫高可擴展性與高可用性需求

Redis簡介

  • Redis基於內存運行並支持持久化
  • 採用key-value (鍵值對)的存儲形式
  • 優勢
    • 具備極高的數據讀寫速度
    • 支持豐富的數據類型
    • 支持數據的持久化
    • 原子性
    • 支持數據備份

Redis配置文件

配置參數(/etc/redis/6379.conf)

  • bind:監聽的主機地址
  • port:端口
  • daemonize yes:啓用守護進程
  • pidfile:指定PID文件
  • loglevel notice:日誌級別
  • logfile:指定日誌文件

服務搭建實踐

安裝服務環境組件,並掛載壓縮包,編譯安裝redis

[root@localhost ~]# yum install gcc gcc-c++ make -y         //安裝環境組件
[root@localhost ~]# mount.cifs //192.168.100.3/LNMP-C7 /mnt/     //掛載軟件包
Password for root@//192.168.100.8/LNMP-C7:  
[root@localhost ~]# cd /mnt/
[root@localhost mnt]# tar zxvf redis-5.0.7.tar.gz -C /opt/      //解壓
[root@localhost mnt]# cd /opt/redis-5.0.7/
[root@localhost redis-5.0.7]# make                     //編譯
[root@localhost redis-5.0.7]# make PREFIX=/usr/local/redis/ install     //安裝

執行配置Redis配置文件腳本,並進行配置

[root@localhost redis-5.0.7]# cd utils/
[root@localhost utils]# ./install_server.sh       //執行腳本進行配置
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379]       //默認端口號
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf]     //配置文件存放位置
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log]       //日誌文件存放位置
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]      //數據文件存放位置
Selected default - /var/lib/redis/6379
Please select the redis executable path [] /usr/local/redis/bin/redis-server     //可執行文件路徑
[root@localhost utils]# ln -s /usr/local/redis/bin/* /usr/local/bin/       //製做連接文件便於系統識別
[root@localhost utils]# netstat -ntap | grep 6379                    //查看端口是否開啓
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      44510/redis-server  
[root@localhost utils]# /etc/init.d/redis_6379 stop              //關閉redis命令
Stopping ...
Redis stopped
[root@localhost utils]# /etc/init.d/redis_6379 start                //開啓redis命令
Starting Redis server...
[root@localhost utils]# vim /etc/redis/6379.conf       //修改配置文件
bind 127.0.0.1 192.168.144.128                         //配置監聽地址
[root@localhost utils]# /etc/init.d/redis_6379 restart      //重啓redis服務
Stopping ...
Redis stopped
Starting Redis server...

Redis數據庫經常使用命令

redis-cli命令行工具

  • 鏈接本地數據庫
    [root@localhost utils]# /usr/local/redis/bin/redis-cli
    127.0.0.1:6379>
  • 鏈接遠程數據庫
    [root@localhost utils]# redis-cli -h 192.168.144.128 -p 6379
    192.168.144.128:6379>
  • 獲取命令幫助c++

    192.168.144.128:6379> help set  ##help幫助
    
    SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
    summary: Set the string value of a key
    since: 1.0.0
    group: string
  • set:存放數據
    192.168.144.128:6379> set teacher zhangsan
    OK
    192.168.144.128:6379> set tea red
    OK
  • get:獲取數據redis

    192.168.144.128:6379> get tea   ##查看鍵的值
    "red"

    key相關命令

  • keys:獲取符合規則的鍵值列表
    127.0.0.1:6379> keys *       //查看當前數據庫中全部的鍵
    127.0.0.1:6379> keys V*      //查看當前數據庫中以v開頭的鍵
    127.0.0.1:6379> keys v?      //查看當前數據庫中以v開頭後面包含任意一個字符的鍵
    127.0.0.1:6379> keys v??     //查看當前數據庫中以v開頭後面包含任意二個字符的鍵
    192.168.144.128:6379> KEYS *   ##查看全部的鍵
    1) "teacher"
    2) "tea"
    192.168.144.128:6379> keys t??  ##查看鍵是t開頭後面是兩個字符的
    1) "tea"
  • exists:判斷鍵值是否存在
    192.168.144.128:6379> EXISTS tea
    (integer) 1                  //1是存在
    192.168.144.128:6379> EXISTS teas
    (integer) 0                  //0是不存在
  • del:刪除當前數據庫的指定key
    192.168.144.128:6379> del teacher  ##刪除鍵
    (integer) 1
    192.168.144.128:6379> KEYS *
    1) "tea"
  • type:獲取key對應的value值類型
    192.168.144.128:6379> type tea   ##查看鍵的類型
    string
  • rename(覆蓋) / renamenx (不覆蓋) :對已有的key進行重命名
    192.168.144.128:6379> rename tea t1   ##給鍵重命名
    OK
    192.168.144.128:6379> keys *
    1) "t1"
    192.168.144.128:6379> get t1
    "red"
  • dbsize:查看當前數據庫中key的數目
    192.168.144.128:6379> dbsize
    (integer) 1
  • redis-benchmark測試工具
    • -h:指定服務器主機名
    • -p:指定服務器端口
    • -c:指定併發鏈接數
    • -n:指定請求數
    • -d:以字節的形式指定SET/GET值的數據大小
    • -q:強制推出redis。僅顯示query/sec值
[root@localhost utils]# redis-benchmark -h 192.168.144.128 -p 6379 -c 100 -n 100000     //併發100,100000個請求
====== SET ======
100000 requests completed in 1.14 seconds        //請求花費的時間
100 parallel clients
3 bytes payload
keep alive: 1

84.66% <= 1 milliseconds
98.48% <= 2 milliseconds
99.69% <= 3 milliseconds
99.90% <= 18 milliseconds
100.00% <= 18 milliseconds
87642.41 requests per second

====== GET ======
100000 requests completed in 1.144 seconds
100 parallel clients
3 bytes payload
keep alive: 1
[root@localhost utils]# redis-benchmark -h 192.168.144.128 -p 6379 -q -d 100        //以字節形式指定set/get值的數據大小
SET: 90497.73 requests per second
GET: 90991.81 requests per second

Redis多數據庫操做

  • Redis支持多數據庫,默認支持16個數據庫, 0-15命名
  • 多數據庫相互獨立,互不干擾
  • 多數據庫經常使用命令
    • 多數據庫間切換
      192.168.144.128:6379> select 10       //進入第11個庫
      OK
      192.168.144.128:6379[10]> keys *
      (empty list or set)
      192.168.144.128:6379[10]> select 0         //進入第1個庫
      OK
    • 多數據庫間移動數據
      192.168.144.128:6379> move t1 10       //移動鍵值對到第11個庫
      (integer) 1
      192.168.144.128:6379> select 10        //進入第11個庫
      OK
      192.168.144.128:6379[10]> keys *       //查看鍵
      1) "t1"
      192.168.144.128:6379[10]> get t1
      "red"
  • 清除數據庫內數據
    192.168.144.128:6379[10]> flushdb          //清除庫中數據
    OK
    192.168.144.128:6379[10]> keys *            //查看全部鍵
    (empty list or set)

    Redis持久化

持久化概述

  • Redis是運行在內存中,內存中的數據斷電丟失
  • 爲了可以重用Redis數據,或者防止系統故障,咱們須要將Redis中的數據寫入到磁盤空間中,即持久化

持久化的分類

  • RDB方式:建立快照的方式獲取某一時刻Redis中全部數據的副本
    • 優勢:資源佔用低
    • 缺點:不能保證數據的實時保存
  • AOF方式:將執行的寫命令寫到文件的末尾,以日誌的方式來記錄數據的變化算法

    • 優勢:實時記錄數據
    • 缺點:資源損耗大,數據丟失時同步時間過長

      RDB持久化

  • Redis的默認持久化方式
  • 默認文件名dump.rdb
  • 觸發條件
    • 在指定的時間間隔內,執行指定次數的寫操做(配置文件控制)
    • 執行save或者bgsave(異步)命令
    • 執行flushall命令,清空數據庫中全部數據(不建議使用)
    • 執行shutdown命令,保證服務器正常關閉且不丟失任何數據
  • 優缺點
    • 適合大規模的數據恢復
    • 若是業務對數據完整性和一致性要求不高,RDB是很好的選擇
    • 數據的完整性和一致性不高
    • 備份時佔用內存

經過RDB文件恢復數據

  • 將dump.rdb文件拷貝到redis的安裝目錄的bin目錄下,重啓redis服務便可
  • 配置文件選項數據庫

    [root@localhost utils]# vim /etc/redis/6379.conf 
    save 900 1                    //900秒以內至少一次寫操做
    save 300 10                   //300秒以內至少發生10次寫操做
    save 60 10000                 //60秒以內發生至少10000次寫操做;只要知足其一都會觸發快照操做,註釋全部的save項表示關閉RDB
    dbfilename dump.rdb           //備份文件名稱
    dir /var/lib/redis/6379       //備份文件保存目錄
    rdbcompression yes            //開啓壓縮

    AOF持久化

  • Redis默認不開啓
  • 彌補RDB的不足(數據的不一致性)
  • 採用日誌的形式來記錄每一個寫操做,並追加到文件中
  • Redis重啓會根據日誌文件的內容將寫指令從前到後執行一次以完成數據的恢復工做

根據AOF文件恢復數據

  • 將appendonly.aof文件拷貝到redis安裝目錄的bin目錄下,重啓redis服務便可
  • AOF持久化配置vim

    [root@localhost utils]# vim /etc/redis/6379.conf 
    appendonly yes          //開啓AOF持久化
    appendfilename "appendonly.aof"       //AOF文件名稱
    # appendfsync always                //always:同步持久化,每次發生數據變化會馬上寫入磁盤
    appendfsync everysec                //everysec:默認推薦,每秒異步記錄次(默認值)
    # appendfsync no                    //no:不一樣步,交給操做系統決定如何同步
    aof-load-truncated yes              //忽略最後一條可能存在問題的指令

    AOF的重寫機制

  • AOF的工做原理是將寫操做追加到文件中,文件的冗餘內容會愈來愈多
  • 當AOF文件的大小超過所設定的閥值時,Redis就會對AOF文件的內容壓縮

AOF重寫的原理

  • Redis會fork出一條新進程,讀取內存中的數據(並無讀取舊文件),並從新寫到一個臨時文件中,最後替換舊的aof文件

AOF重寫配置

[root@localhost utils]# vim /etc/redis/6379.conf 
no-appendfsync-on-rewrite no        
//在日誌進行BGREWRITEAOF時, 若是設置爲yes表示新寫操做不進行同步fsync,只暫存在緩衝區裏,避免形成磁盤I0操做衝突,等重寫完成後在寫入。redis中默認爲no
auto-aof-rewrite-percentage 100     
//當前AOF文件大小是上第二天志重寫時AOF文件大小兩倍時,發生BGREWRITEAOF操做
auto-aof-rewrite-min-size 64mb   
//當前AOF文件執行BGREWRITEAOF命令的最小值,避免剛開始啓動Reids時因爲文件尺寸較小致使頻繁的BGREWRITEAOF

Redis性能管理

查看redis內存使用

[root@localhost utils]# /usr/local/redis/bin/redis-cli
127.0.0.1:6379> info memory

內存碎片率

  • 操系統分配的內存值used_memory_rss除以redis使用的內存值used_memory計算得出
  • 內存碎片是由操做系統低效的分配/回收物理內存致使的
    • 不連續的物理內存分配
  • 跟蹤內存碎片率對理解redis實例的資源性能是很是重要的緩存

    • 內存碎片率稍大於1是合理的,這個值表示內存碎片率比較低
    • 內存碎片率超過1.5,說明redis消耗了實際須要物理內存的150%,其中50%是內存碎片率
    • 內存碎片率低於1的,說明Redis內存分配超出了物理內存,操做系統正在進行內存交換

    內存使用率

    • redis實例的內存使用率超過可用最大內存,操做系統將開始進行
    • 內存與swap空間交換
  • 避免內存交換服務器

    • 針對緩存數據大小選擇
    • 儘量的使用Hash數據結構
    • 設置key的過時時間

    回收key

    • 保證合理分配redis有限的內存資源
    • 當內存使用達到設置的最大閥值時,須要選擇一種key的回收策略
    • 默認狀況下回收策略是禁止刪除
    • redis.conf配置文件中修改maxmemory-policy屬性值
    • volatile-lru:使用LRU算法從已設置過時時間的數據集合中淘汰數據
    • volatile-ttl:從已設置過時時間的數據集合中挑選即將過時的數據淘汰(建議使用)
    • volatile-random:從已設置過時時間的數據集合中隨機挑選數據淘汰
    • allkeys-lru:使用LRU算法從全部數據集合中淘汰數據
    • allkeys-random:從數據集合中任意選擇數據淘汰
    • no-enviction:禁止淘汰數據
相關文章
相關標籤/搜索