redis入門初學知識

来源:https://www.cnblogs.com/dyj--php/archive/2019/09/19/11548131.html
-Advertisement-
Play Games

一、 Redis 介紹 Remote Dictionary Server(Redis)是一個開源的使用 ANSI C 語言編寫、支持網路、可基於記憶體亦可持久化的日誌型、Key-Value 資料庫,並提供多種語言的 API。它通常被稱為數據結構伺服器,因為值(value)可以是 字元串(String) ...


一、 Redis 介紹

Remote Dictionary Server(Redis)是一個開源的使用 ANSI C 語言編寫、支持網路、可基於記憶體亦可持久化的日誌型、Key-Value 資料庫,並提供多種語言的 API。它通常被稱為數據結構伺服器,因為值(value)可以是 字元串(String), 哈希(Map),列表(list), 集合(sets) 和 有序集合(sorted sets)。redis可以是純記憶體資料庫,也可以將數據記錄到磁碟進行持久化。

 

二、 Redis 常用應用場景

1、最常用的就是會話緩存
2、消息隊列,比如支付
3、活動排行榜或計數 
4、發佈、訂閱消息(消息通知)
5、商品列表、評論列表

 

三、 Redis的配置

redis的配置文件,你會發現還是很有條理的。redis配置文件被分成了幾大塊區域,它們分別是:

1.通用(general)
2.快照(snapshotting)
3.複製(replication)
4.安全(security)
5.限制(limits)
6.追加模式(append only mode)
7.LUA腳本(lua scripting),暫時不寫
8.慢日誌(slow log)
9.事件通知(event notification),暫時不寫

1.通用:

通過daemonize配置項可以控制redis的運行形式,預設是no(打開客戶端才會運行,關閉客戶端redis停止運行),如果改為yes,那麼redis就會以daemon形式運行(即後臺運行,我們應該使用這種形式)

daemonize yes

當以daemon形式運行時,redis會生成一個pid文件,預設會生成在/var/run/redis.pid。當然,你可以通過pidfile來指定pid文件生成的位置

pidfile /path/to/redis.pid

預設綁定127.0.0.1,redis會響應本機所有可用網卡的連接請求。當然,redis允許你通過bind配置項來指定要綁定的IP,我們可以綁定一個或多個ip,比如我們綁定192.168.100.2,那麼192.168.100這個網段的都可以訪問(這個最好是內網網段),也可看下這篇文章(ttps://bingozb.github.io/62.html)

bind 127.0.0.1

redis的預設服務埠是6379,你可以通過port配置項來修改。如果埠設置為0的話,redis便不會監聽埠了。

port 6379

“如果redis不監聽埠,還怎麼與外界通信呢”,其實redis還支持通過unix socket方式來接收請求。可以通過unixsocket配置項來指定unix socket文件的路徑,並通過unixsocketperm來指定文件的許可權。

unixsocket /tmp/redis.sock
unixsocketperm 755

當一個redis-client一直沒有請求發向server端,那麼server端有權主動關閉這個連接,可以通過timeout來設置“空閑超時時限”,0表示永不關閉。

timeout 0

TCP連接保活策略,可以通過tcp-keepalive配置項來進行設置,單位為秒,假如設置為60秒,則server端會每60秒向連接空閑的客戶端發起一次ACK請求,以檢查客戶端是否已經掛掉,對於無響應的客戶端則會關閉其連接。所以關閉一個連接最長需要120秒的時間。如果設置為0,則不會進行保活檢測。
tcp-keepalive 300

redis支持通過loglevel配置項設置日誌等級,共分四級,即debug、verbose、notice、warning。

loglevel notice

redis也支持通過logfile配置項來設置日誌文件的生成位置。如果設置為空字元串,則redis會將日誌輸出到標準輸出。假如你在daemon情況下將日誌設置為輸出到標準輸出,則日誌會被寫到/dev/null中。

logfile ""

如果希望日誌列印到syslog中,也很容易,通過syslog-enabled來控制。另外,syslog-ident還可以讓你指定syslog里的日誌標誌

syslog-ident redis

對於redis來說,可以設置其資料庫的總數量,預設包含16個資料庫,這16個資料庫的編號將是0到15。預設的資料庫是編號為0的資料庫。用戶可以使用select <DBid>來選擇相應的資料庫:

databases 16

 

2.快照--rdb(redis持久化方法之一):

快照是預設的持久化方式,我們可以用如下的指令來讓數據保存到磁碟上,即控制RDB快照功能:

save 900 1 //表示每15分鐘且至少有1個key改變,就觸發一次持久化
save 300 10 //表示每5分鐘且至少有10個key改變,就觸發一次持久化
save 60 10000 //表示每60秒至少有10000個key改變,就觸發一次持久化

如果你想禁用RDB持久化的策略,只要不設置任何save指令就可以,或者給save傳入一個空字元串參數也可以達到相同效果,就像這樣:

save ""

 

如果用戶開啟了RDB快照功能,那麼在redis持久化數據到磁碟時如果出現失敗,預設情況下,redis會停止接受所有的寫請求。這樣做的好處在於可以讓用戶很明確的知道記憶體中的數據和磁碟上的數據已經存在不一致了。如果redis不顧這種不一致,一意孤行的繼續接收寫請求,就可能會引起一些災難性的後果。如果下一次RDB持久化成功,redis會自動恢復接受寫請求。當然,如果你不在乎這種數據不一致或者有其他的手段發現和控制這種不一致的話,你完全可以關閉這個功能,以便在快照寫入失敗時,也能確保redis繼續接受新的寫請求。配置項如下:
stop-writes-on-bgsave-error yes

對於存儲到磁碟中的快照,可以設置是否進行壓縮存儲。如果是的話,redis會採用LZF演算法進行壓縮。如果你不想消耗CPU來進行壓縮的話,可以設置為關閉此功能,但是存儲在磁碟上的快照會比較大

rdbcompression yes

在存儲快照後,我們還可以讓redis使用CRC64演算法來進行數據校驗,但是這樣做會增加大約10%的性能消耗,如果你希望獲取到最大的性能提升,可以關閉此功能。

rdbchecksum yes

我們還可以設置快照文件的名稱,預設是這樣配置的:

dbfilename dump.rdb

最後,你還可以設置這個快照文件存放的路徑。比如預設設置就是當前文件夾:

dir ./

 

3.複製:

主從複製(也叫主從同步)可以防止主機壞掉導致的網站不能正常運作的問題。Redis支持主從複製,而且配置也很簡單。redis的主從複製可以讓多個從伺服器(slave server)擁有和主伺服器(master server)相同的資料庫副本。

特點:

  1.一個master可以擁有多個slave

  2.多個slave除了可以連接同一個master外,還可以連接其他的slave

  3.不會阻塞master,在slave同步數據時,master可以繼續處理客戶端的請求

  4.提高了系統的伸縮性,比如多個slave專門用於客戶端的讀操作

  5.可在master伺服器上禁止數據持久化,而只在slave伺服器上進行數據持久化操作

Redis主從複製的過程,分為兩個階段,第一個階段如下:

(1)slave伺服器主動連接到master伺服器。
(2)slave伺服器發送SYNC命令到master伺服器請求同步數據。
(3)master伺服器備份資料庫到rdb文件。
(4)master伺服器將該rdb文件傳輸給slave伺服器。
(5)slave伺服器清空資料庫數據,把rdb文件數據導入資料庫中。


完成第一階段,接下來master伺服器把用戶所有更改數據的操作(寫操作),通過命令的形式轉發給slave伺服器,slave伺服器只需執行master伺服器發送過來的命令就可以實現後續的同步效果。Redis的主從複製配置很簡單,只需在slave伺服器的配置文件中,添加下麵的配置項:

指定master(主伺服器)的ip和埠

slaveof 192.168.1.115 6379

如果主伺服器設置了安全密碼,還要加上這行代碼進行授權

masterauth 密碼

當從redis失去了與主redis的連接,或者主從同步正在進行中時,redis該如何處理外部發來的訪問請求呢?這裡,從redis可以有兩種選擇,第一種選擇:如果slave-serve-stale-data設置為yes(預設),則從redis仍會繼續響應客戶端的讀寫請求。第二種選擇:如果slave-serve-stale-data設置為no,則從redis會對客戶端的請求返回“SYNC with master in progress”,當然也有例外,當客戶端發來INFO請求和SLAVEOF請求,從redis還是會進行處理。設置從redis只讀:

slave-read-only yes

配置完成後,重啟redis從伺服器,就已經通過主從複製實現了數據的同步。

 

 

4.安全:

我們可以要求redis客戶端在向redis-server發送請求之前,先進行密碼驗證。由於redis性能非常高,所以每秒鐘可以完成多達15萬次的密碼嘗試,所以你最好設置一個足夠複雜的密碼,否則很容易被黑客破解,我們設置一個密碼(芝麻開門)。
requirepass zhimakaimen

redis允許我們對redis指令進行更名,比如將一些比較危險的命令改個名字,避免被誤執行。比如可以把CONFIG命令改成一個很複雜的名字,這樣可以避免外部的調用,同時還可以滿足內部調用的需要:

rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c89

我們甚至可以禁用掉CONFIG命令,那就是把CONFIG的名字改成一個空字元串:

rename-command CONFIG ""

需要註意的是,如果你使用AOF方式進行數據持久化,或者需要與從redis進行通信,那麼更改指令的名字可能會引起一些問題。

 

5.限制:

我們可以設置redis同時可以與多少個客戶端進行連接。預設情況下為10000個客戶端。當你無法設置進程文件句柄限制時,redis會設置為當前的文件句柄限制值減去32,因為redis會為自身內部處理邏輯留一些句柄出來。如果達到了此限制,redis則會拒絕新的連接請求,並且向這些連接請求方發出“max number of clients reached”以作回應。

maxclients 10000

我們甚至可以設置redis可以使用的記憶體量。一旦到達記憶體使用上限,redis將會試圖移除內部數據,移除規則可以通過maxmemory-policy來指定。如果redis無法根據移除規則來移除記憶體中的數據,或者我們設置了“不允許移除”,那麼redis則會針對那些需要申請記憶體的指令返回錯誤信息,比如SET、LPUSH等。但是對於無記憶體申請的指令,仍然會正常響應,比如GET等。預設設置為:

maxmemory <bytes>

需要註意的一點是,如果你的redis是主redis(說明你的redis有從redis),那麼在設置記憶體使用上限時,需要在系統中留出一些記憶體空間給同步隊列緩存,只有在你設置的是“不移除”的情況下,才不用考慮這個因素。

對於記憶體移除規則來說,redis提供了多達6種的移除規則。他們是:

1.volatile-lru:使用LRU演算法移除過期集合中的key
2.allkeys-lru:使用LRU演算法移除key
3.volatile-random:在過期集合中移除隨機的key
4.allkeys-random:移除隨機的key
5.volatile-ttl:移除那些TTL值最小的key,即那些最近才過期的key。
6.noeviction:不進行移除。針對寫操作,只是返回錯誤信息。

maxmemory-policy volatile-lru

LRU演算法和最小TTL演算法都並非是精確的演算法,而是估算值。所以你可以設置樣本的大小。假如redis預設會檢查三個key並選擇其中LRU的那個,那麼你可以改變這個key樣本的數量。

maxmemory-samples 3

 

6.追加模式--aof(redis持久化方法之二):

 啟用aof持久化方式

appendonly yes                     

日誌追加(aof)方式比快照方式有更好的持久化性,如果啟用了aof,Redis會將每一個收到的寫命令通過write函數追加到文件appendonly.aof中,當Redis重啟時,它會執行該文件中的所有命令,這樣就可以在記憶體中重建整個redis資料庫的內容。另外,操作系統內核的 I/O 介面可能存在緩存,所以日誌追加方式不可能立即寫入文件,這樣就有可能丟失部分數據。幸運的是,Redis提供瞭解決方法,通過修改配置文件,告訴Redis應該在什麼時候使用fsync函數強制操作系統把緩存中的寫命令寫入磁碟中的日誌文件。有以下三種方法:

#appendfsync no                  是否寫入磁碟完全依賴操作系統,性能最好,持久化沒保證

#appendfsync always            在每次寫請求後都調用fsync()。這種模式下,redis會相對較慢,但數據最安全。

appendfsync everysec          每秒鐘寫入磁碟一次,在性能和持久化方面做了很好的折中,最多存在一秒鐘的數據丟失情況
預設情況下為everysec

當fsync方式設置為always或everysec時,如果後臺持久化進程需要執行一個很大的磁碟IO操作,那麼redis可能會在fsync()調用時卡住。目前尚未修複這個問題,這是因為即使我們在另一個新的線程中去執行fsync(),也會阻塞住同步寫調用。為了緩解這個問題,我們可以使用下麵的配置項,這樣的話,當BGSAVE或BGWRITEAOF運行時,fsync()在主進程中的調用會被阻止。這意味著當另一路進程正在對AOF文件進行重構時,redis的持久化功能就失效了,就好像我們設置了“appendsync none”一樣。如果你的redis有時延問題,那麼請將下麵的選項設置為yes。否則請保持no,因為這是保證數據完整性的最安全的選擇。

no-appendfsync-on-rewrite no

我們允許redis自動重寫aof。當aof增長到一定規模時,redis會隱式調用BGREWRITEAOF來重寫log文件,以縮減文件體積。redis是這樣工作的:redis會記錄上次重寫時的aof大小。假如redis自啟動至今還沒有進行過重寫,那麼啟動時aof文件的大小會被作為基準值。這個基準值會和當前的aof大小進行比較。如果當前aof大小超出所設置的增長比例,則會觸發重寫。另外,你還需要設置一個最小大小,是為了防止在aof很小時就觸發重寫。

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

如果設置auto-aof-rewrite-percentage為0,則會關閉此重寫功能。

 

8.慢日誌:

redis慢日誌是指一個系統進行日誌查詢超過了指定的時長。這個時長不包括IO操作,比如與客戶端的交互、發送響應內容等,而僅包括實際執行查詢命令的時間。針對慢日誌,你可以設置兩個參數,一個是執行時長,單位是微秒,另一個是慢日誌的長度。當一個新的命令被寫入日誌時,最老的一條會從命令日誌隊列中被移除。單位是微秒,即1000000表示一秒。負數則會禁用慢日誌功能,而0則表示強制記錄每一個命令。

slowlog-log-slower-than 10000

慢日誌最大長度,可以隨便填寫數值,沒有上限,但要註意它會消耗記憶體。你可以使用SLOWLOG RESET來重設這個值。

slowlog-max-len 128

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、將命令寫在文件中 數據量比較大的話,建議用程式去生成文件。例如: 生成的文件可能是這樣的: 接下來,命令行執行 這個例子比較簡單,可以這麼做,如果命令比較多的話可以寫成shell腳本 2、grep命令 ...
  • 記錄工作中遇到的問題,分享出來: 原博客地址:https://blog.csdn.net/weixin_40782680/article/details/85038281 今天遇到一個比較鬱悶的問題,如下圖: 點擊庫存或者點擊銷售,查詢數據很慢,有的將近幾十秒,查詢數據用的是存儲過程,在資料庫中執行 ...
  • sqlserver存儲過程入門 1. 輸入/輸出參數定義 @object_name varchar(50) //定義一個varchar類型的輸入參數 @object_index int @isUpdate int =0 output //定義一個輸出參數 2.游標使用步驟 1、定義游標 DECLAR ...
  • Windows下Redis安裝配置和使用註意事項 一:下載 下載地址: https://github.com/microsoftarchive/redis/releases 文件介紹: 本文以3.2.100為例 Redis-x64-3.2.100.msi是在windows下,最簡單的安裝文件,方便, ...
  • Redis 事務 == [toc] Redis操作時支持事務的。事務具有原子性atomic,包含在事務中的操作要麼都執行成功,要麼都執行失敗。但是redis不支持回滾,但是可以在測試開發環節避免錯誤操作。可以說原子性上是半支持的,看後面原因。 很多時候我們需要進行事務操作。 翻譯官檔:https:/ ...
  • 本來這一節想寫Hadoop的分散式高可用環境的搭建,寫到一半,發現還是有必要先介紹一下ZooKeeper這個東西。 ZooKeeper理念介紹 ZooKeeper是為分散式應用來提供協同服務的,而且ZooKeeper本身也是分散式的,由分佈在至少三台機器上,這幾台機器形成一個Quorum,就像一個劇 ...
  • 一 庫操作 1、創建資料庫 1.1 語法 CREATE DATABASE 資料庫名 charset utf8; 1.2 資料庫命名規則 可以由字母、數字、下劃線、@、#、$ 區分大小寫 唯一性 不能使用關鍵字如 create select 不能單獨使用數字 最長128位 基本上跟python或者js ...
  • https://www.jb51.net/article/52269.htm註:本文譯自《Oracle Data Guard 11g Handbook》 Page 78 – Page 88這篇文章主要介紹了Oracle 11g Dataguard參數詳解,包含了獨立參數、主庫參數、備庫參數的詳細說明 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...