內容要點:c++
1、Redis 簡介:redis
2、安裝部署 Redis:算法
3、Redis 配置文件:sql
4、Redis 數據庫經常使用命令:數據庫
5、Redis 持久化:vim
6、Redis 性能管理:windows
補充:緩存
1、關係數據庫(SQL)和非關係數據庫(NoSQL)簡要分析:bash
2、Redis 和 Memcache 的比較服務器
1、Redis 簡介:
Redis 基於內存運行並支持持久化;
採用 key-value (鍵值對) 的存儲形式;
優勢:
具備極高的數據讀寫速度;
支持豐富的數據類型;
支持數據的持久化;
原子性;
支持數據備份
2、安裝部署 Redis:
(1)安裝 redis:
安裝包:redis-5.0.7.tar.gz
系統:Linux
操做步驟總覽:
第一步:經過遠程掛載的辦法將 windows上的安裝包下載到 Linux本地。
第二步:安裝編譯工具
yum install gcc gcc-c++ make -y
第三步:解壓
tar zxvf redis-5.0.7.tar.gz -C /opt/
第四步:安裝
cd redis-5.0.7/ make make PREFIX=/usr/local/redis install
第五步:建立軟鏈接
ln -s /usr/local/redis/bin/* /usr/local/bin/
第五步:啓動安裝腳本,查看端口狀態
cd /redis-5.0.7/utils/ ./install_server.sh //啓動腳本,注意:這步一路回車到底就好了 netstat -natp | grep 6379
除此以外,還能夠用 redis_6379 控制其開啓關閉:
/etc/init.d/redis_6379 stop //關閉 /etc/init.d/redis_6379 start //開啓 /etc/init.d/redis_6379 restart //重啓
(2)redis-cli 遠程鏈接:
一、先修改配置文件,添加主機的IP地址
vim /etc/redis/6379.conf bind 127.0.0.1 192.168.220.131 //添加主機的IP地址
二、重啓服務
三、遠程鏈接
redis-cli -h 192.168.220.131 -p 6379 //-h:指定主機IP地址,-p:指定端口
3、Redis 配置文件:
配置參數 vim /etc/redis/6379.conf bind:監聽的主機地址 port:端口 daemonize yes:啓用守護進程 pidfile:指定PID文件 loglevel notice:日誌級別 logfile:指定日誌文件
4、Redis 數據庫經常使用命令:
(一)經常使用命令:
(1)redis-cli 命令行工具:
一、鏈接本地數據庫:
/usr/local/redis/bin/redis-cli
二、鏈接遠程數據庫:
redis-cli -h 192.168.220.131 -p 6379
三、存放數據(set):
四、獲取數據(get):
(2)key 相關命令:
一、keys :獲取符合規則的鍵值列表
>keys * //查看當前數據庫中全部的鍵 >keys v* //查看當前數據庫中以v開頭的鍵 >keys v? //查看當前數據庫中以v開頭後面包含任意一個字符的鍵 >keys v?? //查看當前數據庫中以v開頭後面包含任意二個字符的鍵
二、exists:判斷鍵值是否存在
三、del :刪除當前數據庫的指定 key
四、type :獲取 key 對應的 value 值類型
五、rename(覆蓋)/ renamenx(不覆蓋):對已有的 key 進行重命名:
六、dbsize :查看當前數據庫中 key 的數目
(3)redis-benchmark 測試工具:
-h:指定服務器主機名 -p:指定服務器端口 -c:指定併發鏈接數 -n: 指定請求數 -d:以字節的形式指定SET/GET值的數據大小 -q:強制推出redis。僅顯示query/sec值
redis-benchmark -h 192.168.220.131 -p 6379 -c 100 -n 100000 //向IP地址爲192.168.220.13一、端口爲6379的redis服務器發送 100個併發鏈接與 100000個請求測試性能
redis-benchmark -h 192.168.220.131 -p 6379 -q -d 100 //測試存取大小爲100字節的數據包的性能
(二)Redis 多數據操做:
(1)Redis 支持多數據庫,默認支持16個數據庫,0-15 命名;
(2)多數據相互獨立,互不干擾;
(3)多數據經常使用命令;
一、select:多數據庫間的切換(默認是在數據庫0中)
二、move:多數據庫間移動數據
三、flushdb:清除數據庫內數據
5、Redis 持久化:
(1)持久化概述:
Redis 是運行在內存中,內存中的數據斷電就會丟失;
爲了能重用 Redis 數據,或者防止系統故障,須要將 Redis 中的數據寫入到磁盤空間中,即持久化。
(2)持久化分類:
一、RDB 方式:建立快照的方式獲取某一時刻 Redis 中全部數據的副本。
二、AOF 方式:將執行的寫命令寫到文件的末尾,以日誌的方式來記錄數據的變化。
(3)RDB持久化:
一、它是 Redis的默認持久化方式,默認文件名爲 dump.rdb
二、觸發條件:
在指定的時間間隔內,執行指定次數的寫操做(配置文件控制);
執行 save 或者是 bgsave (異步)命令;
執行 flushall 命令,清除數據庫全部數據;
執行 shutdown 命令,保證服務器正常關閉且不丟失任何數據。
三、優缺點:
適合大規模的數據恢復;
若是業務對數據完整性和一致性要求不高,RDB 是很好的選擇;
數據的完整性和一致性不高;
備份時佔用內存。
四、經過 RDB 文件恢復數據:
將 dump.rdb 文件拷貝到 redis 的安裝目錄的 bin 目錄下,重啓 redis 服務便可。
五、配置文件選項:
vim /etc/redis/6379.conf
save 900 1 save 300 10 save 60 10000 //900秒以內至少一次寫操做、300秒以內至少發生10次寫操做、60秒以內發生至少10000次寫操做,只要知足其一都會觸發快照操做,註釋全部的save項表示關閉 RDB dbfilename dump.rdb // RDB文件名稱 dir /var/lib/redis/6379 // RDB文件路徑 rdbcompression yes // 是否進行壓縮
(4)AOF 持久化:
Redis 默認是不開啓的;
彌補 RDB 的不足(數據的不一致性);
採用日誌的形式來記錄每一個寫操做,並追加到文件中;
Redis 重啓會根據日誌文件的內容將寫指令從前到後執行一次以完成數據的恢復工做。
一、根據 AOF 文件恢復數據:
將 appendonly.aof 文件拷貝到 redis 的安裝目錄的 bin 目錄下,重啓 redis 訪問便可。
二、配置文件選項:
vim /etc/redis/6379.conf appendonly yes //開啓AOF持久化 appendfilename "appendonly.aof" //AOF文件名稱 appendfsync always appendfsync everysec appendfsync no //解釋:always:同步持久化,每次發生數據變化會馬上寫入磁盤; everysec:默認推薦,每秒異步記錄一次(默認值); no:不一樣步,交給操做系統決定如何同步。 aof-load-truncated yes //忽略最後一條可能存在問題的指令
三、AOF 的重寫機制:
AOF 的工做原理是將寫操做追加到文件中,文件的冗餘會愈來愈多;
當 AOF 文件的大小超過所設定的閾值時,Redis 就會對 AOF 文件的內容壓縮;
四、AOF 的重寫原理:
Redis 會 fork 出一條新進程,讀取內存中的數據(並無讀取舊文件),並從新到一個臨時文件中,最後替換舊的 aof 文件。
五、AOF 的重寫配置:
vim /etc/redis/6379.conf 在日誌進行 BGREWRITEAOF 時,若是設置爲 yes 表示新寫操做不進行同步 fsync,只是暫存在緩衝區裏,避免形成磁盤 IO 操做衝突,等重寫完成後在寫入。redis 中默認爲 no no-appendfsync-on-rewrite no //當前 AOF文件大小是上第二天志重寫時 AOF 文件大小兩倍時,發生 BGREWRITEAOF操做 auto-aof-rewrite-percentage 100 //當前 AOF文件執行 BGREWRITEAOF命令的最小值,避免剛開始啓動 redis 時因爲文件尺寸較小致使頻繁的 BGREWRITEAOF auto-aof-rewrite-min-szie 64mb
6、Redis 性能管理:
(1)內存碎片率:
一、操做系統分配的內存值 used_memory_rss 除以 redis 使用的內存值 used_memory 計算得出的;
二、內存碎片是由操做系統低效的分配/回收物理內存致使的;
不連續的物理內存分配
三、跟蹤內存碎片率對理解 redis 實例的資源性能是很是重要的;
內存碎片率稍大於 1 是合理的,這個值表示內存碎片率比較低;
內存碎片率超過 1.5 ,說明 redis 消耗了實際須要物理內存的 150% ,其中 50% 是內存碎片率;
內存碎片率低於 1 的,說明 Redis 內存分配超出了物理內存,操做系統正在進行內存交換。
(2)內存使用率:
一、 redis 實例的內存使用率超過可用最大內存,操做系統開始進行內存與 swqp 空間交換;
二、避免內存交換:
針對緩存數據大小選擇;
儘量的使用 Hash 數據結構;
設置 key 的過時時間
(3)回收 Key:
一、保證合理分配 redis 有限的內存資源;
二、當內存使用達到設置的最大閾值時,須要選擇一種 key 的回收策略:
默認狀況下回收策略是禁止刪除的;
redis.conf 配置文件中修改 maxmemory-policy 屬性值
--volatile-lru:使用L .RU算法從已設置過時時間的數據集合中淘汰數據 --voltil-tt:從已設置過時時間的數據集合中挑選即將過時的數據淘汰 --volatile-random:從已設置過時時間的數據集合中隨機挑選數據淘汰 --allkeys-lru:使用LRU算法從全部數據集合中淘汰數據 --allkeys-random:從數據集合中任意選擇數據淘汰 --no-enviction:禁止淘汰數據
補充:
1、關係數據庫(SQL)和非關係數據庫(NoSQL)簡要介紹:
(1)關係型數據庫(SQL):
一、一個結構化的數據庫,建立在關係模型基礎上,通常面向於記錄;
二、包括 Oracle 、Mysql 、 SQL Server 、Microsoft Access 、DB2 等。
優勢:
一、易於維護:都是使用表結構,格式一致;
二、使用方便:SQL語言通用,可用於複雜查詢;
三、複雜操做:支持SQL,可用於一個表以及多個表之間很是複雜的查詢。
缺點:
一、讀寫性能比較差,尤爲是海量數據的高效率讀寫;
二、固定的表結構,靈活度稍欠;
三、對於高併發讀寫需求,傳統關係型數據庫來講,硬盤I/O是一個很大的瓶頸。
(2)非關係型數據庫(NoSQL):
一、除了主流的關係型數據庫之外的數據庫,都認爲是非關係型的;
二、包括 Redis 、 MongBD 、 Hbase 、 CouhDB 、Memcache 等;
三、非關係型數據庫嚴格上不是一種數據庫,應該是一種數據結構化存儲方法的集合,能夠是文檔或者鍵值對等。
優勢:
一、格式靈活:存儲數據的格式能夠是 key-value(鍵-值)形式、文檔形式、圖片形式等等,文檔形式、圖片形式等等,使用靈活,應用場景普遍,而關係型數據庫則只支持基礎類型;
二、速度快:nosql可使用硬盤或者隨機存儲器做爲載體,而關係型數據庫只能使用硬盤;
三、高擴展性;
四、成本低:nosql數據庫部署簡單,基本都是開源軟件。
缺點:
一、不提供sql支持,學習和使用成本較高;
二、不支持事務,容錯率低;
三、數據結構相對複雜,複雜查詢方面稍欠。
(3)非關係型數據庫產生的背景:
High performance :對數據庫高併發讀寫需求;
Huge Storage:對海量數據高效存儲與訪問需求;
High Scalability && High Availability:對數據庫高可擴展性與高可用性需求。
如本文主角redis便爲非關係型數據庫。
2、Redis 和 Memcache 的比較:
一、存儲方式:
Memecache把數據所有存在內存之中,斷電後會掛掉,數據不能超過內存大小;
Redis有部份存在硬盤上,這樣能保證數據的持久性。
二、數據支持類型:
Memcache對數據類型支持相對簡單;
Redis有複雜的數據類型。
三、使用底層模型不一樣:
它們之間底層實現方式以及與客戶端之間通訊的應用協議不同;
Redis直接本身構建了VM 機制 ,由於通常的系統調用系統函數的話,會浪費必定的時間去移動和請求。
四、value大小:
redis最大能夠達到1GB,而memcache只有1MB。
五、使用redis有哪些好處?
一、速度快,由於數據存在內存中,相似於HashMap,HashMap的優點就是查找和操做的時間複雜度都是O(1)
二、支持豐富數據類型,支持string,list,set,sorted set,hash
三、支持事務,操做都是原子性,所謂的原子性就是對數據的更改要麼所有執行,要麼所有不執行。
四、豐富的特性:可用於緩存,消息,按key設置過時時間,過時後將會自動刪除。
redis 相比 memcached 的優點:
memcached全部的值均是簡單的字符串,redis做爲其替代者,支持更爲豐富的數據類型;
redis的速度比memcached快不少;
redis能夠持久化其數據;
Memcache 支持結構化,可是 Redis支持結構化和非結構化。