Redis-集羣模式&哨兵模式介紹&持久化

Redis是什麼

redis是一款開源的基於內存的高性能key-value數據庫,常用於存儲熱數據的緩存數據庫。

Redis的鍵值可以包括字符串(strings)類型,同時它還包括哈希(hashes)、列表(lists)、集合(sets)和 有序集合(sorted sets)等數據類型。 對於這些數據類型,你可以執行原子操作。例如:對字符串進行附加操作(append);遞增哈希中的值;向列表中增加元素;計算集合的交集、並集與差集等。爲了獲得優異的性能,Redis採用了內存中(in-memory)數據集(dataset)的方式。
Redis支持數據的持久化,你可以每隔一段時間將數據集轉存到磁盤上(snapshot),或者在日誌尾部追加每一條操作命令(append only file,aof)。Redis同樣支持主從複製(master-slave replication),並且具有非常快速的非阻塞首次同步( non-blocking first synchronization)、網絡斷開自動重連等功能。同時Redis還具有其它一些特性,其中包括簡單的事物支持、發佈訂閱 ( pub/sub)、管道(pipeline)和虛擬內存(vm)等 。
Redis具有豐富的客戶端,支持現階段流行的大多數編程語言。

Redis的安裝配置

Redis的安裝

下載最新穩定版 redis( http://redis.io/download )tar zxvf redis-2.2.11 解壓縮[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-2okvz8ML-1588994524718)(en-resource://database/581:1)]

  • cd src 進入src目錄
  • make 編譯Redis
  • make test 可以測試一下(本步可省略)
  • make install 安裝,默認安裝目錄是 /usr/local/bin,生成如圖5個二進制文件,可以將其拷到新建目錄下,例如: /usr/local/redis/bin[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-CRU9m1oA-1588994524727)(en-resource://database/580:1)]
  • cp 源碼/src/redis.conf /usr/local/redis/etc 配置文件複製
  • cd /usr/local/redis
    *./bin/redis-server ./etc/redis.conf 啓動Redis服務

此時redis已經運行,但要獲得好的性能,還需要對配置文件進行合理的配置

Redis的配置文件

daemonize yes
pidfile "/var/run/redis.pid"
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/app/redis/bin/redis6379.log"
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
dir "/app/redis/bin"
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
  • Redis默認不是以守護進程的方式運行,可以通過該配置項修改,使用yes啓用守護進程
    daemonize no
  • 當Redis以守護進程方式運行時,Redis默認會把pid寫入/var/run/redis.pid文件,可以通過pidfile指定
    pidfile /var/run/redis.pid
  • 指定Redis監聽端口,默認端口爲6379,作者在自己的一篇博文中解釋了爲什麼選用6379作爲默認端口,因爲6379在手機按鍵上MERZ對應的號碼,而MERZ取自意大利歌女Alessia Merz的名字
    port 6379
  • 綁定的主機地址
    bind 127.0.0.1
  • 當 客戶端閒置多長時間後關閉連接,如果指定爲0,表示關閉該功能
    timeout 300
  • 指定日誌記錄級別,Redis總共支持四個級別:debug、verbose、notice、warning,默認爲verbose
    loglevel verbose7. 日誌記錄方式,默認爲標準輸出,如果配置Redis爲守護進程方式運行,而這裏又配置爲日誌記錄方式爲標準輸出,則日誌將會發送給/dev/null
    logfile stdout
  • 設置數據庫的數量,默認數據庫爲0,可以使用SELECT 命令在連接上指定數據庫id
    databases 16
  • 指定在多長時間內,有多少次更新操作,就將數據同步到數據文件,可以多個條件配合
    save
    Redis默認配置文件中提供了三個條件:
    save 900 1
    save 300 10
    save 60 10000
    分別表示900秒(15分鐘)內有1個更改,300秒(5分鐘)內有10個更改以及60秒內有10000個更改。
  • 指定存儲至本地數據庫時是否壓縮數據,默認爲yes,Redis採用LZF壓縮,如果爲了節省CPU時間,可以關閉該選項,但會導致數據庫文件變的巨大
    rdbcompression yes11. 指定本地數據庫文件名,默認值爲dump.rdb
    dbfilename dump.rdb
  • 指定本地數據庫存放目錄
    dir ./
  • 設置當本機爲slav服務時,設置master服務的IP地址及端口,在Redis啓動時,它會自動從master進行數據同步
    slaveof
  • 當master服務設置了密碼保護時,slav服務連接master的密碼
    masterauth
  • 設置Redis連接密碼,如果配置了連接密碼,客戶端在連接Redis時需要通過AUTH 命令提供密碼,默認關閉
    requirepass foobared
  • 設置同一時間最大客戶端連接數,默認無限制,Redis可以同時打開的客戶端連接數爲Redis進程可以打開的最大文件描述符數,如果設置 maxclients 0,表示不作限制。當客戶端連接數到達限制時,Redis會關閉新的連接並向客戶端返回max number of clients reached錯誤信息
    maxclients 12817. 指定Redis最大內存限制,Redis在啓動時會把數據加載到內存中,達到最大內存後,Redis會先嚐試清除已到期或即將到期的Key,當此方法處理 後,仍然到達最大內存設置,將無法再進行寫入操作,但仍然可以進行讀取操作。Redis新的vm機制,會把Key存放內存,Value會存放在swap區
    maxmemory
  • 指定是否在每次更新操作後進行日誌記錄,Redis在默認情況下是異步的把數據寫入磁盤,如果不開啓,可能會在斷電時導致一段時間內的數據丟失。因爲 redis本身同步數據文件是按上面save條件來同步的,所以有的數據會在一段時間內只存在於內存中。默認爲no
    appendonly no
  • 指定更新日誌文件名,默認爲appendonly.aof
    appendfilename appendonly.aof
  • 指定更新日誌條件,共有3個可選值: no:表示等操作系統進行數據緩存同步到磁盤(快) always:表示每次更新操作後手動調用fsync()將數據寫到磁盤(慢,安全) everysec:表示每秒同步一次(折衷,默認值)
    appendfsync everysec21. 指定是否啓用虛擬內存機制,默認值爲no,簡單的介紹一下,VM機制將數據分頁存放,由Redis將訪問量較少的頁即冷數據swap到磁盤上,訪問多的頁面由磁盤自動換出到內存中(在後面的文章我會仔細分析Redis的VM機制)
    vm-enabled no
  • 虛擬內存文件路徑,默認值爲/tmp/redis.swap,不可多個Redis實例共享
    vm-swap-file /tmp/redis.swap
  • 將所有大於vm-max-memory的數據存入虛擬內存,無論vm-max-memory設置多小,所有索引數據都是內存存儲的(Redis的索引數據 就是keys),也就是說,當vm-max-memory設置爲0的時候,其實是所有value都存在於磁盤。默認值爲0
    vm-max-memory 0
  • Redis swap文件分成了很多的page,一個對象可以保存在多個page上面,但一個page上不能被多個對象共享,vm-page-size是要根據存儲的 數據大小來設定的,作者建議如果存儲很多小對象,page大小最好設置爲32或者64bytes;如果存儲很大大對象,則可以使用更大的page,如果不 確定,就使用默認值
    vm-page-size 32
  • 設置swap文件中的page數量,由於頁表(一種表示頁面空閒或使用的bitmap)是在放在內存中的,,在磁盤上每8個pages將消耗1byte的內存。
    vm-pages 13421772826. 設置訪問swap文件的線程數,最好不要超過機器的核數,如果設置爲0,那麼所有對swap文件的操作都是串行的,可能會造成比較長時間的延遲。默認值爲4
    vm-max-threads 4
  • 設置在向客戶端應答時,是否把較小的包合併爲一個包發送,默認爲開啓
    glueoutputbuf yes
  • 指定在超過一定的數量或者最大的元素超過某一臨界值時,採用一種特殊的哈希算法
    hash-max-zipmap-entries 64
    hash-max-zipmap-value 512
  • 指定是否激活重置哈希,默認爲開啓
    activerehashing yes
  • 指定包含其它的配置文件,可以在同一主機上多個Redis實例之間使用同一份配置文件,而同時各個實例又擁有自己的特定配置文件
    include /path/to/local.conf

Redis的集羣

主從模式

在這裏插入圖片描述

主從的配置

*主從中主的配置文件不需要變化,僅更改從的配置文件即可

# basic
daemonize yes
port 6379
logfile /home/hadoop/logs/redis/6379/redis_6379.log
pidfile /home/hadoop/pid/redis/6379/redis_6379.pid
dir /home/hadoop/data/redis/6379

# slave
# 綁定本機的IP,另一個爲192.168.239.103
bind 192.168.239.102
# 綁定master的ip和port
slaveof 192.168.239.101 6379
# 從節點只讀
slave-read-only yes
# 從節點在處於快照同步期間是否對外提供服務
slave-serve-stale-data yes
# 如果 master 檢測到 slave 的數量小於這個配置設置的值,將拒絕對外提供服務,0 代表,無論 slave 有幾個都會對外提供服務
min-slaves-to-write 0
# 如果 master 發現大於等於 ${min-slaves-to-write} 個 slave 與自己的心跳超過此處配置的時間(單位s)
# 就拒絕對外提供服務
min-slaves-max-lag 10
# master的認證口令
masterauth redis

主從同步的方法

增量同步

redis 同步的是指令流,主節點會將那些對自己的狀態產生修改性影響的指令記錄在本地的內存 buffer 中,然後異步將 buffer 中的指令同步到從節點,從節點一邊執行同步的指令流來達到和主節點一樣的狀態,一邊向主節點反饋自己同步到哪裏了 (偏移量,這是redis-2.8之後纔有的特性)。從節點同步數據的時候不會影響主節點的正常工作,也不會影響自己對外提供讀服務的功能,從節點會用舊的數據來提供服務,當同步完成後,需要刪除舊數據集,加載新數據,這個時候纔會暫停對外服務。

因爲內存的 buffer 是有限的,所以 redis 主節點不能將所有的指令都記錄在內存 buffer 中。redis 的複製內存 buffer 是一個定長的環形數組,如果數組內容滿
了,就會從頭開始覆蓋前面的內容。

快照同步

如果節點間網絡通信不好,那麼當從節點同步的速度不如主節點接收新寫請求的速度時,buffer 中會丟失一部分指令,從節點中的數據將與主節點中的數據不一致,此時將會觸發快照同步。

快照同步是一個非常耗費資源的操作,它首先需要在主節點上進行一次 bgsave 將當前內存的數據全部快照到RDB文件中,然後再將快照文件的內容全部傳送到從節點。從節點將RDB文件接受完畢後,立即執行一次全量加載,加載之前先要將當前內存的數據清空。加載完畢後通知主節點繼續進行增量同步。

在整個快照同步進行的過程中,主節點的複製 buffer 還在不停的往前移動,如果快照同步的時間過長或者複製 buffer 太小,都會導致同步期間的增量指令在複製 buffer 中被覆蓋,這樣就會導致快照同步完成後無法進行增量複製,然後會再次發起快照同步,如此極有可能會陷入快照同步的死循環。所以需要配置一個合適的複製 buffer 大小參數,避免快照複製的死循環。

哨兵模式

哨兵模式是一種特殊的模式,首先Redis提供了哨兵的命令,哨兵是一個獨立的進程,作爲進程,它會獨立運行。其原理是哨兵通過發送命令,等待Redis服務器響應,從而監控運行的多個Redis實例。
數據的獲取 客戶端連接哨兵,哨兵反饋redis的連接信息

在這裏插入圖片描述
在這裏插入圖片描述

這裏的哨兵有兩個作用

  • 發送命令,讓Redis服務器返回監控其運行狀態,包括主服務器和從服務器。
  • 兵監測到master宕機,會自動將slave切換成master,然後通過發佈訂閱模式通知其他的從服務器,修改配置文件,讓它們切換主機。

然而一個哨兵進程對Redis服務器進行監控,可能會出現問題,爲此,我們可以使用多個哨兵進行監控。各個哨兵之間還會進行監控,這樣就形成了多哨兵模式。

用文字描述一下故障切換(failover)的過程。假設主服務器宕機,哨兵1先檢測到這個結果,系統並不會馬上進行failover過程,僅僅是哨兵1主觀的認爲主服務器不可用,這個現象成爲主觀下線。當後面的哨兵也檢測到主服務器不可用,並且數量達到一定值時,那麼哨兵之間就會進行一次投票,投票的結果由一個哨兵發起,進行failover操作。切換成功後,就會通過發佈訂閱模式,讓各個哨兵把自己監控的從服務器實現切換主機,這個過程稱爲客觀下線。這樣對於客戶端而言,一切都是透明的。

哨兵模式的配置文件

# 使得Redis服務器可以跨網絡訪問
bind 0.0.0.0
# 設置密碼
requirepass "123456"
# 指定主服務器,注意:有關slaveof的配置只是配置從服務器,主服務器不需要配置
slaveof 192.168.11.128 6379
# 主服務器密碼,注意:有關slaveof的配置只是配置從服務器,主服務器不需要配置
masterauth 123456

每個redis都要配置一個哨兵
每個哨兵的配置都是一樣的。在Redis安裝目錄下有一個sentinel.conf文件,copy一份進行修改


# 禁止保護模式
protected-mode no
# 配置監聽的主服務器,這裏sentinel monitor代表監控,mymaster代表服務器的名稱,可以自定義,192.168.11.128代表監控的主服務器,6379代表端口,2代表只有兩個或兩個以上的哨兵認爲主服務器不可用的時候,纔會進行failover操作。
sentinel monitor mymaster 192.168.11.128 6379 2
# sentinel author-pass定義服務的密碼,mymaster是服務名稱,123456是Redis服務器密碼
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster 123456

Cluster集羣

在這裏插入圖片描述

概況

今天我們來簡單介紹下,Redis的官方多機部署方案,Redis Cluster。一組Redis Cluster是由多個Redis實例組成,官方推薦我們使用6實例,其中3個爲主節點,3個爲從結點。一旦有主節點發生故障的時候,Redis Cluster可以選舉出對應的從結點成爲新的主節點,繼續對外服務,從而保證服務的高可用性。那麼對於客戶端來說,知道知道對應的key是要路由到哪一個節點呢?原來,Redis Cluster 把所有的數據劃分爲16384個不同的槽位,可以根據機器的性能把不同的槽位分配給不同的Redis實例,對於Redis實例來說,他們只會存儲部門的Redis數據,當然,槽的數據是可以遷移的,不同的實例之間,可以通過一定的協議,進行數據遷移。

在這裏插入圖片描述

數據獲取

客戶端是如何訪問Redis Cluster裏面的數據呢?首先客戶端需要保存一份Redis Cluster槽相關的信息,也就是路由表,然後對即將訪問的key進行哈希計算,計算出對應的槽位,然後向對應的Redis實例發起查詢請求。如果訪問的Redis實例中,的確保存着對應槽的數據信息,就會進行返回,否則向客戶端返回一個Moved指令,讓客戶端到正確的地址進行獲取。

數據遷移

在分佈式系統中,衡量一個系統好壞的一項重要指標,系統的擴展性。什麼是系統的擴展性呢?就是今天你又10萬個用戶,需要4臺機器進行服務,如果明天的用戶數量增加到20萬了,是不是隻要簡單的增加4臺機器就行,同時又不需要進行復雜的數據遷移。Redis Cluster便是如此,當你新增一些實例的時候,只需要將一部分槽位遷移到新的實例即可。在遷移的過程中,客戶端會先去舊的實例上去查詢數據,因爲遷移正在發生,如果對應的數據還在本機上,那麼直接返回,否則返回讓客戶端重定向到新的實例。客戶端先向新的機器發起ask指令,新實例返回成功後,再一次查詢最終的結果。

Redis的持久化

RDB持久化

RDB持久化即通過創建快照(壓縮的二進制文件)的方式進行持久化,保存某個時間點的全量數據。RDB持久化是Redis默認的持久化方式。RDB持久化的觸發包括手動觸發與自動觸發兩種方式。

手動觸發

*save,命令行執行save命令,將以同步的方式創建rdb文件保存快照,會阻塞服務器的主進程,生產環境中不要用
*bgsave, 在命令行執行bgsave命令,將通過fork一個子進程以異步的方式創建rdb文件保存快照,除了fork時有阻塞,子進程在創建rdb文件時,主進程可繼續處理請求

自動觸發

*在redis.conf中配置 save m n 定時觸發,如 save 900 1表示在900s內至少存在一次更新就觸發
*主從複製時,如果從節點執行全量複製操作,主節點自動執行bgsave生成RDB文件併發送給從節點
*執行debug reload命令重新加載Redis時
*執行shutdown且沒有開啓AOF持久化

redis.conf中RDB持久化配置#

# 只要滿足下列條件之一,則會執行bgsave命令 save 900 1 # 在900s內存在至少一次寫操作 
save 300 10 
save 60 10000 
# 禁用RBD持久化,可在最後加 save "" 
# 當備份進程出錯時主進程是否停止寫入操作 stop-writes-on-bgsave-error yes 
# 是否壓縮rdb文件 推薦no 相對於硬盤成本cpu資源更貴 
rdbcompression no

AOF持久化

AOF(Append-Only-File)持久化即記錄所有變更數據庫狀態的指令,以append的形式追加保存到AOF文件中。在服務器下次啓動時,就可以通過載入和執行AOF文件中保存的命令,來還原服務器關閉前的數據庫狀態。

redis.conf中AOF持久化配置如下

# 默認關閉AOF,若要開啓將no改爲yes appendonly no # append文件的名字 appendfilename "appendonly.aof" # 每隔一秒將緩存區內容寫入文件 默認開啓的寫入方式 appendfsync everysec # 當AOF文件大小的增長率大於該配置項時自動開啓重寫(這裏指超過原大小的100%)。 auto-aof-rewrite-percentage 100 # 當AOF文件大小大於該配置項時自動開啓重寫 auto-aof-rewrite-min-size 64mb

AOF持久化的實現包括3個步驟:命令追加:

  • 將命令追加到AOF緩衝區文件寫入:
  • 緩衝區內容寫到AOF文件文件保存:
  • AOF文件保存到磁盤

其中後兩步的頻率通過appendfsync來配置,appendfsync的選項包括

  • always, 每執行一個命令就保存一次,安全性最高,最多隻丟失一個命令的數據,但是性能也最低(頻繁的磁盤IO)

  • everysec,每一秒保存一次,推薦使用,在安全性與性能之間折中,最多丟失一秒的數據

  • no, 依賴操作系統來執行(一般大概30s一次的樣子),安全性最低,性能最高,丟失操作系統最後一次對AOF文件觸發SAVE操作之後的數據

AOF通過保存命令來持久化,隨着時間的推移,AOF文件會越來越大,Redis通過AOF文件重寫來解決AOF文件不斷增大的問題(可以減少文件的磁盤佔有量,加快數據恢復的速度),原理如下:

  • 調用fork,創建一個子進程子進程
  • 讀取當前數據庫的狀態來“重寫”一個新的AOF文件(這裏雖然叫“重寫”,但實際並沒有對舊文件進行任何讀取,而是根據數據庫的當前狀態來形成指令)
  • 主進程持續將新的變動同時寫到AOF重寫緩衝區與原來的AOF緩衝區中
  • 主進程獲取到子進程重寫AOF完成的信號,調用信號處理函數將AOF重寫緩衝區內容寫入新的AOF文件中,並對新文件進行重命名,原子地覆蓋原有AOF文件,完成新舊文件的替換

AOF的重寫也分爲手動觸發與自動觸發

  • 手動觸發: 直接調用bgrewriteaof命令
  • 自動觸發: 根據auto-aof-rewrite-min-size和auto-aof-rewrite-percentage參數確定自動觸發時機。其中auto-aof-rewrite-min-size表示運行AOF重寫時文件最小體積,默認爲64MB。auto-aof-rewrite-percentage表示當前AOF文件大小(aof_current_size)和上一次重寫後AOF文件大小(aof_base_size)的比值。自動觸發時機爲 aof_current_size > auto-aof-rewrite-min-size &&(aof_current_size - aof_base_size)/aof_base_size> = auto-aof-rewrite-percentage

數據庫的恢復

服務器啓動時,如果沒有開啓AOF持久化功能,則會自動載入RDB文件,期間會阻塞主進程。如果開啓了AOF持久化功能,服務器則會優先使用AOF文件來還原數據庫狀態,因爲AOF文件的更新頻率通常比RDB文件的更新頻率高,保存的數據更完整。

redis數據庫恢復的處理流程如下,[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-s3N3cOKM-1588994524747)(en-resource://database/587:1)]

在數據恢復方面,RDB的啓動時間會更短,原因有兩個:

  • RDB 文件中每一條數據只有一條記錄,不會像AOF日誌那樣可能有一條數據的多次操作記錄。所以每條數據只需要寫一次就行了,文件相對較小。

  • RDB 文件的存儲格式和Redis數據在內存中的編碼格式是一致的,不需要再進行數據編碼工作,所以在CPU消耗上要遠小於AOF日誌的加載。

但是在進行RDB持久化時,fork出來進行dump操作的子進程會佔用與父進程一樣的內存,採用的copy-on-write機制,對性能的影響和內存的消耗都是比較大的。比如16G內存,Redis已經使用了10G,這時save的話會再生成10G,變成20G,大於系統的16G。這時候會發生交換,要是虛擬內存不夠則會崩潰,導致數據丟失。所以在用redis的時候一定對系統內存做好容量規劃。

RDB、AOF混合持久化

Redis從4.0版開始支持RDB與AOF的混合持久化方案。首先由RDB定期完成內存快照的備份,然後再由AOF完成兩次RDB之間的數據備份,由這兩部分共同構成持久化文件。該方案的優點是充分利用了RDB加載快、備份文件小及AOF儘可能不丟數據的特性。缺點是兼容性差,一旦開啓了混合持久化,在4.0之前的版本都不識別該持久化文件,同時由於前部分是RDB格式,閱讀性較低。
開啓混合持久化

aof-use-rdb-preamble yes

數據恢復加載過程就是先按照RDB進行加載,然後把AOF命令追加寫入。

持久化方案的建議

  • 如果Redis只是用來做緩存服務器,比如數據庫查詢數據後緩存,那可以不用考慮持久化,因爲緩存服務失效還能再從數據庫獲取恢復。
  • 如果你要想提供很高的數據保障性,那麼建議你同時使用兩種持久化方式。如果你可以接受災難帶來的幾分鐘的數據丟失,那麼可以僅使用RDB。
  • 通常的設計思路是利用主從複製機制來彌補持久化時性能上的影響。即Master上RDB、AOF都不做,保證Master的讀寫性能,而Slave上則同時開啓RDB和AOF(或4.0以上版本的混合持久化方式)來進行持久化,保證數據的安全性

虛擬內存

edis沒有使用os提供的虛擬內存機制而是自己實現了自己的虛擬內存機制 ,但是思路和目的都是相同的。就是暫時把不經常訪問的數據從內存交換到磁盤中,從而騰出內存空間用於其他需要訪問的數據。尤其是對於redis這樣的內存數據庫,內存總是不夠用的。除了可以將數據分割到多個redis server外。另外的能夠提高數據庫容量的辦法就是使用vm把那些不經常訪問的數據交換的磁盤上。如果我們的存儲的數據總是有少部分數據被經常訪問,大 部分數據很少被訪問,對於網站來說確實總是隻有少量用戶經常活躍。當少量數據被經常訪問時,使用vm不但能提高單臺redis server數據庫的容量,而且也不會對性能造成太多影響。

vm-enabled yes                             #開啓vm功能
vm-swap-file /tmp/redis.swap         #交換的value保存的文件路徑/tmp/redis.swap
vm-max-memory 1000000            #最大內存上限,超過後開始交換value到磁盤文件
vm-page-size 32                          #每個頁面的大小32個字節vm-pages 134217728                 #最多使用在文件中使用多少頁面
vm-max-threads 4                    #用於執行value對象換入換出的工作線程數量,0表示不使用工作線程

Redis的常用命令

  • 登錄 redis-cli -p 5566 -a password
  • 檢查key是否存在 EXISTS key
  • 搜索某關鍵字 KSYS *4
    返回一個Key所影響的vsl的類型 TYPE key

String

設置一個鍵的值 SET key value
獲取一個建的值 GET key
刪除鍵對 DEL key
同時獲取多個 mget key1 key2

Hash

設置一個hash HMSET key valueKey value --<key,<valueKey,value>>
獲取hash所有 key&value HGETALL key
獲取hash所有 key HKEYS key
獲取hash所有 keu的vslue HVALS key
獲取hash內鍵值對的長度 HLEN key
給一個hash的某個鍵值對賦值 HSET key valueKey value
當hash中valueKey不存在時賦值 HSETNX key valueKey value

List

給list賦值 LPUSH listName value
按照索引取值 LINDEX listName 1

資料網址

Redis官網
Redis入門詳解
Redis面試總結
Redis持久化方案
Redis主從架構
Redis Cluster描述

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