[TOC]
一立轧、Redis介紹
redis是一種基于鍵值對(key-value)數(shù)據(jù)庫,其中value可以為string草姻、hash钓猬、list、set撩独、zset等多種數(shù)據(jù)結(jié)構(gòu)敞曹,可以滿足很多應(yīng)用場景账月。還提供了鍵過期,發(fā)布訂閱澳迫,事務(wù)局齿,流水線,等附加功能
二橄登、Redis特性
- 1 速度快
- 2 鍵值對的數(shù)據(jù)結(jié)構(gòu)服務(wù)器
- 3 豐富的功能
- 4 簡單穩(wěn)定
- 5 持久化
- 6 主從復(fù)制
- 8 高可用和分布式轉(zhuǎn)移
- 9 客戶端語言多
三项炼、使用場景
- 1 緩存數(shù)據(jù)庫
- 2 排行榜
- 3 計數(shù)器應(yīng)用
- 4 社交網(wǎng)絡(luò)
- 5 消息隊列
四、數(shù)據(jù)類型
1.String
字符串類型是redis最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)示绊,首先鍵是字符串類型,而且其他幾種結(jié)構(gòu)都是在字符串類型基礎(chǔ)上構(gòu)建的暂论,所以字符串類型能為其他四種數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)尊定基礎(chǔ)面褐。
字符串類型實際上可以是字符串(簡單的字符串、復(fù)雜的字符串(xml取胎、json)展哭、數(shù)字(整數(shù)、浮點數(shù))闻蛀、二進(jìn)制(圖片匪傍、音頻、視頻))觉痛,但最大不能超過512M役衡。
- 使用實例:
redis 127.0.0.1:6379> SET name "runoob"
OK
redis 127.0.0.1:6379> GET name
"runoob"
- 使用場景:
緩存功能:字符串最經(jīng)典的使用場景,redis最為緩存層薪棒,Mysql作為儲存層手蝎,絕大部分請求數(shù)據(jù)都是 redis中獲取,由于redis具有支撐高并發(fā)特性俐芯,所以緩存通常能起到加速讀寫和降低 后端壓力的作用棵介。
計數(shù)器:許多運用都會使用redis作為計數(shù)的基礎(chǔ)工具,他可以實現(xiàn)快速計數(shù)吧史、查詢緩存的功能邮辽, 同時數(shù)據(jù)可以一步落地到其他的數(shù)據(jù)源。如:視頻播放數(shù)系統(tǒng)就是使用redis作為視頻播放數(shù)計數(shù)的基礎(chǔ)組件贸营。
共享session:出于負(fù)載均衡的考慮吨述,分布式服務(wù)會將用戶信息的訪問均衡到不同服務(wù)器上,
用戶刷新一次訪問可能會需要重新登錄莽使,為避免這個問題可以用redis將用戶session集中管理锐极,
在這種模式下只要保證redis的高可用和擴(kuò)展性的,每次獲取用戶更新或查詢登錄信息都直接從redis中集中獲取芳肌。
限速:處于安全考慮灵再,每次進(jìn)行登錄時讓用戶輸入手機(jī)驗證碼肋层,為了短信接口不被頻繁訪問,會限制用戶每分鐘獲取驗證碼的頻率。
2.Hash(哈希)
在redis中哈希類型是指鍵本身又是一種鍵值對結(jié)構(gòu)翎迁,如value={{field1,value1},......{fieldN,valueN}} 栋猖。
Redis hash 是一個鍵值(key=>value)對集合。
Redis hash 是一個 string 類型的 field 和 value 的映射表汪榔,hash 特別適合用于存儲對象蒲拉。
每個 hash 可以存儲 232 -1 鍵值對(40多億)
- 使用實例
redis> HMSET myhash field1 "Hello" field2 "World"
"OK"
redis> HGET myhash field1
"Hello"
redis> HGET myhash field2
"World"
- 使用場景
哈希結(jié)構(gòu)相對于字符串序列化緩存信息更加直觀,并且在更新操作上更加便捷痴腌。所以常常用于用戶信息等管理雌团,但是哈希類型和關(guān)系型數(shù)據(jù)庫有所不同,哈希類型是稀疏的士聪,而關(guān)系型數(shù)據(jù)庫是完全結(jié)構(gòu)化的锦援,關(guān)系型數(shù)據(jù)庫可以做復(fù)雜的關(guān)系查詢,而redis去模擬關(guān)系型復(fù)雜查詢剥悟,開發(fā)困難灵寺,維護(hù)成本高。
3.List(列表)
列表類型是用來儲存多個有序的字符串区岗,列表中的每個字符串成為元素(element),一個列表最多可以儲存
2的32次方-1個元素略板,在redis中,可以隊列表兩端插入(pubsh)和彈出(pop)慈缔,還可以獲取指定范圍的元素列表叮称、獲取指定索引下表的元素等,列表是一種比較靈活的數(shù)據(jù)結(jié)構(gòu)藐鹤,它可以充當(dāng)棧和隊列的角色颅拦,實際開發(fā)中有很多應(yīng)用場景。
列表最多可存儲 232 - 1 元素 (4294967295, 每個列表可存儲40多億)教藻。
- 使用實例:
redis 127.0.0.1:6379> lpush runoob redis
(integer) 1
redis 127.0.0.1:6379> lpush runoob mongodb
(integer) 2
redis 127.0.0.1:6379> lpush runoob rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange runoob 0 10
1) "rabitmq"
2) "mongodb"
3) "redis"
redis 127.0.0.1:6379>
- 使用場景
消息對列: redis的lpush+brpop命令組合即可實現(xiàn)阻塞隊列距帅,生產(chǎn)者客戶端是用lupsh從列表左側(cè)插入元素,多個消費者客戶端使用brpop命令阻塞時的“搶”列表尾部的元素括堤,多個客戶端保證了消費的負(fù)載均衡和高可用性
文章列表:每個用戶都有屬于自己的文章列表碌秸,現(xiàn)在需要分頁展示文章列表,此時可以考慮使用列表悄窃,列表不但有序讥电,同時支持按照索引范圍獲取元素。
使用技巧:
- lpush+lpop=Stack(棧)
- lpush+rpop=Queue(隊列)
- lpush+ltrim=Capped Collection(有限集合)
- lpush+brpop=Message Queue(消息隊列)
4.Set (集合)
集合類型也是用來保存多個字符串的元素轧抗,但和列表不同的是集合中不允許有重復(fù)的元素恩敌,并且集合中的元素是無序的,不能通過索引下標(biāo)獲取元素横媚,redis除了支持集合內(nèi)的增刪改查纠炮,同時還支持多個集合取交集月趟、并集、差集恢口,并合理的使用好集合類型孝宗,能在實際開發(fā)中解決很多實際問題。
集合是通過哈希表實現(xiàn)的耕肩,所以添加因妇,刪除,查找的復(fù)雜度都是O(1)猿诸。
集合中最大的成員數(shù)為 232 - 1(4294967295, 每個集合可存儲40多億個成員)婚被。
- 使用實例:
redis 127.0.0.1:6379> sadd runoob redis
(integer) 1
redis 127.0.0.1:6379> sadd runoob mongodb
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers runoob
1) "redis"
2) "rabitmq"
3) "mongodb"
- 使用場景
標(biāo)簽(tag):集合類型比較典型的使用場景,如一個用戶對娛樂梳虽、體育比較感興趣摔寨,另一個可能對新聞感興 趣,這些興趣就是標(biāo)簽怖辆,有了這些數(shù)據(jù)就可以得到同一標(biāo)簽的人,以及用戶的共同愛好的標(biāo)簽删顶,這些數(shù)據(jù)對于用戶體驗以及曾強(qiáng)用戶粘度比較重要竖螃。(用戶和標(biāo)簽的關(guān)系維護(hù)應(yīng)該放在一個事物內(nèi)執(zhí)行,防止部分命令失敗造成數(shù)據(jù)不一致)
其他
sadd=tagging(標(biāo)簽)
spop/srandmember=random item(生成隨機(jī)數(shù)逗余,比如抽獎)
sadd+sinter=social Graph(社交需求)
5.Zset(sorted set:有序集合)
有序集合和集合有著必然的聯(lián)系特咆,他保留了集合不能有重復(fù)成員的特性,但不同得是录粱,有序集合中的元素是可以排序的腻格,但是它和列表的使用索引下標(biāo)作為排序依據(jù)不同的是,它給每個元素設(shè)置一個分?jǐn)?shù)啥繁,作為排序的依據(jù)菜职。(有序集合中的元素不可以重復(fù),但是csore可以重復(fù)旗闽,就和一個班里的同學(xué)學(xué)號不能重復(fù)酬核,但考試成績可以相同)。
- 使用實例
redis 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> > ZRANGEBYSCORE runoob 0 1000
1) "mongodb"
2) "rabitmq"
3) "redis"
- 使用場景
排行榜:有序集合經(jīng)典使用場景适室。例如視頻網(wǎng)站需要對用戶上傳的視頻做排行榜嫡意,榜單維護(hù)可能是多方面:按照時間、按照播放量捣辆、按照獲得的贊數(shù)等蔬螟。
- 不同類型比較
五、發(fā)布與訂閱功能
redis提供了“發(fā)布汽畴、訂閱”模式的消息機(jī)制旧巾,其中消息訂閱者與發(fā)布者不直接通信耸序,發(fā)布者向指定的頻道(channel)發(fā)布消息,訂閱該頻道的每個客戶端都可以接收到消息菠齿。
redis主要提供發(fā)布消息佑吝、訂閱頻道、取消訂閱以及按照模式訂閱和取消訂閱绳匀。
1.發(fā)布與訂閱命令
- 發(fā)布消息
publish channel:test "hello world
- 訂閱消息
subscrible channel:test
- 查看訂閱數(shù)
pubsub numsub channel:test
- 取消訂閱
unsubscribe channel:test
- 按模式訂閱和按模式取消訂閱
psubscribe ch*
punsubscribe ch*
2.使用場景
- 1芋忿、今日頭條訂閱號、微信訂閱公眾號疾棵、新浪微博關(guān)注戈钢、郵件訂閱系統(tǒng)
- 2、即使通信系統(tǒng)
- 3是尔、群聊部落系統(tǒng)(微信群)
六殉了、 Redis持久化
redis是一個支持持久化的內(nèi)存數(shù)據(jù)庫,也就是說redis需要經(jīng)常將內(nèi)存中的數(shù)據(jù)同步到磁盤來保證持久化,持久化可以避免因進(jìn)程退出而造成數(shù)據(jù)丟失拟枚。
1.持久化方式
RDB持久化把當(dāng)前進(jìn)程數(shù)據(jù)生成快照(.rdb)文件保存到硬盤的過程薪铜,有手動觸發(fā)和自動觸發(fā)。
- 手動觸發(fā)
save命令:阻塞當(dāng)前Redis恩溅,直到RDB持久化過程完成為止隔箍,若內(nèi)存實例比較大會造成長時間阻塞,線上環(huán)境不建議用它.
bgsave命令:redis進(jìn)程執(zhí)行fork操作創(chuàng)建子線程脚乡,由子線程完成持久化蜒滩,阻塞時間很短(微秒級),是save的優(yōu)化,在執(zhí)行redis-cli shutdown關(guān)閉redis服務(wù)時奶稠,如果沒有開啟AOF持久化俯艰,自動執(zhí)行bgsave
- 自動觸發(fā)
針對RDB不適合實時持久化,redis提供了AOF持久化方式來解決 開啟:redis.conf設(shè)置:appendonly yes (默認(rèn)不開啟锌订,為no) 默認(rèn)文件名:appendfilename "appendonly.aof"
2.bgSave 運行流程
運行流程示意圖如下:
3.RDB文件的操作
- 設(shè)置RDB的文件保存路徑
config set dir /usr/local # 將dump.rd 保存到/usr/local/目錄下
- 開始持久化數(shù)據(jù)
bgsave
- 恢復(fù)數(shù)據(jù)
將dump.rdb放到redis安裝目錄與redis.conf同級目錄竹握,重啟redis即可
優(yōu)點:
1.壓縮后的二進(jìn)制文,適用于備份辆飘、全量復(fù)制涩搓,用于災(zāi)難恢復(fù)
2.載RDB恢復(fù)數(shù)據(jù)遠(yuǎn)快于AOF方式
缺點:
1.無法做到實時持久化,每次都要創(chuàng)建子進(jìn)程劈猪,頻繁操作成本過高
2.保存后的二進(jìn)制文件昧甘,存在老版本不兼容新版本rdb文件的問題.
4.AOF持久化
針對RDB不適合實時持久化,redis提供了AOF持久化方式來解決
- 開始持久化
redis.conf設(shè)置:appendonly yes (默認(rèn)不開啟战得,為no) <Br>
默認(rèn)文件名:appendfilename "appendonly.aof"
- AOF持久化流程
1.所有的寫入命令(set hset)會append追加到aof_buf緩沖區(qū)中
2.AOF緩沖區(qū)向硬盤做sync同步
3.隨著AOF文件越來越大充边,需定期對AOF文件rewrite重寫,達(dá)到壓縮
4.當(dāng)redis服務(wù)重啟,可load加載AOF文件進(jìn)行恢復(fù)
命令寫入(append), 文件同步(sync), 文件重寫(rewrite), 重啟加載(load)
- AOF配置參數(shù)詳解
appendonly yes //啟用aof持久化方式
#appendfsync always //每收到寫命令就立即強(qiáng)制寫入磁盤浇冰,最慢的贬媒,但是保證完全的持久化,不推薦使用
appendfsync everysec //每秒強(qiáng)制寫入磁盤一次肘习,性能和持久化方面做了折中际乘,推薦
#appendfsync no //完全依賴os,性能最好,持久化沒保證(操作系統(tǒng)自身的同步)
no-appendfsync-on-rewrite yes //正在導(dǎo)出rdb快照的過程中,要不要停止同步aof
auto-aof-rewrite-percentage 100 //aof文件大小比起上次重寫時的大小,增長率100%時,重寫
auto-aof-rewrite-min-size 64mb //aof文件,至少超過64M時,重寫
- AOF恢復(fù)
1.設(shè)置appendonly yes
2.將appendonly.aof放到dir參數(shù)指定的目錄
3.啟動Redis漂佩,Redis會自動加載appendonly.aof文件
- AOF與RDB的加載順序
1.當(dāng)AOF和RDB文件同時存在時脖含,優(yōu)先加載AOF
2.若關(guān)閉了AOF,加載RDB文件
3.加載AOF/RDB成功投蝉,redis重啟成功<Br>
4.AOF/RDB存在錯誤养葵,啟動失敗打印錯誤信息
AOF與RDB加載順序