redis基礎及配置文件詳解

一、redis部署與使用

redis 基礎

官網地址https://redis.io/

Redis和 Memcached 是非關係型數據庫,也稱爲NoSQL數據庫 ,MySQL 、 Mariadb 、 SQL S erver 、 PostgreSQL 、Oracle 數據庫 屬於關係型數據 RDBMS, Relational Database Management System

redis 簡介

Redis (Remote Dictionary S erver 在 2009 年 發佈 開發者 Salvatore Sanfilippo 是意大利 開發者他本想爲自己 的 公司開發一個用於替換 MySQL 的產品 Redis ,但是沒有想到 他把 Redis 開源後大受 歡迎,短短几年,

Redis 就 有了很大的用戶羣體,目前 國內外 使用的公司有 知乎網 、新浪微博、 GitHub 等;

redis 是 一個 開源 的、 遵循 BSD 協議 的、 基於 內存 的 而且目前 比較 流行的 鍵值數據庫 key value database是 一個非關係型數據庫 redis 提供 將內存 通過 網絡遠程共享的一種服務 ,

提供 類似功能的還 有memcache,但 相比 memcache redis 還提供了 易 擴展 、高性能 、 具備 數據持久性 等功能。

Redis 在高併發、低延遲環境要求比較高的環境使用量非常 廣泛, 目前 redis 在 DB E ngin e 月 排行榜https://db engines.com/en/ranking 中一直比較靠前,而且 一直 是鍵值型存儲類的首位 。

redis 對比 memcached

1、支持數據的持久化:可以將內存中的數據保持在磁盤中,重啓redis 服務或者服務器之後 可以從 備份文件中 恢復 數據到內存繼續使用 。

2、支持更 多 的數據類型:支持 string 字符串 、hash( 哈希 數據 、 list( 列表 、 set( 集合 、 ze t( 有序 集合)。

3、支持數據的備份:可以實現 類似於 數據的 master slave 模式的數據備份,另外 也支持使用快照 +AOF 。

4、支持更大的 value 數據 memcache 單個 key value 最大隻支持 1MB ,而 redis 最大 支持 512MB 。

5、Redis 是單線程, 而 memcache 是多線程, 所以 單機 情況下沒有 memcache 併發高, 但 redis 支持分佈式 集羣 以 實現更高的併發 單 Redis 實例可以實現數萬併發。

6、支持集羣橫向擴展:基於 redis cluster 的 橫向擴展,可以 實現 分佈式集羣,大幅提升性能和數據安全性。

7、都是基於 C 語言 開發。

redis 典型應用 場景:

1、Session共享 :常見於 web 集羣中的 Tomcat 或者 PHP 中多 web 服務器 session 共享

2、消息隊列ELK 的日誌 緩存、 部分 業務的訂閱發佈 系統

3、計數器訪問排行榜 、商品 瀏覽數 等 和次數相關的 數值 統計 場景

4、緩存數據 查詢、 電商 網站商品 信息 、 新聞內容

Redis 安裝及使用:

官方下載地址: http://download.redis.io/releases/

在centos 系統 上 需要安裝 epel 源。

[root@rs2keepalived]#yum install redis -y
[root@rs2keepalived]#systemctl start redis

連 接到Redis用法:

主要分爲運維人員的連接和程序的連接
本機非密碼連接

# redis-cli

跨主機非密碼連接:

# redis-cli -h HOSTNAME/IP -p PORT

跨主機密碼連接

# redis-cli  -h HOSTNAME/IP -p PORT -a PASSWORD

二、redis配置文件  

 1、redis基本配置文件

bind 0.0.0.0    監聽地址可以用空格隔開後多個監聽IP
protected-mode yes    #redis3.2之後加入的新特性在沒有設置 bind IP和密碼的時候只允許訪問127.0.0.1 :6379
port  6379    監聽端口
tcp-backlog 511   # 三次握手的 時候 server 端收到client ack確認號之後的隊列值,默認不需要改。
timeout 0     客戶端和Redis服務端的連接超時時間,默認是0,表示永不超時。
tcp-keepalive 300   #tcp會話保持時間
daemonize yes   認情況下redis不是作爲守護進程運行的,如果你想讓它在後臺運行,你就把它改成yes, 當redis作爲守護進程運行的時候,它會寫一個pid到/var/run/redis.pid文件裏面,需要改爲yes,進行後端運行。
supervised systemd  #和操作系統相關參數可以設置通過upstart和systemd管理Redis守護進程centos7以後都使用systemd
pidfile /var/run/redis_6379.pid   #pid文件路徑
loglevel notice   日誌級別,默認即可

 實現配置文件案例演示: 

 以源碼編譯安裝的配置文件爲例:配置文件在/apps/redis/目錄下,此時我們要配置其他目錄文件: 源碼編譯的redis服務,需要啓動redis服務:redis-server /apps/redis/etc/redis.conf

 源碼編譯步驟詳見鏈接:https://www.cnblogs.com/struggle-1216/p/12116664.html

1、監聽本地IP地址和迴環網卡IP地址,允許遠程訪問redis服務

[root@rs1~]#vim /apps/redis/etc/redis.conf
bind 127.0.0.1 192.168.37.17   監聽本地IP地址和迴環地址
protected-mode yes    有此模式就必須監聽本地IP地址,否則無法遠程連接

  

 2、 創建數據、日誌及pid目錄,將不同文件存放在不同的目錄下

[root@rs1~]#mkdir /apps/redis/{data,logs,run}

 修改redis配置文件,將pid文件指定在新建的目錄下,如果想開啓多個redis,就新建多個pid的端口,只需要修改端口號即可:

如:pidfile /apps/redis/run/redis_6379.pid ,想再開啓一個redis,就將端口號改爲一個沒人用的端口號:pidfile /apps/redis/run/redis_6378.pid

[root@rs1~]#vim /apps/redis/etc/redis.conf 
pidfile /apps/redis/run/redis_6379.pid  
logfile "/apps/redis/logs/redis_6379.log"

  

  

此時啓動redis服務,就會發現生成了log和pid文件,如果重新啓動redis,需要將配置文件用kill -9 進程號 命令殺死進程號纔行。

[root@rs1redis]#redis-server /apps/redis/etc/redis.conf 
[root@rs1redis]#ll /apps/redis/run/redis_6379.pid 
-rw-r--r-- 1 root root 5 Dec 29 23:21 /apps/redis/run/redis_6379.pid
[root@rs1redis]#ll /apps/redis/logs/redis_6379.log 
-rw-r--r-- 1 root root 1692 Dec 29 23:21 /apps/redis/logs/redis_6379.log
[root@centos17~]#ll /apps/redis/data/dump_6379.rdb 
-rw-r--r-- 1 root root 104 Dec 30 09:33 /apps/redis/data/dump_6379.rdb

 2、redis快照配置文件  

databases 16  設置db庫數量,默認16個庫
always-show-logo yes # 在啓動 redis 時是否 顯示 log
save 900 1 # 在900 秒內有一個鍵內容發生更改觸發快照機制
save 300 10  在300 秒內有10個鍵內容發生更改觸發快照機制
save 60 10000
stop-writes-on-bgsave-error no 快照出錯時,是否禁止redis寫入操作
rdbcompression yes 持久化到 RDB 文件時,是否壓縮,"yes" 爲壓縮,“no” 則反之
rdbchecksum yes  是否開啓RC64校驗,默認是開啓
dbfilename  dump.rdb  快照文件名
dir ./  快照文件保存路徑

  配置文件演示:

1、當我們redis快照備份失敗時,如果是yes就無法對redis進行寫內容,如果改爲no就無法寫內容,很重要,改爲no。

  vim /apps/redis/etc/redis.conf

 

  指定快照存放目錄及快照名稱:

 

 3、redis配置文件詳解

1、replica-serve-stale-data   yes   # 當從庫同主庫失去連接或者複製正在進行,從機庫有兩種運行方式:

1) 如果 replica serve stale data 設置爲 yes( 默認設置 )),從庫會繼續響應客戶端的 讀 請求。

2) 如果 replicaserve stale data 設置爲 no ,除 去指定的命令之外的任何請求都會返回一個錯誤 "SYNC with master in progress" 。

2、replica-read-only yes # 是否設置從庫只讀

3、repl-diskless-sync no 是否使用 socket 方式複製數據, 目前 redis 複製提供兩種方式, disk 和 socket 如果新的 slave 連上來或者重連的 slave 無法部分同步,就會執行全量同步, master 會生成 rdb 文件,有2 種方式:

1)disk 方式是 master 創建一個新的進程把 rdb 文件保存到磁盤,再把磁盤上的 rdb 文件傳遞給 slave socket 是 master 創建一個新的進程,
直接把 rdb 文件以 socket 的方式發給 slave disk 方式的時候,當一個 rdb 保存的過程中,多個 slave 都能共享這個 rdb 文件。

2)socket 的方式就是 一個個 slave順序複製, 只有在磁盤速度緩慢但是 網絡相對較 快的情況下才使用 socket 方式,否則使用默認的disk方式。

4、repl-diskless-sync-delay 30 #diskless 複製的延遲時間, 設置 0爲關閉 一旦複製開始還沒有結束之前,master 節點不會再接收新 slave 的複製請求, 直到下一次開始。

5、repl-ping-slave-period 10   #slave 根據 master 指定 的時間進行週期性的 PING 監測

6、repl-timeout 60       複製鏈接超時時間,需要大於 repl ping slave period 否則會 經常 報超時

7、repl-disable-tcp-nodelay no     在 socket 模式下是否在slave 套接字發送 SYNC之後禁用TCP_NODELAY

如果你選擇“yes Redis 將使用更少的 TCP 包和帶寬來向 slaves 發送數據。但是這 將使數據傳輸到 slave上有延遲, Linux 內核的默認配置會達到 40毫秒,

如果你選擇了 "no" 數據傳輸到 salve 的延遲將會減少但要使用更多的帶寬。

8、repl-backlog-size  1mb   複製緩衝區大小, 只有在 slave 連接之後 才 分配內存 。

9、repl-backlog-ttl 3600 多次時間 master 沒有 slave 連接,就清空 backlog 緩衝區 。

10、replica-priority 100 當 master 不可用,Sentinel 會根據 slave 的優先級選舉一個 master 。最低的優先級的 slave ,當選 master 。而配置成 0,永遠不會被選舉。

11、requirepass foobared    設置 redis 連接密碼,配置了redis,必須設置密碼,防止被入侵之後被黑客搞破壞。

 

12、rename-command 重命名 一些高 危命令

13、maxclients 10000  最大連接客戶端

14、maxmemory  最大內存 單位爲 bytes 字節 8G 內存 的 計算方式 8 G ))*1024 ( MB)*1024 ( KB)*1024 Kbyte,用bc命令可以計算;

需要注意的是 slave 的輸出緩衝區是不計算在 maxmemory 內 ,此最大內存應該最大佔計算機內存的一半,留一部分內存用來做快照使用。

  

  

15、appendonly no #是否開啓 AOF 日誌 記錄 默認 red is 使用的是 rdb 方式持久化,這種方式在許多應用中已經足夠用了。但是 redis 如果中途宕機,會導致可能有幾分鐘的數據丟失,

根據 save 來策略進行持久化,Append Only File 是另一種持久化方式,可以提供更好的持久化特性。 Redis 會把每次寫入的數據在接收後都寫入 appendonly.aof 文件,每次啓動時 Redis 都會先把這個文件的數據讀入內存裏,先忽略 RDB 文件。

16、appendfilename  "appendonly.aof" #AOF文件名

17、appendfsync everysec  #aof 持久化策略的配置 no 表示不執行 fsync 由操作系統保證數據同步到磁盤 ,always 表示每次寫入都執行 fsync ,以保證數據同步到磁盤 ,everysec 表示每秒執行一次 fsync ,
可能會導致丟失這 1s 數據。

18、no-appendfsync-on-rewrite no(推薦爲yes) 在 aof rewrite 期間 是否對 aof 新記錄的 append 暫緩使用文件同步策略 主要考慮磁盤 IO 開支和請求阻塞時間。默認爲 no, 表示不暫緩新的 aof 記錄仍然會被立即同步
Linux 的默認fsync策略是30 秒,如果爲 yes 可能丟失 30 秒數據 ,但由於yes性能較好,而且會避免出現阻塞, 因此比較推薦 。

19、auto-aof-rewrite-percentage 100 # 當 Aof log 增長超過指定 百分 比例時,重寫 logfile設置爲0表示不自動重寫 Aof 日誌,重寫是爲了使 aof 體積保持最小,而確保保存最完整的數據。

20、auto-aof-rewrite -min size 64mb # 觸發 aof rewrite 的最小文件大小

21、aof-load-truncated yes 是否加載 由於 其他原因 導致 的 末尾 異常 的 AOF文件主進程被 kill/ 斷電等

 當文件存在問題時,可以針對不同的文件進行修復操作:可以修復aof和rdb後綴的文件。

 打開此功能,就會在/apps/redis/data/目錄下生成appendonly.aof後綴的文件。

 

 

22、aof-use-rdb-preamble yes #r edis4.0 新增 RDB AOF 混合持久化格式,在開啓了這個功能之後, AOF 重寫產生的文件將同時包含 RDB 格式的內容和 AOF 格式的內容,其中 RDB 格式的內容用於記錄已有的數
據,而 AOF 格式的內存則用於記錄最近發生了變化的數據,這樣 Redis 就可以同時兼有 RDB 持久化和AOF 持久化的優點(既能夠快速地生成重寫文件,也能夠在出現問題時,快速地載入數據)。

23、luatime-limit 5000 #lua 腳本 的 最大 執行時間單位爲毫秒

24、cluster-enabled yes 是否開啓集羣模式,默認是單機模式

25、cluster-config-file-nodes 6379.conf 由 node節點自動生成的集羣配置 文件

26、cluster-node-timeout 15000 集羣中node節點連接 超時時間

27、cluster-replica-validity-factor 10 在 執行故障轉移的時候可能有些節點和 master 斷開一段時間數據比較舊 這些 節點就 不適用於選舉爲 master 超過這個時間的就不會被進行故障轉移

28、cluster-migration-barrier 1 一個主節點擁有的至少正常工作的從節點 即如果主節點的 slave 節點故障後, 會 將多餘的從節點 分配 到當前主節點 成爲 其 新的 從節點。

29、cluster-require-full-coverage no 集羣 槽位覆蓋 如果 一個 主庫宕機 且 沒有備庫就會出現集羣槽位不全 那麼 yes 情況下 redis 集羣 槽位 驗證不全就不再對外提供服務,
而 no 則可以繼續使用但是會出現查詢數據查不到的情況 (因爲有數據丟失)

#Slow log 是 Redis 用來記錄查詢執行時間的日誌系統 slow log 保存在內存裏面,讀寫速度非常快,因此你可以放心地使用它,不必擔心因爲開啓slow log而損害 Redis 的速度。

30、slowlog-log-slower than 10000 以微秒 爲單位 的 慢日誌記錄, 爲 負數會禁用慢日誌,爲0會記錄 每個命令操作。

31、slowlog-max-len 128 # 記錄多少條慢日誌 保存在 隊列,超出後會刪除 最早 的,以此滾動刪除

測試效果:

127.0.0.1:6379> slowlog len
(integer) 14
127.0.0.1:6379> slowlog get
1) 1) (integer) 14
2) (integer) 1544690617
3) (integer) 4
4) 1) "slowlog"
127.0.0.1:6379> SLOWLOG reset

redis 持久化:

redis雖然是一個內存級別的緩存程序,即 redis 是使用內存進行數據的緩存的,但是其可以將內存的數據按照一定的策略保存到硬盤上,

從而實現數據持久保存的目的, redis 支持兩種不同方式的數據持久化保存機制,分別是RDB和AOF:

RDB 模式

1、RDB基於時間的快照, 只保留 當前最新的一次快照, 特點 是執行速度比較快,缺點是可能會丟失從上次快照到當 前 快照未完成之間的數據。

2、RDB實現的具體過程 R edis 從主進程先 fork 出一個子進程,使用寫時複製機制,子進程將內存的數據保存爲一個臨時文件,

比如 dump.rdb.temp ,當數據保存完成之後再將上一次保存的 RDB 文件替換掉,然後關閉子進程,這樣可以保存每一次做 RDB 快照的時候保存的數據都是完整的,

因爲直接替換 RDB文件的時候可能會出現突然斷電等問題而導致 RDB 文件還沒有保存完整就突然關 機停止保存而導致

數據丟失的情況,可以手動將每次生成的 RDB 文件進程備份,這樣可以最大化保存歷史數據。

RDB 模式的優缺點:

優點:

1、RDB 快照 保存了某個時間點的數據,可以通過腳本執行 bgsave 非 阻塞 或者 save( 阻塞 命令自定義時
間點北備份,可以保留多個備份,當出現問題可以恢復到不同時間點的版本。

2、可以最大化 o 的性能,因爲父進程在保存 RDB 文件的時候唯一要做的是 fork 出一個子進程,然後的
操作都會有這個子進程操作,父進程無需任何的 IO 操作

RDB在大量數據比如幾個G的數據,恢復的速度比AOF的快。

缺點

1、不能時時的保存數據,會丟失自上一次執行 RDB 備份到當前的內存數據

2、數據量非常大的時候,從父進程 fork 的時候需要一點時間,可能是毫秒或者秒

AOF 模式

1、AOF:按照 操作順序依次 將 操作 添加 到 指定 的日誌文件當中,特點是數據安全性相對較高,缺點是即使有些操作是重複的也會全部記錄。

2、AOF和 RDB一樣使用了寫時複製機制, AOF 默認爲每秒鐘 fsync 一次,即將執行的命令保存到 AOF 文件當中,這樣即使 redis 服務器發生故障的話頂多也就丟失 1 秒鐘之內的數據,也可以 設置不同的 fsync
策略,或者設置每次執行命令的時候執行 fsync fsync 會在後臺執行線程,所以主線程可以繼續處理用戶的正常請求而不受到寫入 AOF 文件的 IO 影響。

AOF 模式優缺點

1、AOF的文件大小要大於 RDB 格式的文件

2、根據所使用的fsync 策略 (fsync 是同步內存中 redis 所有已經修改的文件到存儲設備 )),默認是appendfsync everysec 即每秒執行一次 fsync

三、redis數據類型  

字符串 string

字符串是所有編程語言中 最常見 的和最常 用的數據類型,而且也是 redis 最基本的數據類型之一,而且redis中所有的 key 的類型都是字符串。

添加 一個 key

127.0.0.1:6379> set key1 value1
OK
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> TYPE key1
string
127.0.0.1:6379> SET name2 jack2 ex 3  設置自動過期時間
OK

獲取一個 key 的內容:

127.0.0.1:6379> get key1
"value1"

刪除一個 key

127.0.0.1:637
9> DEL key1
(integer) 1

批量 設置多個 key

127.0.0.1:6379> MSET key1 value1 key2 value2
OK

批量 獲取 多個 key

127.0.0.1:6379> MSET key1 value1 key2 value2
OK

 追加 數據:

127.0.0.1:6379> APPEND key1 append
(integer) 12
127.0.0.1:6379> get key1
"value1a
ppend"

數值 遞增:

127.0.0.1:6379> set num 10
OK
127.0.0.1:6379> INCR num
(integer) 11
127.0.0.1:6379> get num
"11"

數值遞減:

127.0.0.1:6379> set num 10
OK
127.0.0.1:6379> DECR num
(integer) 9
127.0.0.1:6379> get num
"9"

返回 字符串 key 長度:

127.0.
0.1:6379> STRLEN key1
(integer) 12

列表 list

列表是一個雙向可讀寫的管道 其頭部是左側尾部是右側,一個列表最多可以包含 2^32 1 個元素即
4294967295 個 元素。

生成列表 並插入數據:

127.0.0.1:6379> LPUSH list1 jack
tom jhon
(integer) 3
127.0.0.1:6379> TYPE list1
list

消息隊列

消息隊列 主要 分爲兩種,分別是 生產者 消費者模式和發佈者訂閱者模式,這兩種模式 Redis 都 支持

生產者消費者模式:

在生產者消費者 Producer/Consumer 模式下, 上層 應用 接收到 的外部請求 後 開始處理 其 當前步驟的操作,

在執行完成後將 已經 完成的操作發送至 指定的頻道 channel 當中 ,並 由其 下層的應用監聽該頻道並繼續下一步的操作, 如果 其處理完成 後 沒有下一步的操作就直接返回 數據 給外部請求,如果還有

下一步的操作就 再將任務發佈 到另外一個頻道, 由 另外一個消費者 繼續 監聽和處理。

模式介紹

生產者 消費者模式下, 多個 消費者同時監聽一個隊裏,但是 一個 消息只能被 最先搶到消息的消費者消費,即消息任務是一次性 讀取 和處理,

此模式在分佈式業務 架構 中非常常用 比較 常用 的軟件還有RabbitMQ、 K afka 、 RocketMQ 、 ActiveMQ 等。


 隊列介紹

隊列當中的消息由不同的生產者寫入也會有不同的消費者取出進行消費處理,但是一個消息一定是隻能被取出一次也就是被消費一次。

發佈者訂閱模式:

模式簡介:

在 發佈者訂閱者模式下,發佈者將消息發佈到指定的 channel 裏面 凡是 監聽該 channel 的消費者都會 收到 同樣的一份消息,

這種模式類 似於是收音機模式,即凡是收聽某個頻道的聽衆 都會 收到主持人發佈的 相同 的消息 內容。

此模式 常用語 羣聊天 、 羣通知、羣 公告 等場景。

Subscriber :訂閱者
Publisher 發佈者
Channel 頻道

redis其他命令  

CONFIG

config命令用於查看當前redis配置、以及不重啓更改redis配置等,修改的都是臨時的配置,重啓redis服務就會失效,最終還是需要修改到配置文件中。

 更改最大內存:

改爲最大物理機內存的一半大小

127.0.0.1:6379> CONFIG set maxmemory 8589934592
OK
127.0.0.1:6379> CONFIG get maxmemory
1) "maxmemory"
2) "8589934592"

 設置連接密碼

127.0.0.1:6379> CONFIG SET requirepass 123456
OK

 

 獲取當前配置內容:

 

 info:顯示當前redis運行狀態

 SELECT:切換數據庫

DBSIZE:返回當前庫下的所有key數量

keys:查看當前庫下的所有key

BGSAVE:手動在後臺執行RDB 持久化 操作

FLUSHDB:強制清空當前庫中的所有key

FLUSHALL:強制清空當前 redis 服務器所有 數據 庫 中的所有 key 即刪除所有數據




  



  

 

 

  

 

  

  





  

  



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