一、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在DBE nginx月排行榜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 日志 記錄 默認 redis使用的是 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、可以最大化 IO的性能,因為父進程在保存 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 即刪除所有數據