Redis內(nèi)存數(shù)據(jù)庫筆記

[TOC]

一立轧、Redis介紹

redis是一種基于鍵值對(key-value)數(shù)據(jù)庫,其中value可以為string草姻、hash钓猬、list、set撩独、zset等多種數(shù)據(jù)結(jié)構(gòu)敞曹,可以滿足很多應(yīng)用場景账月。還提供了鍵過期,發(fā)布訂閱澳迫,事務(wù)局齿,流水線,等附加功能


redis

二橄登、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ā)布消息,訂閱該頻道的每個客戶端都可以接收到消息菠齿。

發(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 運行流程

運行流程示意圖如下:


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ù)


AOF持久化流程

命令寫入(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加載順序

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瘩缆,隨后出現(xiàn)的幾起案子关拒,更是在濱河造成了極大的恐慌,老刑警劉巖庸娱,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件着绊,死亡現(xiàn)場離奇詭異,居然都是意外死亡熟尉,警方通過查閱死者的電腦和手機(jī)归露,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臣樱,“玉大人,你說我怎么就攤上這事腮考」秃粒” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵踩蔚,是天一觀的道長棚放。 經(jīng)常有香客問我,道長馅闽,這世上最難降的妖魔是什么飘蚯? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮福也,結(jié)果婚禮上局骤,老公的妹妹穿的比我還像新娘。我一直安慰自己暴凑,他們只是感情好峦甩,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般凯傲。 火紅的嫁衣襯著肌膚如雪犬辰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天冰单,我揣著相機(jī)與錄音幌缝,去河邊找鬼。 笑死诫欠,一個胖子當(dāng)著我的面吹牛涵卵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呕诉,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼缘厢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了甩挫?” 一聲冷哼從身側(cè)響起贴硫,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎伊者,沒想到半個月后英遭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡亦渗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年挖诸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片法精。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡多律,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搂蜓,到底是詐尸還是另有隱情狼荞,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布帮碰,位于F島的核電站相味,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏殉挽。R本人自食惡果不足惜丰涉,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望斯碌。 院中可真熱鬧一死,春花似錦、人聲如沸傻唾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至逛裤,卻和暖如春瘩绒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背带族。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工锁荔, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝙砌。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓阳堕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親择克。 傳聞我的和親對象是個殘疾皇子恬总,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容