深刻剖析Redis系列(一) - Redis入門簡介與主從搭建

前言

Redis 是一種基於 鍵值對NoSQL 數據庫。與不少鍵值對數據庫不一樣,Redis 提供了豐富的 值數據存儲結構,包括 string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、bitmap(位圖)等等。redis

其餘文章

正文

Redis 是一個使用 ANSI C 編寫的開源、支持 網絡、基於 內存單線程模型可選持久性鍵值對存儲數據庫數據結構

1. Redis的特性

  1. 速度快,最快可達到 10w QPS(基於 內存C 語言,單線程 架構);

  2. 基於 鍵值對 (key/value) 的數據結構服務器。全稱 Remote Dictionary Server。包括 string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、bitmap(位圖)。同時在 字符串 的基礎上演變出 位圖BitMaps)和 HyperLogLog 兩種數據結構。3.2 版本中加入 GEO地理信息位置)。

  3. 豐富的功能。例如:鍵過時(緩存),發佈訂閱(消息隊列), Lua 腳本(本身實現 Redis 命令),事務流水線Pipeline,用於減小網絡開銷)。

  4. 簡單穩定。無外部庫依賴,單線程模型。

  5. 客戶端語言多。

  6. 持久化(支持兩種 持久化 方式 RDBAOF)。

  7. 主從複製(分佈式的基礎)。

  8. 高可用Redis Sentinel),分佈式Redis Cluster)和 水平擴容

2. Redis的應用場景

2.1. 緩存

合理的使用 緩存 可以明顯加快訪問的速度,同時下降數據源的壓力。這也是 Redis 最經常使用的功能。Redis 提供了 鍵值過時時間EXPIRE key seconds)設置,而且也提供了靈活控制 最大內存內存溢出 後的 淘汰策略

2.2. 排行榜

每一個網站都有本身的排行榜,例如按照 熱度排名 的排行榜,發佈時間 的排行榜,答題排行榜 等等。Redis 提供了 列表list)和 有序集合zset)數據結構,合理的使用這些數據結構,能夠很方便的構建各類排行榜系統。

2.3. 計數器

計數器 在網站應用中很是重要。例如:點贊數1瀏覽數1。還有經常使用的 限流操做,限制每一個用戶每秒 訪問系統的次數 等等。Redis 支持 計數功能INCR key),並且計數的 性能 也很是好,計數的同時也能夠設置 超時時間,這樣就能夠 實現限流

2.4. 社交網絡

贊/踩,粉絲,共同好友/喜愛,推送,下拉刷新等是社交網站必備的功能。因爲社交網站 訪問量一般比較大,並且 傳統的數據庫 不太適合保存這類數據,Redis 提供的 數據結構 能夠相對比較容易實現這些功能。

2.5. 消息隊列

Redis 提供的 發佈訂閱PUB/SUB)和 阻塞隊列 的功能,雖然和專業的消息隊列比,還 不夠強大,但對於通常的消息隊列功能基本知足。

3. Redis的安裝配置

下面介紹一下 Redis 的安裝流程。我會按照以下的順序,逐步搭建出 高可用Redis 緩存服務器集羣。

  • Redis 單機服務器 搭建
  • Redis 主從複製 搭建
  • Redis-Sentinel 高可用 搭建

3.1. Redis單機服務器安裝

3.1.1. 下載並解壓

首先從 Redis 官網下載 Redis 源代碼並解壓,這裏使用的是 最新穩定版本 4.0.11。依次執行以下命令:

cd /usr/local/
wget http://download.redis.io/releases/redis-4.0.11.tar.gz
tar -zxvf redis-4.0.2.tar.gz
複製代碼

3.1.2. 編譯並安裝

下載並解壓完畢後,則對 源碼包 進行 編譯安裝,這裏 Redis 安裝路徑爲 /usr/local/redis

注意make install PREFIX=目標安裝路徑

cd /usr/local/redis-4.0.11
make install PREFIX=/usr/local/redis
複製代碼

安裝完成時,/usr/local/redis/bin 目錄下會生成的幾個可執行的文件。

可執行文件 做用
redis-server 啓動 redis 服務
redis-cli redis 命令行客戶端
redis-benchmark redis 基準測試工具
redis-check-aof redis AOF 持久化文件檢測和修復工具
redis-check-dump redis RDB 持久化文件檢測和修復工具
redis-sentinel 啓動 redis sentinel

複製 Redis 相關命令到 /usr/local/bin 目錄下,這樣就能夠直接執行這些命令,不用寫全路徑。

$ cd /usr/local/redis/bin/
$ sudo sudo cp redis-cli redis-server redis-sentinel /usr/local/bin
複製代碼

3.1.3. 修改Redis配置文件

安裝完成以後將 Redis 配置文件拷貝到 /usr/local 下,redis.confRedis 的配置文件,redis.confRedis 源碼目錄,port 默認是 6379

$ sudo cp /usr/local/redis-4.0.11/redis.conf /usr/local/
複製代碼

Redis 配置文件主要參數解析參考:

# redis進程是否以守護進程的方式運行,yes爲是,no爲否(不以守護進程的方式運行會佔用一個終端)。
daemonize no
# 指定redis進程的PID文件存放位置
pidfile /var/run/redis.pid
# redis進程的端口號
port 6379
# 綁定的主機地址
bind 127.0.0.1
# 客戶端閒置多長時間後關閉鏈接,默認此參數爲0即關閉此功能
timeout 300
# redis日誌級別,可用的級別有debug.verbose.notice.warning
loglevel verbose
# log文件輸出位置,若是進程以守護進程的方式運行,此處又將輸出文件設置爲stdout的話,就會將日誌信息輸出到/dev/null裏面去了
logfile stdout
# 設置數據庫的數量,默認爲0可使用select <dbid>命令在鏈接上指定數據庫id
databases 16
# 指定在多少時間內刷新次數達到多少的時候會將數據同步到數據文件
save <seconds> <changes>
# 指定存儲至本地數據庫時是否壓縮文件,默認爲yes即啓用存儲
rdbcompression yes
# 指定本地數據庫文件名
dbfilename dump.db
# 指定本地數據問就按存放位置
dir ./
# 指定當本機爲slave服務時,設置master服務的IP地址及端口,在redis啓動的時候他會自動跟master進行數據同步
slaveof <masterip> <masterport>
# 當master設置了密碼保護時,slave服務鏈接master的密碼
masterauth <master-password>
# 設置redis鏈接密碼,若是配置了鏈接密碼,客戶端在鏈接redis是須要經過AUTH<password>命令提供密碼,默認關閉
requirepass footbared
# 設置同一時間最大客戶鏈接數,默認無限制。redis能夠同時鏈接的客戶端數爲redis程序能夠打開的最大文件描述符,若是設置 maxclients 0,表示不做限制。當客戶端鏈接數到達限制時,Redis會關閉新的鏈接並向客戶端返回 max number of clients reached 錯誤信息
maxclients 128
# 指定Redis最大內存限制,Redis在啓動時會把數據加載到內存中,達到最大內存後,Redis會先嚐試清除已到期或即將到期的Key。當此方法處理後,仍然到達最大內存設置,將沒法再進行寫入操做,但仍然能夠進行讀取操做。Redis新的vm機制,會把Key存放內存,Value會存放在swap區
maxmemory<bytes>
# 指定是否在每次更新操做後進行日誌記錄,Redis在默認狀況下是異步的把數據寫入磁盤,若是不開啓,可能會在斷電時致使一段時間內的數據丟失。由於redis自己同步數據文件是按上面save條件來同步的,因此有的數據會在一段時間內只存在於內存中。默認爲no。
appendonly no
# 指定跟新日誌文件名默認爲appendonly.aof
appendfilename appendonly.aof
# 指定更新日誌的條件,有三個可選參數 - no:表示等操做系統進行數據緩存同步到磁盤(快),always:表示每次更新操做後手動調用fsync()將數據寫到磁盤(慢,安全), everysec:表示每秒同步一次(折衷,默認值);
appendfsync everysec
複製代碼
  • 設置後臺啓動

因爲 Redis 默認是 前臺啓動,不建議使用。修改 Redis 配置文件,把 daemonize no 改成 daemonize yes

daemonize yes
複製代碼
  • 設置遠程訪問

Redis 默認只容許 本機訪問,把 bind 修改成 bind 0.0.0.0 此設置會變成 容許全部遠程訪問。若是想指定限制訪問,可設置對應的 IP

bind 0.0.0.0
複製代碼
  • 配置 Redis 日誌記錄

找到 logfile 配置,默認是:logfile "",改成自定義日誌文件路徑。

logfile /var/log/redis_6379.log
複製代碼
  • 設置 Redis 請求密碼

requirepass 修改成 123456,修改以後重啓下服務

requirepass "123456"
複製代碼

有了密碼以後,進入客戶端,就得這樣訪問:

$ redis-cli -h 127.0.0.1 -p 6379 -a 123456
複製代碼

3.1.4. Redis的經常使用命令

  • 啓動命令
$ redis-server /usr/local/redis.conf
複製代碼
  • 關閉命令
$ redis-cli -h 127.0.0.1 -p 6379 shutdown
複製代碼
  • 查看是否啓動
$ ps -ef | grep redis
複製代碼
  • 進入客戶端
$ redis-cli
複製代碼
  • 關閉客戶端
$ redis-cli shutdown
複製代碼

注意:不建議使用 kill -9,這種方式不但不會作持久化操做,還會形成緩衝區等資源不能優雅關閉。極端狀況下形成 AOF複製丟失數據 的狀況。shutdown 還有一個參數,表明是否在關閉 redis 前,生成 持久化文件,命令爲 redis-cli shutdown nosave|save

  • 設置爲開機自動啓動
$ echo "redis-server /usr/local/redis.conf" >> /etc/rc.local
複製代碼
  • 開放防火牆端口
# 添加規則
iptables -I INPUT -p tcp -m tcp --dport 6379 -j ACCEPT
# 保存規則
service iptables save
# 重啓iptables
service iptables restart
複製代碼

3.1.5. 註冊Redis爲系統服務

/etc/init.d 目錄下添加 Redis 服務的 啓動暫停重啓 腳本:

$ sudo /etc/init.d/redis
複製代碼

腳本的內容以下:

#!/bin/sh 
# 
# redis - this script starts and stops the redis-server daemon 
# 
# chkconfig: - 85 15 
# description: Redis is a persistent key-value database 
# processname: redis-server 
# config: /usr/local/redis/bin/redis-server
# config: /etc/redis.conf 
# Source function library. 
. /etc/rc.d/init.d/functions  
# Source networking configuration. 
. /etc/sysconfig/network  
# Check that networking is up. 
[ "$NETWORKING" = "no" ] && exit 0  
redis="/usr/local/redis/bin/redis-server" 
prog=$(basename $redis)  
REDIS_CONF_FILE="/etc/redis.conf" 
[ -f /etc/sysconfig/redis ] && . /etc/sysconfig/redis  
lockfile=/var/lock/subsys/redis  
start() {  
    [ -x $redis ] || exit 5  
    [ -f $REDIS_CONF_FILE ] || exit 6  
    echo -n $"Starting $prog: "  
    daemon $redis $REDIS_CONF_FILE  
    retval=$?  
    echo  
    [ $retval -eq 0 ] && touch $lockfile  
    return $retval  
}  
stop() {  
    echo -n $"Stopping $prog: "  
    killproc $prog -QUIT  
    retval=$?  
    echo  
    [ $retval -eq 0 ] && rm -f $lockfile  
    return $retval  
}  
restart() {  
    stop  
    start  
}  
reload() {  
    echo -n $"Reloading $prog: "  
    killproc $redis -HUP  
    RETVAL=$?  
    echo  
}  
force_reload() {  
    restart  
}  
rh_status() {  
    status $prog  
}  
rh_status_q() {  
    rh_status >/dev/null 2>&1  
}  
case "$1" in  
    start)  
        rh_status_q && exit 0  
        $1  
        ;;  
    stop)  
        rh_status_q || exit 0  
        $1  
        ;;  
    restart|configtest)  
        $1  
        ;;  
    reload)  
        rh_status_q || exit 7  
        $1  
        ;;  
    force-reload)  
        force_reload  
        ;;  
    status)  
        rh_status  
        ;;  
    condrestart|try-restart)  
        rh_status_q || exit 0  
    ;;  
    *)  
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|orce-reload}"  
        exit 2  
esac
複製代碼

賦予腳本文件可執行權限:

$ chmod 755 /etc/init.d/redis
複製代碼

啓動、中止和重啓 redis 服務:

service redis start
service redis stop
service redis restart
複製代碼

3.2. Redis主從複製集羣安裝

3.2.1. Redis-Server配置說明

角色 IP地址 端口號
Redis Master 10.206.20.231 16379
Redis Slave 10.206.20.231 26379

3.2.2. Redis主從架構配置

  • 編輯 從機Redis 配置文件,找到 210 行(大概)- #slaveof <masterip> <masterport> 。去掉該註釋,填寫 主服務器IP端口
slaveof 10.206.20.231 16379
複製代碼
  • 若是 主服務器 設置了密碼,還須要找到 masterauth <master-password> 這一行,去掉註釋,改成 masterauth 的主機密碼。
masterauth 123456
複製代碼
  • 配置完成後重啓 從服務器Redis 服務。
$ service redis restart
複製代碼
  • 重啓完成以後,進入 主服務器redis-cli 模式下,命令爲 redis-cli -h 127.0.0.1 -p 16379 -a 123456。輸入 INFO replication 查詢到 當前主機Redis 的狀態,鏈接上 主服務器從服務器

Redis 主服務器 的配置文件:

  • redis.conf
daemonize yes
pidfile /var/run/redis-16379.pid
logfile /var/log/redis/redis-16379.log
port 16379
bind 0.0.0.0
timeout 300
databases 16
dbfilename dump-16379.db
dir ./redis-workdir
masterauth 123456
requirepass 123456
複製代碼

Redis 從服務器 的配置文件:

  • redis.conf
daemonize yes
pidfile /var/run/redis-26379.pid
logfile /var/log/redis/redis-26379.log
port 26379
bind 0.0.0.0
timeout 300
databases 16
dbfilename dump-26379.db
dir ./redis-workdir
masterauth 123456
requirepass 123456
slaveof 127.0.0.1 16379
複製代碼

Redis 主服務器 的狀態以下:

# Replication
role:master
connected_slaves:1
slave0:ip=10.206.20.231,port=16379,state=online,offset=28,lag=1
master_replid:625ae9f362643da5337835beaeabfdca426198c7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:28
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:28
複製代碼

Redis 從服務器 的狀態以下:

# Replication
role:slave
master_host:10.206.20.231
master_port:26379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:210
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:625ae9f362643da5337835beaeabfdca426198c7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:210
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:210
複製代碼

3.2.3. Redis主從配置驗證

上面完成了基本的 主從配置,能夠簡單的測試一下效果:

  • 進入 主服務器redis-cli 模式,而後 set 一個值,好比:
> set master_port "16379"
OK
複製代碼
  • 切換進入 從服務器redis-cli 的模式,查詢剛剛設置的值看是否存在:
> get master_port
"16379"
複製代碼

此時,咱們能夠發現是能夠獲取到值的,Redis主從模式 正常工做。

小結

本文簡單的說明了 Redis 的相關 特性應用場景,詳細地給出 Redis 單服務器的 編譯安裝配置啓動,進一步引入了 Redis 主從複製 的相關原理和詳細配置。關於 Redis高可用機制集羣搭建,下文將給出詳細的說明。

參考

《Redis 開發與運維》


歡迎關注技術公衆號: 零壹技術棧

零壹技術棧

本賬號將持續分享後端技術乾貨,包括虛擬機基礎,多線程編程,高性能框架,異步、緩存和消息中間件,分佈式和微服務,架構學習和進階等學習資料和文章。

相關文章
相關標籤/搜索