redis從入門到入魔

2020-08-09 15:25:12

Redis簡介

Redis 是一個開源的使用 ANSI C 語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value 數據庫,並提供多種語言的 API。Redis 是一個 key-value 儲存系統。
和 Memcached 快取類似,Redis 支援儲存的 value 型別相對更多,包括 string(字元
串)、list(鏈表)、set(集合)、zset(有序集合)和 hash(雜湊型別)

Redis 是一種高階 key-value 數據庫,它跟 memcached 類似,不過 Redis 的數據可以持久化,而且支援的數據型別很豐富,有字串,鏈表,集 合和有序集合。支援在伺服器端計算集合的並,交和補集(difference)等,還支援多種排序功能。Redis 也被看成是一個數據結構伺服器。

Redis 很大程度補償了 memcached 這類 key/value 儲存的不足,在部分場合可以對關係數據庫起到很好的補充作用。Redis 提供了 Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang 等用戶端,方便易用,得到 IT 人的青睞。

Redis 支援主從同步,數據可以從主伺服器向任意數量的從伺服器上同步,從伺服器可以是關聯其他從伺服器的主伺服器

特點、優勢

  • k、v鍵值儲存以及數據結構儲存(如列表、字典)
  • 所有數據(包括數據的儲存)操作均在記憶體中完成
  • 單執行緒服務(這意味着會有較多的阻塞情況),採用epoll模型進行請求響應,對比nginx
  • 支援主從複製模式,更提供高可用主從複製模式(哨兵)
  • 去中心化分佈式叢集
  • 豐富的程式設計介面支援,如Python、Golang、Java、php、Ruby、Lua、Node.js
  • 功能豐富,除了支援多種數據結構之外,還支援事務、發佈/訂閱、訊息佇列等功能
  • 支援數據持久化(AOF、RDB

對比memcache

  • memcache是一個分佈式的記憶體物件快取系統,並不提供持久儲存功能,而redis擁有持久化功能
  • memcache數據儲存基於LRU(簡單說:最近、最少使用key會被剔除),而redis則可以永久儲存(服務一直執行情況下)
  • memcache是多執行緒的(這是memcache優勢之一),也就意味着阻塞情況少,而redis是單執行緒的,阻塞情況相對較多
  • 兩者效能上相差不大
  • memcache只支援簡單的k、v數據儲存,而redis支援多種數據格式儲存。
  • memcache是多執行緒、非阻塞IO複用網路模型,而redis是單執行緒IO複用模型

redis的應用場景有哪些

1,對談快取(最常用)
2,訊息佇列(比如支付)
3,活動排行榜或計數
4,發佈,訂閱訊息(訊息通知)
5,商品列表,評論列表等

redis的服務相關的命令

slect#選擇數據庫(數據庫編號0-15)
退出#退出連線
資訊#獲得服務的資訊與統計
monitor#實時監控
config get#獲得服務設定
flushdb#刪除當前選擇的數據庫中的key
flushall#刪除所有數據庫中的鍵
在这里插入图片描述

單節點部署

yum install gcc -y  #安裝C依賴
wget -P /usr/local/src -c http://download.redis.io/redis-stable.tar.gz  #下載穩定版本
tar zxvf redis-stable.tar.gz  #解壓
cd redis-stable
cat src/version.h #檢視當前最新版本號
make PREFIX=/usr/local/redis install   #指定目錄編譯,也可以不用指定
cp redis.conf /usr/local/redis/ # 拷貝組態檔
#將/usr/local/redis/bin/目錄加入至環境變數組態檔/etc/profile末尾,然後Shell終端執行source /etc/profile讓環境變數生效。
echo "export PATH=/usr/local/redis/bin:$PATH" >> /etc/profile 
source /etc/profile
#Nohup後臺啓動及停止Redis服務命令:
nohup  /usr/local/redis/bin/redis-server  /usr/local/redis/redis.conf  &
/usr/local/redis/bin/redis-cli  -p  6379 shutdown

此處安裝的版本是最新的6.0.6版本,make失敗,參考如下處理,需要升級gcc到5.3以上,參考如下

 檢視gcc版本是否在5.3以上,centos7.6預設安裝4.8.5
gcc -v
# 升級gcc到5.3及以上,如下:
升級到gcc 9.3:
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash
需要注意的是scl命令啓用只是臨時的,退出shell或重新啓動就會恢復原系統gcc版本。
如果要長期使用gcc 9.3的話:

echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
這樣退出shell重新開啓就是新版的gcc了
以下其他版本同理,修改devtoolset版本號即可。

# 編譯出錯時,清出編譯生成的檔案
make distclean
# 編譯安裝到指定目錄下
make PREFIX=/usr/local/redis install 
# 解除安裝
make uninstall
grep -v -E  "^#|^$" /usr/local/redis/redis.conf #去除註釋和空行檢視設定

檢視是否成功安裝

cd /usr/local/redis/bin
#執行用戶端工具
./redis-cli 
#輸入命令info
27.0.0.1:6379> info
# Server
redis_version:6.0.6
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:450098a03a03b7ee
redis_mode:standalone
os:Linux 3.10.0-957.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:9.3.1
process_id:13525
run_id:1032fbb744181e9b3a2937606cac0df02bd2ba18
tcp_port:6379
uptime_in_seconds:99
uptime_in_days:0
hz:10
configured_hz:10
lru_clock:2972749
executable:/usr/local/redis/bin/redis-server
config_file:/usr/local/redis/redis.conf

二進制檔案說明

redis-server       #Redis伺服器和Sentinel伺服器,啓動時候可使用--sentinel指定爲哨兵
redis-cli         #Redis命令列用戶端 
redis-benchmark      #Redis效能測試工具 
redis-check-aof      #AOF檔案修復工具 
redis-check-dump     #RDB檔案檢測工具 
redis-sentinel       #Sentinel伺服器,4.0版本已經做了軟鏈接到redis-server

Redis主從複製部署

Redis提供了複製(replication)功能可以自動實現同步的過程。通過組態檔在Redis從數據庫中組態檔中加入slaveof master-ip master-port即可,主數據庫無需設定
從庫設定增加

slaveof  192.168.2.214  6379

Redis組態檔詳解

使用config get * 獲得所有的設定項的key

#daemonize no  預設情況下, redis 不是在後台執行的,如果需要在後台執行,把該項的值更改爲 yes
daemonize yes
#  當 redis 在後台執行的時候, Redis 預設會把 pid 檔案放在 /var/run/redis.pid ,你可以設定到其他地址。
#  當執行多個 redis 服務時,需要指定不同的 pid 檔案和埠
pidfile /var/run/redis_6379.pid
#  指定 redis 執行的埠,預設是 6379
port 6379
#  在高併發的環境中,爲避免慢用戶端的連線問題,需要設定一個高速後臺日誌
此參數確定了TCP連線中已完成佇列(完成三次握手之後)的長度, 當然此值必須不大於Linux系統定義的/proc/sys/net/core/somaxconn值,預設是511,而Linux的預設參數值是128。當系統併發量大並且用戶端速度緩慢的時候,可以將這二個參數一起參考設定。該內核參數預設值一般是128,對於負載很大的服務程式來說大大的不夠。一般會將它修改爲2048或者更大。在/etc/sysctl.conf中新增:net.core.somaxconn = 2048,然後在終端中執行sysctl -p。
tcp-backlog 511
#  指定 redis 只接收來自於該 IP 地址的請求,如果不進行設定,那麼將處理所有請求
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1
#  設定用戶端連線時的超時時間,單位爲秒。當用戶端在這段時間內沒有發出任何指令,那麼關閉該連線
# 0 是關閉此設定
timeout 0
# TCP keepalive
#  在 Linux 上,指定值(秒)用於發送 ACKs 的時間。注意關閉連線需要雙倍的時間。預設爲 0 。
tcp-keepalive 0
#  指定日誌記錄級別,生產環境推薦 notice
# Redis 總共支援四個級別: debug 、 verbose 、 notice 、 warning ,預設爲 verbose
# debug     記錄很多資訊,用於開發和測試
# varbose   有用的資訊,不像 debug 會記錄那麼多
# notice    普通的 verbose ,常用於生產環境
# warning   只有非常重要或者嚴重的資訊會記錄到日誌
loglevel notice
#  設定 log 檔案地址
#  預設值爲 stdout ,標準輸出,若後臺模式會輸出到 /dev/null 。
logfile /var/log/redis/redis.log
#  可用數據庫數
#  預設值爲 16 ,預設數據庫爲 0 ,數據庫範圍在 0- ( database-1 )之間
databases 16
################################ 快照#################################
#  儲存數據到磁碟,格式如下 :
#   save <seconds> <changes>
#    指出在多長時間內,有多少次更新操作,就將數據同步到數據檔案 rdb 。
#    相當於條件觸發抓取快照,這個可以多個條件配合
#    比如預設組態檔中的設定,就設定了三個條件
#   save 900 1  900 秒內至少有 1 個 key 被改變
#   save 300 10  300 秒內至少有 300 個 key 被改變
#   save 60 10000  60 秒內至少有 10000 個 key 被改變
# save 900 1
# save 300 10
# save 60 10000
#  後臺儲存錯誤停止寫。
stop-writes-on-bgsave-error yes
#  儲存至本地數據庫時(持久化到 rdb 檔案)是否壓縮數據,預設爲 yes
rdbcompression yes
# RDB 檔案的是否直接偶像 chcksum
rdbchecksum yes
#  本地持久化數據庫檔名,預設值爲 dump.rdb
dbfilename dump.rdb
#  工作目錄
#  數據庫映象備份的檔案放置的路徑。
#  這裏的路徑跟檔名要分開設定是因爲 redis 在進行備份時,先會將當前數據庫的狀態寫入到一個臨時檔案中,等備份完成,
#  再把該該臨時檔案替換爲上面所指定的檔案,而這裏的臨時檔案和上面所設定的備份檔案都會放在這個指定的路徑當中。
# AOF 檔案也會存放在這個目錄下面 下麪
#  注意這裏必須制定一個目錄而不是檔案
dir /var/lib/redis/
################################# 複製 #################################
#  主從複製 . 設定該數據庫爲其他數據庫的從數據庫 .
#  設定當本機爲 slav 服務時,設定 master 服務的 IP 地址及埠,在 Redis 啓動時,它會自動從 master 進行數據同步
# slaveof <masterip><masterport>
#  當 master 服務設定了密碼保護時 ( 用 requirepass 制定的密碼 )
# slave 服務連線 master 的密碼
# masterauth <master-password>
#  當從庫同主機失去連線或者複製正在進行,從機庫有兩種執行方式:
# 1)  如果 slave-serve-stale-data 設定爲 yes( 預設設定 ) ,從庫會繼續響應用戶端的請求
# 2)  如果 slave-serve-stale-data 是指爲 no ,出去 INFO 和 SLAVOF 命令之外的任何請求都會返回一個
#     錯誤 "SYNC with master in progress"
slave-serve-stale-data yes
#  設定 slave 範例是否接受寫。寫 slave 對儲存短暫數據(在同 master 數據同步後可以很容易地被刪除)是有用的,但未設定的情況下,用戶端寫可能會發送問題。
#  從 Redis2.6 後,預設 slave 爲 read-only
slaveread-only yes
#  從庫會按照一個時間間隔向主庫發送 PINGs. 可以通過 repl-ping-slave-period 設定這個時間間隔,預設是 10 秒
# repl-ping-slave-period 10
# repl-timeout  設定主庫批次數據傳輸時間或者 ping 回覆 回復時間間隔,預設值是 60 秒
#  一定要確保 repl-timeout 大於 repl-ping-slave-period
# repl-timeout 60
#  在 slave socket 的 SYNC 後禁用 TCP_NODELAY
#  如果選擇「 yes 」 ,Redis 將使用一個較小的數位 TCP 數據包和更少的頻寬將數據發送到 slave , 但是這可能導致數據發送到 slave 端會有延遲 , 如果是 Linux kernel 的預設設定,會達到 40 毫秒 .
#  如果選擇 "no" ,則發送數據到 slave 端的延遲會降低,但將使用更多的頻寬用於複製 .
repl-disable-tcp-nodelay no
#  設定複製的後臺日誌大小。
#  複製的後臺日誌越大, slave 斷開連線及後來可能執行部分複製花的時間就越長。
#  後臺日誌在至少有一個 slave 連線時,僅僅分配一次。
# repl-backlog-size 1mb
#  在 master 不再連線 slave 後,後臺日誌將被釋放。下面 下麪的設定定義從最後一個 slave 斷開連線後需要釋放的時間(秒)。
# 0 意味着從不釋放後臺日誌
# repl-backlog-ttl 3600
#  如果 master 不能再正常工作,那麼會在多個 slave 中,選擇優先值最小的一個 slave 提升爲 master ,優先值爲 0 表示不能提升爲 master 。
slave-priority 100
#  如果少於 N 個 slave 連線,且延遲時間 <=M 秒,則 master 可設定停止接受寫操作。
#  例如需要至少 3 個 slave 連線,且延遲 <=10 秒的設定:
# min-slaves-to-write 3
# min-slaves-max-lag 10
#  設定 0 爲禁用
#   預設 min-slaves-to-write 爲 0 (禁用), min-slaves-max-lag 爲 10
################################## 安全 ###################################
#  設定用戶端連線後進行任何其他指定前需要使用的密碼。
#  警告:因爲 redis 速度相當快,所以在一臺比較好的伺服器下,一個外部的使用者可以在一秒鐘進行 150K 次的密碼嘗試,這意味着你需要指定非常非常強大的密碼來防止暴力破解
# requirepass foobared
#  命令重新命名 .
#  在一個共用環境下可以重新命名相對危險的命令。比如把 CONFIG 重名爲一個不容易猜測的字元。
#  舉例 :
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
#  如果想刪除一個命令,直接把它重新命名爲一個空字元 "" 即可,如下:
# rename-command CONFIG ""
###################################約束###################################
#設定同一時間最大用戶端連線數,預設無限制, 
#Redis 可以同時開啓的用戶端連線數爲 Redis 進程可以開啓的最大檔案描述符數,
#如果設定  maxclients 0 ,表示不作限制。
#當用戶端連線數到達限制時, Redis 會關閉新的連線並向用戶端返回 max number of clients reached 錯誤資訊
# maxclients 10000
#  指定 Redis 最大記憶體限制, Redis 在啓動時會把數據載入到記憶體中,達到最大記憶體後, Redis 會按照清除策略嘗試清除已到期的 Key
#  如果 Redis 依照策略清除後無法提供足夠空間,或者策略設定爲 」noeviction」 ,則使用更多空間的命令將會報錯,例如 SET, LPUSH 等。但仍然可以進行讀取操作
#  注意: Redis 新的 vm 機制 機製,會把 Key 存放記憶體, Value 會存放在 swap 區
#  該選項對 LRU 策略很有用。
# maxmemory 的設定比較適合於把 redis 當作於類似 memcached 的快取來使用,而不適合當做一個真實的 DB 。
#  當把 Redis 當做一個真實的數據庫使用的時候,記憶體使用將是一個很大的開銷
# maxmemory <bytes>
#  當記憶體達到最大值的時候 Redis 會選擇刪除哪些數據?有五種方式可供選擇
# volatile-lru ->  利用 LRU 演算法移除設定過過期時間的 key (LRU: 最近使用  Least RecentlyUsed )
# allkeys-lru ->  利用 LRU 演算法移除任何 key
# volatile-random ->  移除設定過過期時間的隨機 key
# allkeys->random -> remove a randomkey, any key
# volatile-ttl ->  移除即將過期的 key(minor TTL)
# noeviction ->  不移除任何可以,只是返回一個寫錯誤
#  注意:對於上面的策略,如果沒有合適的 key 可以移除,當寫的時候 Redis 會返回一個錯誤
#  預設是 :  volatile-lru
# maxmemory-policy volatile-lru  
# LRU  和  minimal TTL 演算法都不是精準的演算法,但是相對精確的演算法 ( 爲了節省記憶體 ) ,隨意你可以選擇樣本大小進行檢測。
# Redis 預設的灰選擇 3 個樣本進行檢測,你可以通過 maxmemory-samples 進行設定
# maxmemory-samples 3
############################## AOF###############################
#  預設情況下, redis 會在後台非同步的把數據庫映象備份到磁碟,但是該備份是非常耗時的,而且備份也不能很頻繁,如果發生諸如拉閘限電、拔插頭等狀況,那麼將造成比較大範圍的數據丟失。
#  所以 redis 提供了另外一種更加高效的數據庫備份及災難恢復方式。
#  開啓 append only 模式之後, redis 會把所接收到的每一次寫操作請求都追加到 appendonly.aof 檔案中,當 redis 重新啓動時,會從該檔案恢復出之前的狀態。
#  但是這樣會造成 appendonly.aof 檔案過大,所以 redis 還支援了 BGREWRITEAOF 指令,對 appendonly.aof 進行重新整理。
#  你可以同時開啓 asynchronous dumps 和  AOF
appendonly no
# AOF 檔名稱  ( 預設 : "appendonly.aof")
# appendfilename appendonly.aof
# Redis 支援三種同步 AOF 檔案的策略 :
# no:  不進行同步,系統去操作  . Faster.
# always: always 表示每次有寫操作都進行同步 . Slow, Safest.
# everysec:  表示對寫操作進行累積,每秒同步一次 . Compromise.
#  預設是 "everysec" ,按照速度和安全折中這是最好的。
#  如果想讓 Redis 能更高效的執行,你也可以設定爲 "no" ,讓操作系統決定什麼時候去執行
#  或者相反想讓數據更安全你也可以設定爲 "always"
#  如果不確定就用  "everysec".
# appendfsync always
appendfsync everysec
# appendfsync no
# AOF 策略設定爲 always 或者 everysec 時,後臺處理進程 ( 後臺儲存或者 AOF 日誌重寫 ) 會執行大量的 I/O 操作
#  在某些 Linux 設定中會阻止過長的 fsync() 請求。注意現在沒有任何修復,即使 fsync 在另外一個執行緒進行處理
#  爲了減緩這個問題,可以設定下面 下麪這個參數 no-appendfsync-on-rewrite
no-appendfsync-on-rewrite no
# AOF  自動重寫
#  當 AOF 檔案增長到一定大小的時候 Redis 能夠呼叫  BGREWRITEAOF  對日誌檔案進行重寫
#  它是這樣工作的: Redis 會記住上次進行些日誌後檔案的大小 ( 如果從開機以來還沒進行過重寫,那日子大小在開機的時候確定 )
#  基礎大小會同現在的大小進行比較。如果現在的大小比基礎大小大制定的百分比,重寫功能將啓動
#  同時需要指定一個最小大小用於 AOF 重寫,這個用於阻止即使檔案很小但是增長幅度很大也去重寫 AOF 檔案的情況
#  設定  percentage 爲 0 就關閉這個特性
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
################################ LUASCRIPTING #############################
# 一個 Lua 指令碼最長的執行時間爲 5000 毫秒( 5 秒),如果爲 0 或負數表示無限執行時間。
lua-time-limit 5000
################################LOW LOG################################
# Redis Slow Log  記錄超過特定執行時間的命令。執行時間不包括 I/O 計算比如連線用戶端,返回結果等,只是命令執行時間
#  可以通過兩個參數設定 slow log :一個是告訴 Redis 執行超過多少時間被記錄的參數 slowlog-log-slower-than( 微妙 ) ,
#  另一個是 slow log 的長度。當一個新命令被記錄的時候最早的命令將被從佇列中移除
#  下面 下麪的時間以微妙爲單位,因此 1000000 代表一秒。
#  注意指定一個負數將關閉慢日誌,而設定爲 0 將強制每個命令都會記錄
slowlog-log-slower-than 10000
#  對日誌長度沒有限制,只是要注意它會消耗記憶體
#  可以通過  SLOWLOG RESET 回收被慢日誌消耗的記憶體
#  推薦使用預設值 128 ,當慢日誌超過 128 時,最先進入佇列的記錄會被踢出
slowlog-max-len 128
################################  事件通知  #############################
#  當事件發生時, Redis 可以通知 Pub/Sub 用戶端。
#  可以在下表中選擇 Redis 要通知的事件型別。事件型別由單個字元來標識:
# K     Keyspace 事件,以 _keyspace@<db>_ 的字首方式發佈
# E     Keyevent 事件,以 _keysevent@<db>_ 的字首方式發佈
# g     通用事件(不指定型別),像 DEL, EXPIRE, RENAME, …
# $     String 命令
# s     Set 命令
# h     Hash 命令
# z     有序集合命令
# x     過期事件(每次 key 過期時生成)
# e     清除事件(當 key 在記憶體被清除時生成)
# A     g$lshzxe 的別稱,因此 」AKE」 意味着所有的事件
# notify-keyspace-events 帶一個由 0 到多個字元組成的字串參數。空字串意思是通知被禁用。
#  例子:啓用 list 和通用事件:
# notify-keyspace-events Elg
#  預設所用的通知被禁用,因爲使用者通常不需要改特性,並且該特性會有效能損耗。
#  注意如果你不指定至少 K 或 E 之一,不會發送任何事件。
notify-keyspace-events 「」
##############################  高階設定  ###############################
#  當 hash 中包含超過指定元素個數並且最大的元素沒有超過臨界時,
# hash 將以一種特殊的編碼方式(大大減少記憶體使用)來儲存,這裏可以設定這兩個臨界值
# Redis Hash 對應 Value 內部實際就是一個 HashMap ,實際這裏會有 2 種不同實現,
#  這個 Hash 的成員比較少時 Redis 爲了節省記憶體會採用類似一維陣列的方式來緊湊儲存,而不會採用真正的 HashMap 結構,對應的 valueredisObject 的 encoding 爲 zipmap,
#  當成員數量增大時會自動轉成真正的 HashMap, 此時 encoding 爲 ht 。
hash-max-zipmap-entries 512
hash-max-zipmap-value 64  
#  和 Hash 一樣,多個小的 list 以特定的方式編碼來節省空間。
# list 數據型別節點值大小小於多少位元組會採用緊湊儲存格式。
list-max-ziplist-entries 512
list-max-ziplist-value 64
# set 數據型別內部數據如果全部是數值型,且包含多少節點以下會採用緊湊格式儲存。
set-max-intset-entries 512
#  和 hashe 和 list 一樣 , 排序的 set 在指定的長度內以指定編碼方式儲存以節省空間
# zsort 數據型別節點值大小小於多少位元組會採用緊湊儲存格式。
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
# Redis 將在每 100 毫秒時使用 1 毫秒的 CPU 時間來對 redis 的 hash 表進行重新 hash ,可以降低記憶體的使用
#  當你的使用場景中,有非常嚴格的實時性需要,不能夠接受 Redis 時不時的對請求有 2 毫秒的延遲的話,把這項設定爲 no 。
#  如果沒有這麼嚴格的實時性要求,可以設定爲 yes ,以便能夠儘可能快的釋放記憶體
activerehashing yes
# 用戶端的輸出緩衝區的限制,因爲某種原因用戶端從伺服器讀取數據的速度不夠快,
# 可用於強制斷開連線(一個常見的原因是一個發佈 / 訂閱用戶端消費訊息的速度無法趕上生產它們的速度)。
#  可以三種不同用戶端的方式進行設定:
# normal ->  正常用戶端
# slave  -> slave 和 MONITOR 用戶端
# pubsub ->  至少訂閱了一個 pubsub channel 或 pattern 的用戶端
#  每個 client-output-buffer-limit 語法 :
# client-output-buffer-limit <class><hard limit> <soft limit> <soft seconds>
#  一旦達到硬限制用戶端會立即斷開,或者達到軟限制並保持達成的指定秒數(連續)。
#  例如,如果硬限製爲 32 兆位元組和軟限製爲 16 兆位元組 /10 秒,用戶端將會立即斷開
#  如果輸出緩衝區的大小達到 32 兆位元組,用戶端達到 16 兆位元組和連續超過了限制 10 秒,也將斷開連線。
#  預設 normal 用戶端不做限制,因爲他們在一個請求後未要求時(以推的方式)不接收數據,
#  只有非同步用戶端可能會出現請求數據的速度比它可以讀取的速度快的場景。
#  把硬限制和軟限制都設定爲 0 來禁用該特性
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb60
client-output-buffer-limit pubsub 32mb 8mb60
# Redis 呼叫內部函數來執行許多後臺任務,如關閉用戶端超時的連線,清除過期的 Key ,等等。
#  不是所有的任務都以相同的頻率執行,但 Redis 依照指定的「 Hz 」值來執行檢查任務。
#  預設情況下,「 Hz 」的被設定爲 10 。
#  提高該值將在 Redis 空閒時使用更多的 CPU 時,但同時當有多個 key 同時到期會使 Redis 的反應更靈敏,以及超時可以更精確地處理。
#  範圍是 1 到 500 之間,但是值超過 100 通常不是一個好主意。
#  大多數使用者應該使用 10 這個預設值,只有在非常低的延遲的情況下有必要提高最大到 100 。
hz 10  
#  當一個子節點重寫 AOF 檔案時,如果啓用下面 下麪的選項,則檔案每生成 32M 數據進行同步。
aof-rewrite-incremental-fsync yes

Redis常用命令

Redis快取伺服器命令列中常用命令如下:

Redis  CONFIG 命令格式如下:
redis 127.0.0.1:6379> CONFIG  GET|SET CONFIG_SETTING_NAME
CONFIG  GET * 獲取Redis伺服器所有設定資訊;
接受單個參數 parameter 作爲搜尋鍵碼,查詢所有匹配的設定參數,
比如執行 CONFIG GET s* 命令,伺服器就會返回所有以 s 開頭的設定參數及參數的值:
CONFIG  SET  loglevel  "notice"   設定Redis伺服器日誌級別;
指定日誌級別,Redis日誌有4個級別:debug、verbose、notice、warning
# debug(詳細資訊,在development/testing環境使用)
# verbose (有用的資訊,不像debug會記錄那麼多)
# notice (常用於生產環境)
# warning (只有非常重要或者嚴重的資訊會記錄到日誌)
loglevel notice
CONFIG  SET  requirepass  "jfedu"   命令可以動態地調整 Redis 伺服器的設定(configuration)而無須重新啓動
AUTH   jfedu  AUTH 命令給定的密碼 password 和組態檔中的密碼相符的話,伺服器會返回 OK 並開始接受命令輸入。另一方面,假如密碼不匹配的話,伺服器將返回一個錯誤,並要求用戶端需重新輸入密碼。
redis-cli  -h host  -p  port  -a  password 遠端連線redis數據庫;
CLIENT GETNAME 			獲取連線的名稱; 如果連線沒有設定名字,那麼返回空白回覆 回復;如果有設定名字,那麼返回名字。
CLIENT SETNAME 			設定當前連線的名稱;  這個名字會顯示在 CLIENT LIST 命令的結果中, 用於識別當前正在與伺服器進行連線的用戶端。
CLUSTER SLOTS 			獲取叢集節點的對映陣列;
COMMAND 					獲取Redis命令詳情陣列;
COMMAND COUNT 		    獲取 Redis 命令總數;
COMMAND GETKEYS 		獲取給定命令的所有鍵;
TIME 						返回當前伺服器時間;
CONFIG GET parameter 		獲取指定設定參數的值;
CONFIG SET parameter value	修改redis 設定參數,無需重新啓動;
CONFIG RESETSTAT 			重置 INFO 命令中的某些統計數據;
重置 INFO 命令中的某些統計數據,包括:
Keyspace hits (鍵空間命中次數)
Keyspace misses (鍵空間不命中次數)
Number of commands processed (執行命令的次數)
Number of connections received (連線伺服器的次數)
Number of expired keys (過期key的數量)
Number of rejected connections (被拒絕的連線數量)
Latest fork(2) time(最後執行 fork(2) 的時間)
The aof_delayed_fsync counter(aof_delayed_fsync 計數器的值)
DBSIZE 					返回當前數據庫的 key 的數量;
DEBUG OBJECT key 			獲取 key 的偵錯資訊; 當 key 存在時,返回有關資訊。當 key 不存在時,返回一個錯誤。
DEBUG SEGFAULT 			讓Redis服務崩潰;
FLUSHALL 					刪除所有數據庫的所有key; 清空整個 Redis 伺服器的數據
FLUSHDB 					刪除當前數據庫的所有key;
DBSIZE                     檢視所有的庫
Select                      切換庫
ROLE 						返回主從範例所屬的角色;
SAVE 						非同步儲存數據到硬碟;執行一個同步儲存操作,將當前 Redis 範例的所有數據快照(snapshot)以 RDB 檔案的形式儲存到硬碟
SHUTDOWN 			    非同步儲存數據到硬碟,並關閉伺服器;
SLOWLOG  					管理 redis 的慢日誌; 用來記錄查詢執行時間的日誌系統。
SET  keys  values			設定key爲jfedu,值爲123;
DEL  jfedu  				    刪除key及值;
INFO  CPU   				檢視伺服器CPU佔用資訊;
KEYS  jfedu  				檢視是存在jfedu的key;
KEYS  *     				檢視Redis所有的KEY;
CONFIG REWRITE 			啓動 Redis時所指定的redis.conf 組態檔進行改寫;
INFO [section] 				獲取Redis伺服器的各種資訊和統計數值;
SYNC 						用於複製功能(replication)的內部命令;
SLAVEOF host port 			指定伺服器的從屬伺服器(slave server);
MONITOR 					實時列印出Redis伺服器接收到的命令,偵錯用;
LASTSAVE 					返回最近一次Redis成功將數據儲存到磁碟上的時間;;
CLIENT PAUSE timeout		指定時間內終止執行來自用戶端的命令;
BGREWRITEAOF 		    非同步執行一個 AOF(AppendOnly File) 檔案重寫操作; 執行一個 AOF檔案 重寫操作。重寫會建立一個當前 AOF 檔案的體積優化版本。
BGSAVE 				    後臺非同步儲存當前數據庫的數據到磁碟。

正確的關閉redis姿勢如下,不用使用pkill之類的命令直接去殺,不然會丟失記憶體中還未持久化的數據

/usr/local/redis/bin/redis-cli -h 192.168.2.214 -p 6379 shutdown

redis的發佈與訂閱

redis的發佈與訂閱(發佈/訂閱)是它的一種訊息通訊模式,一方發送資訊,一方接收資訊。
下圖是三個用戶端同時訂閱同一個頻道
在这里插入图片描述
下圖是有新資訊發送給頻道1時,就會將訊息發送給訂閱它的三個用戶端
在这里插入图片描述

redis的持久化

Redis所有數據都是儲存在記憶體中,Redis數據備份可以定期的通過非同步方式儲存到磁碟上,該方式稱爲半持久化模式,如果每一次數據變化都寫入aof檔案裏面,則稱爲全持久化模式。同時還可以基於Redis主從複製實現Redis備份與恢復。
redis持久有兩種方式:RDB(快照),僅附加檔案(AOF)

1、半持久化RDB模式

RDB: 快照形式 (定期數據儲存磁碟中)會產生一個dump.rdb檔案,redis預設開啓了RDB的持久化方式
特點:會存在數據丟失,效能較好,用於數據備份。
redis.conf預設設定如下

save 		900 	1     	  #900秒內有至少1個鍵被更改則進行快照;
save 		300 	10    	  #300秒內有至少10個鍵被更改則進行快照;
save 		60  	10000  	  #60秒內有至少10000個鍵被更改則進行快照。
save        60      10000    #表示每隔60秒如果有10000個key變化就會生成一次快照,並且新的快照會覆蓋原來的快照

預設可以存在多個條件,條件之間是「或」的關係,只要滿足其中一個條件,就會進行快照。 如果想要禁用自動快照,只需要將所有的save參數刪除即可。Redis預設會將快照檔案儲存在Redis數據目錄,預設檔名爲:dump.rdb檔案,可以通過設定dir和dbfilename兩個參數分別指定快照檔案的儲存路徑和檔名。也可以在Redis命令列執行config get dir獲取Redis數據儲存路徑。如需修改可以直接修改redis.conf檔案中的dir例如dir /data/redis
或者如下辦法
不過只是臨時的,重新啓動就丟失了,不建議這樣設定

127.0.0.1:6379> CONFIG SET dir /data/redis
OK

2、全持久化AOF模式

如果數據很重要無法承受任何損失,可以考慮使用AOF方式進行持久化,預設Redis沒有開啓AOF(append only file)方式的全持久化模式
在啓動時Redis會逐個執行AOF檔案中的命令來將硬碟中的數據載入到記憶體中,載入的速度相較RDB會慢一些,開啓AOF持久化後每執行一條會更改Redis中的數據的命令,Redis就會將該命令寫入硬碟中的AOF檔案。AOF檔案的儲存位置和RDB檔案的位置相同,都是通過dir參數設定的,預設的檔名是appendonly.aof,可以通過appendfilename參數修改該名稱。

Redis允許同時開啓AOF和RDB,既保證了數據安全又使得進行備份等操作十分容易。此時重新啓動Redis後Redis會使用AOF檔案來恢復數據,因爲AOF方式的持久化可能丟失的數據更少,可以在redis.conf中通過appendonly參數開啓Redis AOF全持久化模式:

appendonly  yes
appendfilename appendonly.aof
auto-aof-rewrite-percentage 100 
auto-aof-rewrite-min-size 64mb
appendfsync always
#appendfsync everysec
#appendfsync no

redis的備份與恢復

1、Redis Rdb模式恢復

設定參數如下

save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /usr/local/redis
################################ 快照#################################
#  儲存數據到磁碟,格式如下 :
#   save <seconds> <changes>
#    指出在多長時間內,有多少次更新操作,就將數據同步到數據檔案 rdb 。
#    相當於條件觸發抓取快照,這個可以多個條件配合
#    比如預設組態檔中的設定,就設定了三個條件
#   save 900 1  900 秒內至少有 1 個 key 被改變
#   save 300 10  300 秒內至少有 300 個 key 被改變
#   save 60 10000  60 秒內至少有 10000 個 key 被改變
# save 900 1
# save 300 10
# save 60 10000
#  後臺儲存錯誤停止寫。
stop-writes-on-bgsave-error yes
#  儲存至本地數據庫時(持久化到 rdb 檔案)是否壓縮數據,預設爲 yes
rdbcompression yes
# RDB 檔案的是否直接偶像 chcksum
rdbchecksum yes
#  本地持久化數據庫檔名,預設值爲 dump.rdb
dbfilename dump.rdb
#  工作目錄
#  數據庫映象備份的檔案放置的路徑。
#  這裏的路徑跟檔名要分開設定是因爲 redis 在進行備份時,先會將當前數據庫的狀態寫入到一個臨時檔案中,等備份完成,
#  再把該該臨時檔案替換爲上面所指定的檔案,而這裏的臨時檔案和上面所設定的備份檔案都會放在這個指定的路徑當中。
# AOF 檔案也會存放在這個目錄下面 下麪
#  注意這裏必須制定一個目錄而不是檔案
dir /usr/local/redis/

如果需要恢復數據,只需將備份檔案 (dump.rdb) 移動到 redis 安裝目錄並啓動服務即可。獲取 redis 目錄可以使用 CONFIG 命令,如下所示:

redis 127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/usr/local/redis "

恢復數據的時候把Redis主從關閉

2、全持久化AOF模式恢復

從 aof 中恢復數據

1 開啓以下設定
appendonly yes
appendfilename appendonly.aof
auto-aof-rewrite-percentage 100 
auto-aof-rewrite-min-size 64mb
appendfsync always  
dir /usr/local/redis
 
2 拷貝 AOF 檔案到 Redis 的數據目錄
cp appendonly.aof /usr/local/redis
 
3 啓動 redis-server
Nohup  /usr/local/redis/bin/redis-server /usr/local/redis/redis.conf &

Redis AOF持久化參數設定詳解:

appendonly  yes						#開啓AOF持久化功能;
appendfilename appendonly.aof  		    #AOF持久化儲存檔名;
appendfsync always   				    #每次執行寫入都會執行同步,最安全也最慢;
#appendfsync everysec 				    #每秒執行一次同步操作;
#appendfsync no       				#不主動進行同步操作,而是完全交由操作系統來做,每30秒一次,最快也最不安全;
auto-aof-rewrite-percentage  100  	    #當AOF檔案大小超過上一次重寫時的AOF檔案大小的百分之多少時會再次進行重寫,如果之前沒有重寫過,則以啓動時的AOF檔案大小爲依據;
auto-aof-rewrite-min-size    64mb   	#允許重寫的最小AOF檔案大小設定寫入AOF檔案後,要求系統重新整理硬碟快取的機制 機製。

3、同時開啓AOF和RDB(生產推薦模式,再做上主從最好)恢復

Redis允許同時開啓AOF和RDB,既保證了數據安全又使得進行備份等操作十分容易。此時重新啓動Redis後Redis會使用AOF檔案來恢復數據,因爲AOF方式的持久化可能丟失的數據更少,可以在redis.conf中通過appendonly參數開啓Redis AOF全持久化模式:

1、拷貝dump.rdb檔案到redis 數據資料夾下
2、啓動redis,此時如果redis同時開啓了aof生成策略,redis會先載入aof,如果沒有則生成一個aof
3、此時如果get key獲取rdb中的備份數據會發現並沒有獲取到,這是由於redis啓動時,基於新的記憶體重新生成了一個新的rdb檔案,覆蓋了備份的rdb檔案
4、遇到這種情況應該先把aof生成策略先關閉,即把redis.conf檔案中的appendonly 改爲 no,然後重新啓動redis
5、此時發現可以獲取備份中的數據了,確認數據恢復後,這個時候要開啓aof必須動態的開啓,方法是進入用戶端後,輸入命令config set appendonly yes
6、確認設定是否成功,config get appendonly,返回yes ,說明已經設定成功,在此確認數據是否恢復,如果已經恢復,再次停止redis
7、然後修改組態檔,把redis.conf檔案中的appendonly 改爲yes,然後重新啓動redis.
8、啓動後,再次確認數據是否已經恢復,發現已經恢復。

3、Redis主從複製備份

通過持久化功能,Redis保證了即使在伺服器重新啓動的情況下也不會損失(或少量損失)數據。但是由於數據是儲存在一臺伺服器上的,如果這台伺服器的硬碟出現故障,也會導致數據丟失。
爲了避免單點故障,我們希望將數據庫複製多個副本以部署在不同的伺服器上,即使只有一臺伺服器出現故障其他伺服器依然可以繼續提供服務,這就要求當一臺伺服器上的數據庫更新後,可以自動將更新的數據同步到其他伺服器上,Redis提供了複製(replication)功能可以自動實現同步的過程。通過組態檔在Redis從數據庫中組態檔中加入slaveof master-ip master-port即可,主數據庫無需設定
Redis主從複製優點及應用場景, WEB應用程式可以基於主從同步實現讀寫分離以提高伺服器的負載能力。在常見的場景中,讀的頻率一般比較大,當單機Redis無法應付大量的讀請求時,可以通過複製功能建立多個從數據庫,主數據庫只進行寫操作,而從數據庫負責讀操作,還可以基於LVS+keepalived+Redis對Redis實現均和高可用。
從數據庫持久化持久化通常相對比較耗時,爲了提高效能,可以通過複製功能建立一個(或若幹個)從數據庫,並在從數據庫中啓用持久化,同時在主數據庫禁用持久化。
當從數據庫崩潰時重新啓動後主數據庫會自動將數據同步過來,所以無需擔心數據丟失。而當主數據庫崩潰時,需要在從數據庫中使用SLAVEOF NO ONE命令將從數據庫提升成主數據庫繼續服務,並在原來的主數據庫啓動後使用SLAVE OF命令將其設定成新的主數據庫的從數據庫,即可將數據同步回來。