Redis介紹、安裝、效能優化
關係資料庫是一個結構化的資料庫,建立在關係模型(二維表格模型)基礎上,一般面向記錄。
SQL語句(標準資料查詢語言)就是一種基於關係型資料庫的語言,用於執行關係型資料庫中資料的檢索和操作。
主流的關係型資料庫包括:oracle、mysql、sqlserver、Microsoft access、db2等
優點
易於維護: 都是使用表結構,格式一致
使用方便: sql語言通用,可用於複雜查詢
支援複雜操作, 支援sql,可用於一個表以及多個表之間非常複雜的查詢
缺點
讀寫效能比較差, 尤其是海量資料的高效讀寫
固定的表結構, 靈活度差
資料儲存在磁碟, 高併發讀寫容易遇到瓶頸
NoSQL(NoSQL = Not Only SQL),表示為不僅僅是SQL,是非關係型資料庫的總稱,除了主流的關係型資料庫外的資料庫,都認為是非關係型。
主流的NoSQL資料庫有Redis、MongoDB、Hbase、CouhDB等
主要區別分為三種:①資料儲存的格式不同,②擴充套件方式不同,③對事物的處理不同
關係型和非關係型資料庫的主要差異是資料儲存的方式,關係型資料天然就是表格式的,因此儲存在資料表的行和列中。資料表可以彼此關聯協作儲存,也很容易提取資料。
非關係資料不適合在資料表的行和列中,而是大塊組合在一起。非關係資料通常儲存在資料集中,就像文件、鍵值對或者圖結構,你的資料及其特性是選擇資料儲存和提取方式的首要因數。
SQL和NoSQL資料庫最大的差別可能是在擴充套件方式上,要支援日益增長的需求當然要擴充套件。
要支援更多併發量,SQL資料庫是縱向擴充套件。也就是說提高處理能力,使用速度更快的計算機,這樣處理相同的資料集就更快了,因為資料儲存在關係表中,操作的效能瓶頸可能涉及到很多個表,這都需要通過計算機效能來克服。雖然SQL資料庫有很大擴充套件空間,但最終肯定會達到縱向擴充套件的上限。
NoSQL資料庫是橫向擴充套件。因為非關係資料儲存天然就是分散式的,NoSQL資料庫的擴充套件可以通過給資源池新增更多普通的資料庫伺服器(節點)來分擔負載。
如果資料操作需要高事務性或者資料查詢需要控制執行計劃,那麼傳統的SQL資料庫從效能和穩定方面考慮是你最佳選擇, SQL資料庫支援對事務原子性細粒度控制。並且易於回滾事務。
雖然NoSQL資料庫也可以使用事務操作,但穩定方面沒法和關係型資料庫比較所以真正的優勢還是在於擴充套件性和大資料量處理方面。
關係型資料庫和非關係型資料庫都有各自的特點與應用場景,兩者的緊密結合將會給Web2.0的資料庫發展帶來新的思路。讓關係資料庫關注在關係上,非關係型資料庫關注在儲存上。例如,在讀寫分離的MySQL資料庫環境中,可以把經常訪問的資料儲存在非關係型資料庫中,提升訪問速度。
可用於web2.0純動態網站型別的問題。 高併發、高效儲存、高擴充套件高、高可用
1、Hight performance ---- 對資料庫高併發讀寫需求。
2、Huge Storage------ -對海量資料高效儲存訪問需求
3、Hight Scalability && Hight Availabity ----- 對資料高擴充套件性與高可用性需求。
關係型資料庫
例項(伺服器)----》資料庫----》表(table)----》記錄行(row)、資料欄位(coulumn)
非關係型資料庫
例項(伺服器)-----》資料庫----》集合(collection)—》鍵值對(key-value)
Redis 是一個開源的,使用C語言編寫的NoSQL資料庫。
Redis基於記憶體執行並支援持久化,採用key-balues(鍵值對)的儲存形式,是目前分佈架構中不可或缺的一環。
Redis伺服器程式時單程序模型,也就是在一臺伺服器上可以同時啟動多個Redis程序,Redis的實際處理速度則是完全依靠主程序的執行效率。若在伺服器上只執行一個Redis程序,當多個客戶端同時訪問時,伺服器的處理能力是會有一定程度的下降,若在同一臺伺服器上開啟多個Redis程序,Redis在提高併發處理能力的同時會給伺服器的CPU造成很大壓力。
即:在實際生產環境中,需要根據實際的需求來決定開啟多少個Redis程序,若對高併發要求更高一些,可能會考慮在同一臺伺服器上開啟多個程序,若CPU資源比較緊張,採用單程序即可。
Redis伺服器程式是單程序模型,也就是在一臺伺服器上可以同時啟動多個Redis程序。Redis 實際處理速度則是完全依靠於主程序的執行效率。
若在伺服器上只執行一個Redis程序,當多個客戶端同時訪問時,伺服器的處理能力會有一定程度的下降。
若在同一臺伺服器上開啟多個Redis程序,Redis在提高併發處理能力的同時會伺服器的CPU造成很大壓力。
在實際生產環境中,需要根據實際的需求來決定開啟多少個Redis程序,若對高併發要求更高一些,可能會考慮在同一臺伺服器上開啟多個程序,若CPU資源緊張,採用單執行緒即可。
①具有極高的資料讀寫速度: 資料讀取的速度最高可達到110000次/s,資料寫入速度最高可達到81000次/s。
②支援豐富的資料型別 ,支援key-values、string字串、lists列表、hashes雜湊值、sets集合 及 ordered sets等資料型別操作。
③支援資料的持久化: 可以將記憶體中的資料儲存在磁碟中,重啟的時候可以再次載入進行使用。
④原子性: redis所有操作都是原子性的。
⑤支援資料備份: 即master-salve模式的資料備份。
⑥分散式
⑦預設使用epoll + i/o 多路複用來提高併發能力。
Redis作為基於記憶體執行的資料庫,快取是其最常用的場景之一。除次之外,redis常見應用場景還包括獲取最近N個數據的操作、排行榜類應用、計數器、儲存關係、實時分析系統、日誌記錄。
資料容量受到實體記憶體的限制,不能用於海量資料的高效能讀寫,因此Redis適合的場景主要侷限在較小資料量的高效能操作和運算上。
systemctl stop firewalld setenforce 0 #關閉防火牆 yum install -y gcc gcc-c++ make #安裝依賴環境 tar zxvf redis-5.0.7.tar.gz -C /opt/ #將redis包進行解壓 cd /opt/redis-5.0.7/ make make PREFIX=/usr/local/redis install #進行編譯安裝
cd /opt/redis-5.0.7/utils ./install_server.sh #進行安裝(安裝時,需要輸入路徑,具體看下圖)
cd /opt/redis-5.0.7/utils ./install_server.sh #進行安裝(安裝時,需要輸入路徑,具體看下圖)
路徑位置描述
port :6379 預設偵聽埠6379
config file :/etc/redis/6379.conf 配置檔案路徑
Log file :/var/log/redis_6379.log 日誌檔案路徑
Executable :/usr/local/redis/bin/redis-server 可執行檔案路徑
Cli Executable :/usr/local/bin/redis-cli 客戶端命令工具
ln -s /usr/local/redis/bin/ * /usr/local/bin /etc/init.d/redis_6379 stop #停止 /etc/init.d/redis_6379 start #啟動 /etc/init.d/redis_6379 restart #重啟 /etc/init.d/redis_6379 status #狀態
vim /etc/redis/6379.conf bind 127.0.0.1 192.168.111.21 #70行,新增 監聽的主機地址 port 6379 #93行,Redis預設的監聽埠 daemonize yes #137行,啟用守護程序 pidfile /var/run/redis_6379.pid #159行,指定 PID 檔案 loglevel notice #167行,日誌級別 logfile /var/log/redis_6379.log #172行,指定日誌檔案 /etc/init.d/redis_6379 restart #重啟redis
redis-server 用於啟動 Redis 的工具 redis-benchmark 用於檢測 Redis 在本機的執行效率 redis-check-aof 修復 AOF 持久化檔案 redis-check-rdb 修復 RDB 持久化檔案 redis-cli Redis命令列工具
若不新增任何選項表示,則使用127.0.0.1:6379連線本機上的Redis資料庫
選項 |
描述 |
-h |
指定遠端主機 |
-p |
指定redis服務的埠 |
-a |
指定密碼,末設定資料庫密碼可以省略-a選項 |
redis-cli -h 20.0.0.55 -p6379 #登入資料庫(沒有密碼,所有不需要加-a)
redis-benchmark 是官方自帶的Redis效能測試工具,可以有效的測試Redis服務的效能。
基礎的測試語法:redis-benchmark 【選項】 【選項值】
選項 功能
-h 指定伺服器主機名
-p 指定伺服器埠
-s 指定伺服器socket
-c 指定併發連線數
-n 指定請求數
-d 以位元組的形式指定SET/GET值的資料大小
-k 1=keep alive 0=reconnect
-r SET/GET/INCR 使用隨機key,SADD使用隨機值
-P 通過管道傳輸
-q 強制退出redis,進顯示query/sec值
-csv 以csv格式輸出
-l 生成迴圈,永久執行測試
-t 僅執行以逗號分隔的測試命令列表
-l ldle模式,僅開啟N個idle連線並等待
set #存放資料,命令格式為 set key value get #獲取資料,命令格式為 get key keys #命令可以取符合規則的鍵值列表,通常情況可以結合*、?等選項來使用。 exists #命令可以判斷鍵值是否存在。 del #命令可以刪除當前資料庫的指定 key。 type #命令可以獲取 key 對應的 value 值型別。
儲存鍵值,獲取值
redis-cli 【-h 20.0.0.55】 -p 6379 #登入redis set ky20 yudeqiang #儲存鍵為:ky20,值為:yudeqiang get ky20 #查詢鍵ky20的值 set h1 1 #建立 鍵為:h1 值為:1..下面類似 set h2 2 set h3 3 set a1 1 set a2 22 set a22 4
使用萬用字元 * 和 ?查詢當前資料庫的所有鍵
keys * keys h* keys a? keys a??
對已有的鍵進行重新命名(會覆蓋不提醒)
rename 舊key 新key
rename a1 aaa1
rename a2 a22
對已有的鍵進行重新命名(檢測新名是否存在,如果存在,執行失敗)
renamenx 舊key 新key
renamenx h1 h4
renamenx h2 h3
檢視Redis記憶體使用
info memory
作業系統分配的記憶體值 used_memory_rss 除以Redis使用的記憶體總量值 used_memory 計算得出。
記憶體值 used_memory_rss 表示該程序所佔實體記憶體的大小,即為作業系統分配給Redis例項的記憶體大小。
除了使用者定義的資料和內部開銷以外,used_memory_rss 指標還包含了記憶體碎片的開銷。
記憶體碎片由作業系統抵消的分配/回收物理記憶體導致的(不連續的實體記憶體分配)
舉例來說:Redis 需要分配連續記憶體塊來儲存1G的資料集,如果實體記憶體上沒有超過1G的連續記憶體塊,那作業系統就不得不使用多個不連續的小記憶體塊來分配並存儲著1G資料,該操縱就會導致記憶體碎片的產生。
跟蹤記憶體碎片率對理解Redis例項的資源效能是非常重要的
記憶體碎片率大於1是合理的,這個值表示記憶體碎片率比較低,也說明Redis沒有發生記憶體交換
記憶體碎片率超過1.5,說明Redis消耗了實際需要實體記憶體的150%,其中50%是記憶體碎片率,需要在redis-cli 工具上輸入shutdown save 命令,讓redis資料庫執行儲存操作並關閉redis服務,再重啟伺服器。
記憶體碎片率低於1的,說明Redis記憶體分配超出了實體記憶體,作業系統正常進行記憶體交換,需要增加可用實體記憶體或減少redis記憶體佔用。
redis例項的記憶體使用率超過可用最大記憶體,作業系統將開始進行記憶體與swap空間。
避免記憶體交換髮生的交換
針對快取資料大小選擇安裝Redis例項
儘可能的使用hash資料結構儲存
設定key的過期時間
記憶體清理策略,保證合理分配redis優先的記憶體資源。
當達到設定的最大閾值時,需選擇一種key的回收策略,預設情況下回收策略是禁止刪除。
配置檔案中修改 maxmemory-policy屬性值
vim /etc/redis/6379.conf --598-- maxmemory-policy noenviction ●volatile-lru:使用LRU演算法從已設定過期時間的資料集合中淘汰資料(移除最近最少使用的key,針對設定了TTL的key) ●volatile-ttl:從已設定過期時間的資料集合中挑選即將過期的資料淘汰(移除最近過期的key) ●volatile-random:從已設定過期時間的資料集合中隨機挑選資料淘汰(在設定了TTL的key裡隨機移除) ●allkeys-lru:使用LRU演算法從所有資料集合中淘汰資料(移除最少使用的key,針對所有的key) ●allkeys-random:從資料集合中任意選擇資料淘汰(隨機移除key) ●noenviction:禁止淘汰資料(不刪除直到寫滿時報錯)
關係資料和非關係資料庫的區別
關係資料庫:
安全性高(永續性)
事務處理能力強
任務控制能力強
可基於日誌備份、恢復、容災、能力更強
非關係資料庫:
將資料儲存在記憶體中,利於讀取查詢資料
架構中位置非常靈活
分散式、擴充套件性高。
主要區別:
關係資料庫儲存的格式是以表格式儲存,非關係資料庫時大塊組合一起。比如鍵值對
關係資料庫擴充套件是縱向擴充套件,就是新增裝置硬體,非關係資料庫可以橫向擴充套件,實現分散式,通過節點來分攤壓力
關係資料庫支援事務,對於效能和查詢來說穩定性強,而且還可以回滾操作,非關係資料庫相對來說沒有關係資料庫穩定,
非關係資料庫的優勢:
對資料高併發讀寫需求,對資料高效儲存與訪問需求,對資料高擴充套件性和高可用性需求
Reids的優勢:
支援持久化,單程序模型,
讀寫資料快
支援豐富的資料型別(5大型別:string、lists列表、hash雜湊、sets集合、ordered sets有序集合,鍵值(key-vales))
也具有原子性
支援資料備份(使用主從複製備份資料)
將資料儲存在記憶體中,利於讀取查詢資料
架構中位置非常靈活
分散式、擴充套件性高。