一、Redis 簡介
Redis 是完全開源免費的埋虹,遵守BSD協(xié)議猜憎,是一個高性能(NOSQL)的key-value數(shù)據(jù)庫,Redis是一個開源的使用ANSI C語言編寫搔课、支持網(wǎng)絡(luò)拉宗、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫辣辫,并提供多種語言的API旦事。
二、NoSQL介紹
NoSQL急灭,泛指非關(guān)系型的數(shù)據(jù)庫姐浮。
NoSQL數(shù)據(jù)庫的產(chǎn)生就是為了解決大規(guī)模數(shù)據(jù)集合多重數(shù)據(jù)種類帶來的挑戰(zhàn),尤其是大數(shù)據(jù)應(yīng)用難題葬馋。
NOSQL 非關(guān)系型數(shù)據(jù)庫:表與表之間沒有關(guān)聯(lián)關(guān)系卖鲤;
SQL 關(guān)系型數(shù)據(jù)庫:表與表之間建立關(guān)聯(lián)關(guān)系;
1畴嘶、NoSQL數(shù)據(jù)庫的四大分類
(1)蛋逾、鍵值(Key-Value)存儲數(shù)據(jù)庫
這一類數(shù)據(jù)庫主要會使用到一個哈希表,這個表中有一個特定的鍵和一個指針指向特定的數(shù)據(jù)窗悯。Key/value模型對于IT系統(tǒng)來說的優(yōu)勢在于簡單区匣、易部署。但是如果DBA只對部分值進行查詢或更新的時候蒋院,Key/value就顯得效率低下了亏钩。如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB.
((2)、列存儲數(shù)據(jù)庫
這部分?jǐn)?shù)據(jù)庫通常是用來應(yīng)對分布式存儲的海量數(shù)據(jù)欺旧。鍵仍然存在姑丑,但是它們的特點是指向了多個列。這些列是由列家族來安排的辞友。如:Cassandra, HBase, Riak.
((3)栅哀、文檔型數(shù)據(jù)庫
該類型的數(shù)據(jù)模型是版本化的文檔,半結(jié)構(gòu)化的文檔以特定的格式存儲称龙,比如JSON留拾。文檔型數(shù)據(jù)庫可 以看作是鍵值數(shù)據(jù)庫的升級版,允許之間嵌套鍵值茵瀑。而且文檔型數(shù)據(jù)庫比鍵值數(shù)據(jù)庫的查詢效率更高间驮。如:CouchDB, MongoDb. 國內(nèi)也有文檔型數(shù)據(jù)庫SequoiaDB,已經(jīng)開源马昨。
((4)竞帽、圖形(Graph)數(shù)據(jù)庫
圖形結(jié)構(gòu)的數(shù)據(jù)庫同其他行列以及剛性結(jié)構(gòu)的SQL數(shù)據(jù)庫不同,它是使用靈活的圖形模型鸿捧,并且能夠擴展到多個服務(wù)器上屹篓。NoSQL數(shù)據(jù)庫沒有標(biāo)準(zhǔn)的查詢語言(SQL),因此進行數(shù)據(jù)庫查詢需要制定數(shù)據(jù)模型匙奴。許多NoSQL數(shù)據(jù)庫都有REST式的數(shù)據(jù)接口或者查詢API堆巧。 如:Neo4J, InfoGrid, Infinite Graph.
因此,NoSQL數(shù)據(jù)庫在以下的這幾種情況下比較適用:
1、數(shù)據(jù)模型比較簡單谍肤;
2啦租、需要靈活性更強的IT系統(tǒng);
3荒揣、對數(shù)據(jù)庫性能要求較高篷角;
4、不需要高度的數(shù)據(jù)一致性系任;
5恳蹲、對于給定key,比較容易映射復(fù)雜值的環(huán)境俩滥。
三嘉蕾、Redis 與其它 key-value 緩存產(chǎn)品有以下特點:
- Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中霜旧,重啟的時候可以再次加載進行使用错忱。
- Redis不僅僅支持簡單的key-value類型的數(shù)據(jù),同時還提供list颁糟,set航背,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲棱貌。
- Redis支持?jǐn)?shù)據(jù)的備份玖媚,集群等高可用功能
特點:
- 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 婚脱。
- 豐富的數(shù)據(jù)類型 – Redis支持的類型 String, List, Hash, Set 及 Ordered Set 數(shù)據(jù)類型操作今魔。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功執(zhí)行要么失敗完全不執(zhí)行障贸。單個操作是原子性的错森。多個操作也支持事務(wù),即原子性篮洁,通過MULTI和EXEC指令包起來涩维。
- 豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。
Redis是一個簡單的袁波,高效的瓦阐,分布式的,基于內(nèi)存的緩存工具篷牌。
架設(shè)好服務(wù)器后睡蟋,通過網(wǎng)絡(luò)連接(類似數(shù)據(jù)庫),提供Key-Value式緩存服務(wù)枷颊。
簡單戳杀,是Redis突出的特色该面。
簡單可以保證核心功能的穩(wěn)定和優(yōu)異。
四信卡、Redis總結(jié)
redis單個key 存入512M大小
redis支持多種類型的數(shù)據(jù)結(jié)構(gòu)(string,list,hash.set.zset)
redis 是單線程 原子性
redis可以持久化 因為使用了 RDB和AOF機制
redis支持集群 而且redis 支持庫(0-15) 16個庫
redis 還可以做消息隊列 比如聊天室 IM
企業(yè)級開發(fā)中:可以用作數(shù)據(jù)庫隔缀、緩存(熱點數(shù)據(jù)(經(jīng)常會被查詢,但是不經(jīng)常被修改或者刪除的數(shù)據(jù))和消息中間件等大部分功能坐求。
優(yōu)點:
1. 豐富的數(shù)據(jù)結(jié)構(gòu)
2.高速讀寫蚕泽,redis使用自己實現(xiàn)的分離器,代碼量很短桥嗤,沒有使用lock(MySQL),因此效率非常高。
缺點:
- 持久化。Redis直接將數(shù)據(jù)存儲到內(nèi)存中赡盘,要將數(shù)據(jù)保存到磁盤上沃呢,Redis可以使用兩種方式實現(xiàn)持久化過程。定時快照(snapshot):每隔一段時間將整個數(shù)據(jù)庫寫到磁盤上丰歌,每次均是寫全部數(shù)據(jù),代價非常高。第二種方式基于語句追加(aof):只追蹤變化的數(shù)據(jù)锡宋,但是追加的log可能過大,同時所有的操作均重新執(zhí)行一遍特恬,回復(fù)速度慢执俩。
- 耗內(nèi)存,占用內(nèi)存過高癌刽。
五役首、Redis安裝
1、Windows安裝
https://jingyan.baidu.com/article/0f5fb099045b056d8334ea97.html
2显拜、Linux安裝
安裝Redis
官方網(wǎng)站:http://redis.io/
官方下載:http://redis.io/download 可以根據(jù)需要下載不同版本
(域名后綴io屬于國家域名衡奥,是british Indian Ocean territory,即英屬印度洋領(lǐng)地)
(1)远荠、Redis安裝
?? Redis是C語言開發(fā)矮固,安裝Redis需要先將官網(wǎng)下載的源碼進行編譯,編譯依賴gcc環(huán)境譬淳,如果沒有g(shù)cc環(huán)境档址,需要安裝gcc
(2)、安裝gcc
?? gcc的安裝很簡單瘦赫,首先要確保root登錄辰晕,其次就是Linux要能連外網(wǎng)
yum -y install gcc automake autoconf libtool make
注意:運行yum時出現(xiàn)/var/run/yum.pid已被鎖定,PID為xxxx的另一個程序正在運行的問題解決
rm -f /var/run/yum.pid
(3)、安裝Redis
命令1: wget http://download.redis.io/releases/redis-4.0.1.tar.gz
命令2:tar zxvf redis-4.0.1.tar.gz
命令3: cd redis-4.0.1
命令4(編譯): make 或 make MALLOC=libc 如下圖代表成功:
命令5:make PREFIX=/usr/local/redis install
(安裝編譯后的文件) 安裝到指目錄:
注意:PREFIX必須大寫确虱、同時會自動為我們創(chuàng)建redis目錄含友,并將結(jié)果安裝此目錄
命令6: cd /usr/local/redis 查看
命令7:查看bin目錄下,如圖:
六、Redis啟動
(1)窘问、啟動Redis服務(wù)
進入對應(yīng)的安裝目錄 /usr/local/redis
執(zhí)行命令: ./bin/redis-server
(2)辆童、啟動Redis客戶端
進入Redis客服端(Clone Session克隆一個窗口):
進入對應(yīng)的安裝目錄 cd /usr/local/redis
執(zhí)行命令: ./bin/redis-cli
啟動Redis 客戶端命令:
redis-cli –h IP地址 –p 端口
退出客戶端命令:Ctrl+C
??檢測是否服務(wù)端啟動
??啟動 redis 客戶端,打開終端并輸入命令 redis-cli惠赫。該命令會連接本地的 redis 服務(wù)把鉴。
$redis-cli
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING
PONG
?? 在以上實例中我們連接到本地的 redis 服務(wù)并執(zhí)行 PING 命令,該命令用于檢測 redis 服務(wù)是否啟動儿咱。
七庭砍、Linux配置Redis
?? Redis 的配置文件位于 Redis 安裝目錄下,文件名為 redis.conf(Windows 名為 redis.windows.conf)混埠。
1怠缸、配置Redis
?? Redis端口號或啟動有默認(rèn)配置。但一般我們都會通過手動配置完成
?? 回到根目錄找到解壓文件中的reids.conf
命令: cp redis.conf /usr/local/redis 將配置文件復(fù)制到安裝文件的目錄下
Redis配置至此全部完成
2钳宪、redis.conf 配置文件詳解
redis.conf 配置項說明如下:
1. Redis默認(rèn)不是以守護進程的方式運行揭北,可以通過該配置項修改,使用yes啟用守護進程
daemonize no
2. 當(dāng)Redis以守護進程方式運行時吏颖,Redis默認(rèn)會把pid寫入/var/run/redis.pid文件搔体,可以通過pidfile指定
pidfile /var/run/redis.pid
3. 指定Redis監(jiān)聽端口,默認(rèn)端口為6379半醉,為什么選用6379作為默認(rèn)端口疚俱,因為6379在手機按鍵上MERZ對應(yīng)的號碼,而MERZ取自意大利歌女Alessia Merz的名字
port 6379
4. 綁定的主機地址
bind 127.0.0.1
5.當(dāng) 客戶端閑置多長時間后關(guān)閉連接奉呛,如果指定為0计螺,表示關(guān)閉該功能
timeout 300
6. 指定日志記錄級別,Redis總共支持四個級別:debug瞧壮、verbose登馒、notice、warning咆槽,默認(rèn)為verbose
loglevel verbose
7. 日志記錄方式陈轿,默認(rèn)為標(biāo)準(zhǔn)輸出,如果配置Redis為守護進程方式運行秦忿,而這里又配置為日志記錄方式為標(biāo)準(zhǔn)輸出麦射,則日志將會發(fā)送給/dev/null
logfile stdout
8. 設(shè)置數(shù)據(jù)庫的數(shù)量,默認(rèn)數(shù)據(jù)庫為0灯谣,可以使用SELECT <dbid>命令在連接上指定數(shù)據(jù)庫id
databases 16
9. 指定在多長時間內(nèi)潜秋,有多少次更新操作,就將數(shù)據(jù)同步到數(shù)據(jù)文件胎许,可以多個條件配合
save <seconds> <changes>
Redis默認(rèn)配置文件中提供了三個條件:
save 900 1
save 300 10
save 60 10000
分別表示900秒(15分鐘)內(nèi)有1個更改峻呛,300秒(5分鐘)內(nèi)有10個更改以及60秒內(nèi)有10000個更改罗售。
10. 指定存儲至本地數(shù)據(jù)庫時是否壓縮數(shù)據(jù),默認(rèn)為yes钩述,Redis采用LZF壓縮寨躁,如果為了節(jié)省CPU時間,可以關(guān)閉該選項牙勘,但會導(dǎo)致數(shù)據(jù)庫文件變的巨大
rdbcompression yes
- 指定本地數(shù)據(jù)庫文件名职恳,默認(rèn)值為dump.rdb
dbfilename dump.rdb
12. 指定本地數(shù)據(jù)庫存放目錄
dir ./
13. 設(shè)置當(dāng)本機為slav服務(wù)時,設(shè)置master服務(wù)的IP地址及端口方面,在Redis啟動時放钦,它會自動從master進行數(shù)據(jù)同步
slaveof <masterip> <masterport>
14. 當(dāng)master服務(wù)設(shè)置了密碼保護時,slav服務(wù)連接master的密碼
masterauth <master-password>
15. 設(shè)置Redis連接密碼葡幸,如果配置了連接密碼最筒,客戶端在連接Redis時需要通過AUTH <password>命令提供密碼,默認(rèn)關(guān)閉
requirepass foobared
16. 設(shè)置同一時間最大客戶端連接數(shù)蔚叨,默認(rèn)無限制,Redis可以同時打開的客戶端連接數(shù)為Redis進程可以打開的最大文件描述符數(shù)辙培,如果設(shè)置 maxclients 0蔑水,表示不作限制。當(dāng)客戶端連接數(shù)到達限制時扬蕊,Redis會關(guān)閉新的連接并向客戶端返回max number of clients reached錯誤信息
maxclients 128
17. 指定Redis最大內(nèi)存限制搀别,Redis在啟動時會把數(shù)據(jù)加載到內(nèi)存中,達到最大內(nèi)存后尾抑,Redis會先嘗試清除已到期或即將到期的Key歇父,當(dāng)此方法處理 后,仍然到達最大內(nèi)存設(shè)置再愈,將無法再進行寫入操作榜苫,但仍然可以進行讀取操作。Redis新的vm機制翎冲,會把Key存放內(nèi)存垂睬,Value會存放在swap區(qū)
maxmemory <bytes>
18. 指定是否在每次更新操作后進行日志記錄,Redis在默認(rèn)情況下是異步的把數(shù)據(jù)寫入磁盤抗悍,如果不開啟驹饺,可能會在斷電時導(dǎo)致一段時間內(nèi)的數(shù)據(jù)丟失。因為 redis本身同步數(shù)據(jù)文件是按上面save條件來同步的缴渊,所以有的數(shù)據(jù)會在一段時間內(nèi)只存在于內(nèi)存中赏壹。>默認(rèn)為no
appendonly no
19. 指定更新日志文件名,默認(rèn)為appendonly.aof
appendfilename appendonly.aof
20. 指定更新日志條件衔沼,共有3個可選值: no:表示等操作系統(tǒng)進行數(shù)據(jù)緩存同步到磁盤(快) always:表示每次更新操作后手動調(diào)用fsync()將數(shù)據(jù)寫到磁盤(慢蝌借,安全) everysec:表示每秒同步一次(折中昔瞧,默認(rèn)值)
appendfsync everysec
21. 指定是否啟用虛擬內(nèi)存機制,默認(rèn)值為no骨望,簡單的介紹一下硬爆,VM機制將數(shù)據(jù)分頁存放,由Redis將訪問量較少的頁即冷數(shù)據(jù)swap到磁盤上擎鸠,訪問多的頁面由磁盤自動換出到內(nèi)存中(在后面的文章我會仔細(xì)分析Redis的VM機制)
vm-enabled no
22. 虛擬內(nèi)存文件路徑缀磕,默認(rèn)值為/tmp/redis.swap,不可多個Redis實例共享
vm-swap-file /tmp/redis.swap
23. 將所有大于vm-max-memory的數(shù)據(jù)存入虛擬內(nèi)存,無論vm-max-memory設(shè)置多小,所有索引數(shù)據(jù)都是內(nèi)存存儲的(Redis的索引數(shù)據(jù) 就是keys),也就是說,當(dāng)vm-max-memory設(shè)置為0的時候,其實是所有value都存在于磁盤劣光。默認(rèn)值為0
vm-max-memory 0
24. Redis swap文件分成了很多的page袜蚕,一個對象可以保存在多個page上面,但一個page上不能被多個對象共享绢涡,vm-page-size是要根據(jù)存儲的 數(shù)據(jù)大小來設(shè)定的牲剃,作者建議如果存儲很多小對象,page大小最好設(shè)置為32或者64bytes雄可;如果存儲很大大對象凿傅,則可以使用更大的page,如果不 確定数苫,就使用默認(rèn)值
vm-page-size 32
25. 設(shè)置swap文件中的page數(shù)量聪舒,由于頁表(一種表示頁面空閑或使用的bitmap)是在放在內(nèi)存中的,虐急,在磁盤上每8個pages將消耗1byte的內(nèi)存箱残。
vm-pages 134217728
26. 設(shè)置訪問swap文件的線程數(shù),最好不要超過機器的核數(shù),如果設(shè)置為0,那么所有對swap文件的操作都是串行的,可能會造成比較長時間的延遲止吁。默認(rèn)值為4
vm-max-threads 4
27. 設(shè)置在向客戶端應(yīng)答時被辑,是否把較小的包合并為一個包發(fā)送,默認(rèn)為開啟
glueoutputbuf yes
28. 指定在超過一定的數(shù)量或者最大的元素超過某一臨界值時敬惦,采用一種特殊的哈希算法
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
29. 指定是否激活重置哈希盼理,默認(rèn)為開啟(后面在介紹Redis的哈希算法時具體介紹)
activerehashing yes
30. 指定包含其它的配置文件,可以在同一主機上多個Redis實例之間使用同一份配置文件仁热,而同時各個實例又擁有自己的特定配置文件
include /path/to/local.conf
Redis中的內(nèi)存維護策略
redis作為優(yōu)秀的中間緩存件榜揖,時常會存儲大量的數(shù)據(jù),即使采取了集群部署來動態(tài)擴容抗蠢,也應(yīng)該即使的整理內(nèi)存举哟,維持系統(tǒng)性能。
在redis中有兩種解決方案迅矛,
一是為數(shù)據(jù)設(shè)置超時時間妨猩,
二是采用LRU算法動態(tài)將不用的數(shù)據(jù)刪除。內(nèi)存管理的一種頁面置換算法秽褒,對于在內(nèi)存中但又不用的數(shù)據(jù)塊(內(nèi)存塊)叫做LRU壶硅,操作系統(tǒng)會根據(jù)哪些數(shù)據(jù)屬于LRU而將其移出內(nèi)存而騰出空間來加載另外的數(shù)據(jù)威兜。
1.volatile-lru:設(shè)定超時時間的數(shù)據(jù)中,刪除最不常使用的數(shù)據(jù).
2.allkeys-lru:查詢所有的key中最近最不常使用的數(shù)據(jù)進行刪除,這是應(yīng)用最廣泛的策略.
3.volatile-random:在已經(jīng)設(shè)定了超時的數(shù)據(jù)中隨機刪除.
4.allkeys-random:查詢所有的key,之后隨機刪除.
5.volatile-ttl:查詢?nèi)吭O(shè)定超時時間的數(shù)據(jù),之后排序,將馬上將要過期的數(shù)據(jù)進行刪除操作.
6.noeviction:如果設(shè)置為該屬性,則不會進行刪除操作,如果內(nèi)存溢出則報錯返回.
- volatile-lfu:從所有配置了過期時間的鍵中驅(qū)逐使用頻率最少的鍵
- allkeys-lfu:從所有鍵中驅(qū)逐使用頻率最少的鍵
3庐椒、自定義配置Redis
(1)椒舵、進入對應(yīng)的安裝目錄 /usr/local/redis
修改 redis.conf 配置文件 vim redis.conf (進入命令模式 通過/內(nèi)容 查找相應(yīng)字符串)(2)、Redis配置默認(rèn)必須修改:
?? Redis采用的是單進程多線程的模式约谈。當(dāng)redis.conf中選項daemonize設(shè)置成yes時笔宿,代表開啟守護進程模式。在該模式下棱诱,redis會在后臺運行泼橘,并將進程pid號寫入至redis.conf選項pidfile設(shè)置的文件中,此時redis將一直運行迈勋,除非手動kill該進程炬灭。但當(dāng)daemonize選項設(shè)置成no時,當(dāng)前界面將進入redis的命令行界面靡菇,exit強制退出或者關(guān)閉連接工具(putty,xshell等)都會導(dǎo)致redis進程退出重归。
服務(wù)端開發(fā)的大部分應(yīng)用都是采用后臺運行的模式 。
八厦凤、Redis啟動
1提前、服務(wù)端啟動
./bin/redis-server ./redis.conf
2、客戶端啟動
? 本地客戶端登錄
用redis-cli 密碼登陸(redis-cli -a password)
3泳唠、遠(yuǎn)程服務(wù)上執(zhí)行命令
如果需要在遠(yuǎn)程 redis 服務(wù)上執(zhí)行命令,同樣我們使用的也是 redis-cli 命令宙搬。
語法:
redis-cli -h host -p port -a password
redis-cli –h IP地址 –p 端口 –a 密碼
九笨腥、Redis關(guān)閉
第一種關(guān)閉方式:(斷電、非正常關(guān)閉勇垛。容易數(shù)據(jù)丟失)
查詢PID ps -ef | grep -i redis
kill -9 PID
第二種關(guān)閉方式(正常關(guān)閉脖母、數(shù)據(jù)保存)
./bin/redis-cli shutdown 關(guān)閉redis服務(wù),通過客戶端進行shutdown
如果redis設(shè)置了密碼闲孤,需要先在客戶端通過密碼登錄谆级,再進行shutdown即可關(guān)閉服務(wù)端