Redis-01Redis概述
文章目錄
- 思維導(dǎo)圖
- Redis概述
- Redis的版本
- Redis的部分應(yīng)用場(chǎng)景
- 緩存
- 高速讀/寫(xiě)
- 安裝 Redis
- Windows下安裝Redis
- linux下安裝Redis
- 數(shù)據(jù)類(lèi)型
- 在線網(wǎng)站
思維導(dǎo)圖
Redis概述
在傳統(tǒng)的 Java Web 項(xiàng)目中, 使用數(shù)據(jù)庫(kù)進(jìn)行存儲(chǔ)數(shù)據(jù),弊端主要來(lái)自于性能方面。由于數(shù)據(jù)庫(kù)持久化數(shù)據(jù)主要是面向磁盤(pán),而磁盤(pán)的讀/寫(xiě)比較慢.
如果不存在高并發(fā),因此往往沒(méi)有瞬間需要讀/寫(xiě)大量數(shù)據(jù)的要求,這 個(gè)時(shí)候使用數(shù)據(jù)庫(kù)進(jìn)行讀/寫(xiě)是沒(méi)有太大的問(wèn)題的,
在互聯(lián)網(wǎng)中,往往存在大數(shù)據(jù)量的 需求 ,比如一些商品搶購(gòu)的場(chǎng)景,或者是主頁(yè)訪問(wèn)量瞬間較大的時(shí)候, 一瞬間成千上萬(wàn)的 請(qǐng)求就會(huì)到來(lái) ,需要系統(tǒng)在極短的時(shí)間內(nèi)完成成千上萬(wàn)次的讀/寫(xiě)操作,這個(gè)時(shí)候往往不是 數(shù)據(jù)庫(kù)能夠承受的,極其容易造成數(shù)據(jù)庫(kù)系統(tǒng)癱瘓,最終導(dǎo)致服務(wù)巖機(jī)的嚴(yán)重生產(chǎn)問(wèn)題。
為了克服這些問(wèn)題, Java Web 項(xiàng)目往往就引入了 NoSQL 技術(shù), NoSQL 工具也是一種簡(jiǎn)易的數(shù)據(jù)庫(kù),它主要是一種基于內(nèi)存的數(shù)據(jù)庫(kù),并提供一定的持久化功能。Redis 和MongoDB 是當(dāng)前使用最廣泛的 NoSQL。 我們這里來(lái)探討Redis 。
Redis可以支持每秒十幾萬(wàn)次的讀/寫(xiě)操作,其性能遠(yuǎn)超數(shù)據(jù)庫(kù),并且支持集群、 分布式、 主從同步等配置,原則上可以無(wú)限擴(kuò)展,讓更多的數(shù)據(jù)存儲(chǔ)在內(nèi)存中,還能支持一定的事務(wù)能力,這在高并發(fā)訪問(wèn)的場(chǎng)景下保證數(shù)據(jù)安全和一致性非常重要。
#Redis的優(yōu)點(diǎn)
基于 ANSI C 語(yǔ)言編寫(xiě)的,接近于匯編語(yǔ)言的機(jī)器語(yǔ)言,運(yùn)行十分快速
基于于內(nèi)存的讀/寫(xiě),速度自然比數(shù)據(jù)庫(kù)的磁盤(pán)讀/寫(xiě)要快得多
數(shù)據(jù)庫(kù)結(jié)構(gòu)只有 6 種數(shù)據(jù)類(lèi)型,數(shù)據(jù)結(jié)構(gòu)比較簡(jiǎn)單,因此規(guī)則較少,而數(shù)據(jù)庫(kù)則是范式,完整性、規(guī)范性需要考慮的規(guī)則比較多,處理業(yè)務(wù)會(huì)比較復(fù)雜
Redis的版本
Redis借鑒了Linux操作系統(tǒng)對(duì)于版本號(hào)的命名規(guī)則: 版本號(hào)第二位如果是奇數(shù), 則為非穩(wěn)定版本(例如2.7、 2.9、 3.1) , 如果是偶數(shù), 則為穩(wěn)定版本(例如2.6、 2.8、 3.0、 3.2、4.0) 。
Redis的部分應(yīng)用場(chǎng)景
- 緩存 : 合理地使用緩存不僅可以加快數(shù)據(jù)的訪問(wèn)速度, 而且能夠有效地降低后端數(shù)據(jù)源的壓力,同時(shí) Redis提供了鍵值過(guò)期時(shí)間設(shè)置, 并且也提供了靈活控制最大內(nèi)存和內(nèi)存溢出后的淘汰策略。
- 高速讀/寫(xiě)的場(chǎng)合使用它快速讀/寫(xiě): 比如一些需要進(jìn)行商品搶購(gòu)和搶紅包的場(chǎng)合,把這些需要高速讀/寫(xiě)的數(shù)據(jù) , 緩存到 Redis 中,而在滿足一定的條件下,觸發(fā)這些緩存的數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)中
- 排行榜系統(tǒng): 按照熱度排名的排行榜, 按照發(fā)布時(shí)間的排行榜, 按照各種復(fù)雜維度計(jì)算出的排行榜, Redis提供了列表和有序集合數(shù)據(jù)結(jié)構(gòu), 合理地使用這些數(shù)據(jù)結(jié)構(gòu)可以很方便地構(gòu)建各種排行榜系統(tǒng)
- 計(jì)數(shù)器應(yīng)用:視頻網(wǎng)站有播放數(shù)、 電商網(wǎng)站有瀏覽數(shù), 為了保證數(shù)據(jù)的實(shí)時(shí)性, 每一次播放和瀏覽都要做加1的操作,Redis天然支持計(jì)數(shù)功能而且計(jì)數(shù)的性能也非常好
- 社交網(wǎng)絡(luò):贊/踩、 粉絲、 共同好友/喜好、 推送、,Redis提供的數(shù)據(jù)結(jié)構(gòu)可以相對(duì)比較容易地實(shí)現(xiàn)這些功能
- 消息隊(duì)列系統(tǒng): Redis提供了發(fā)布訂閱功能和阻塞隊(duì)列的功能, 雖然和專(zhuān)業(yè)的消息隊(duì)列比還不夠足夠強(qiáng)大, 但是對(duì)于一般的消息隊(duì)列功能基本可以滿足
緩存
一般而言在使用Redis 存儲(chǔ)的時(shí)候,需要從 3 個(gè)方面進(jìn)行考慮。
業(yè)務(wù)數(shù)據(jù)常用嗎?命中率如何?如果命中率很低,就沒(méi)有必要寫(xiě)入緩存。
該業(yè)務(wù)數(shù)據(jù)是讀操作多,還是寫(xiě)操作多 ,如果寫(xiě)操作多 ,頻繁需要寫(xiě)入數(shù)據(jù)庫(kù) ,也沒(méi)有必要使用緩存。
業(yè)務(wù)數(shù)據(jù)大小如何?如果要存儲(chǔ)幾百兆字節(jié)的文件,會(huì)給緩存帶來(lái)很大的壓力,有沒(méi)有必要?
在考慮過(guò)這些問(wèn)題后,如果覺(jué)得有必要使用緩存,那么就使用它 。使用 Redis 作為緩 存的讀取邏輯如下:
-
當(dāng)?shù)谝淮巫x取數(shù)據(jù)的時(shí)候,讀取 Redis 的數(shù)據(jù)就會(huì)失敗,此時(shí)會(huì)觸發(fā)程序讀取數(shù)據(jù)庫(kù),把數(shù)據(jù)讀取出來(lái),并且寫(xiě)入 Redis 。
-
當(dāng)?shù)诙渭耙院笞x取數(shù)據(jù)時(shí),就直接讀取 Redis , 讀到數(shù)據(jù)后就結(jié)束了流程,速度就大大提高 。
從上面的分析可知,大部分的操作是讀操作,使用 Redis 應(yīng)對(duì)讀操作,速度就會(huì)十分迅速,同時(shí)也降低了對(duì)數(shù)據(jù)庫(kù)的依賴, 大大降低了數(shù)據(jù)庫(kù)的負(fù)擔(dān)。
分析了讀操作的邏輯后,下面再來(lái)分析寫(xiě)操作的流程,
從上面的流程可以看出,更新或者寫(xiě)入的操作,需要多個(gè) Redis 的操作 。 如果業(yè)務(wù)數(shù)據(jù)寫(xiě)次數(shù)遠(yuǎn)大于讀次數(shù)沒(méi)有必要使用 Redis。如果是讀次數(shù)遠(yuǎn)大于寫(xiě)次數(shù), 則使用 Redis 就有其價(jià)值了,因?yàn)閷?xiě)入 Redis 雖然要消耗一定的代價(jià),但是其性能良好,相對(duì)數(shù)據(jù)庫(kù)而言,幾乎可以忽略不計(jì) 。
高速讀/寫(xiě)
在互聯(lián)網(wǎng)的應(yīng)用中,往往存在一些需要高速讀/寫(xiě)的場(chǎng)合,比如商品的秒殺,搶紅包,淘寶、京東的雙十一活動(dòng)或者春運(yùn)搶票等。這類(lèi)場(chǎng)合在一個(gè)瞬間成千上萬(wàn)的請(qǐng)求就會(huì)達(dá)到服務(wù)器,如果使用的是數(shù)據(jù)庫(kù), 一個(gè)瞬間數(shù)據(jù)庫(kù)就需要執(zhí)行成千上萬(wàn)的 SQL,很容易造成數(shù)據(jù)庫(kù)的瓶頸,嚴(yán)重的會(huì)導(dǎo)致數(shù)據(jù)庫(kù)癱瘓,造成 Java Web 系統(tǒng)服務(wù)崩潰。
在這樣的場(chǎng)合的應(yīng)對(duì)辦法往往是考慮異步寫(xiě)入數(shù)據(jù)庫(kù),而在高速讀/寫(xiě)的場(chǎng)合中單單使用 Redis 去應(yīng)對(duì), 把這些需要高速讀/寫(xiě)的數(shù)據(jù) , 緩存到 Redis 中,而在滿足一定的條件下,觸發(fā)這些緩存的數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)中.
先看看一次請(qǐng)求操作的流程圖 如下:
當(dāng)一個(gè)請(qǐng)求達(dá)到服務(wù)器,只是把業(yè)務(wù)數(shù)據(jù)先在 Redi s 讀/寫(xiě),而沒(méi)有進(jìn)行任何對(duì)數(shù)據(jù)庫(kù)的操作,換句話說(shuō)系統(tǒng)僅僅是操作 Redis 緩存,而沒(méi)有操作數(shù)據(jù)庫(kù),這個(gè)速度就比操作數(shù)據(jù)庫(kù)要快得多,從而達(dá)到需要高速響應(yīng)的效果。
但是一般緩存不能持久化,或者所持久化的數(shù)據(jù)不太規(guī)范,因此需要把這些數(shù)據(jù)存入數(shù)據(jù)庫(kù) ,所以在一個(gè)請(qǐng)求操作完 Redis 的讀/寫(xiě)后,會(huì)去判斷該高速讀/寫(xiě)的業(yè)務(wù)是否結(jié)束。這個(gè)判斷的條件往往就是秒殺商 品剩余個(gè)數(shù)為 0,搶紅包金額為 0,如果不成立,則不會(huì)操作數(shù)據(jù)庫(kù);如果成立,則觸發(fā)事件將 Redis 緩存的數(shù)據(jù)以批量的形式一次性寫(xiě)入數(shù)據(jù)庫(kù),從而完成持久化的工作。
假設(shè)面對(duì)的是一個(gè)商品秒殺的場(chǎng)景,從上面的流程看, 一個(gè)用戶搶購(gòu)商品,絕大部分的場(chǎng)合都是在操作內(nèi)存數(shù)據(jù)庫(kù) Redis , 而不是磁盤(pán)數(shù)據(jù)庫(kù),所以其性能更為優(yōu)越。只有在商品被搶購(gòu)一空后才會(huì)觸發(fā)系統(tǒng)把 Redis 緩存的數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)磁盤(pán)中 , 這樣系統(tǒng)大部分的操作基于內(nèi)存,就能夠在秒殺的場(chǎng)合高速響應(yīng)用戶的請(qǐng)求,達(dá)到快速應(yīng)答。
而現(xiàn)實(shí)中這種需要高速響應(yīng)的系統(tǒng)會(huì)比上面的分析更復(fù)雜 , 因?yàn)?*這里沒(méi)有討論高并發(fā)下的數(shù)據(jù)安全和一致性問(wèn)題,沒(méi)有討論有效請(qǐng)求和無(wú)效請(qǐng)求 、 事務(wù)一致性等諸多問(wèn)題**,這些后續(xù)獨(dú)立討論它 。
安裝 Redis
Windows下安裝Redis
請(qǐng)參考 實(shí)戰(zhàn)SSM_O2O商鋪_45【Redis緩存】配置Redis在Service層加入緩存
linux下安裝Redis
Redis-02Redis在linux下的安裝及常見(jiàn)問(wèn)題
數(shù)據(jù)類(lèi)型
Redis 是 一種基于內(nèi)存的數(shù)據(jù)庫(kù),并且提供 一定 的 持 久化功能,它 是一 種 鍵值( key-value )數(shù)據(jù)庫(kù),使用 key 作為索引找到 當(dāng)前緩存的數(shù)據(jù), 并且返回給程序調(diào)用 者。
當(dāng)前的 Redis (redis3.0)支持 6 種數(shù)據(jù)類(lèi)型,它們分別是字符串( String ) 、列表( List)、集合( set )、哈希結(jié)構(gòu)( hash )、有序集合( zset)和基數(shù)( HyperLogLog )
| STRING (字符串) | 可以是保存字符串、整數(shù)和浮點(diǎn)數(shù) | 可以對(duì)字符串進(jìn)行操作 ,比如增加字符或在子串,如果是整數(shù)或者浮點(diǎn)數(shù) , 可以實(shí)現(xiàn)計(jì)算,比如自增等 |
| LIST ( 列表) | 它是一個(gè)鏈表,它 的每一個(gè)節(jié)點(diǎn)都包 含一個(gè)字符串 | Redis支持從鏈表的兩端插入或者彈出節(jié)點(diǎn),或在通過(guò)偏移對(duì)它進(jìn)行裁剪;還可以讀取一個(gè)或者多個(gè)節(jié)點(diǎn), 根據(jù)條件刪除或者查找節(jié)點(diǎn)等 |
| SET (集合) | 它是一個(gè)收集器,但是是無(wú)序的,在它里面每一個(gè)元素都是一個(gè)字符串,而且是獨(dú)一無(wú)二 , 各不相同的 | 可以新增、讀取、刪除單個(gè)元素 ; 檢測(cè)一個(gè)元索是否在集合中,計(jì)算它和1其他集合的交集并集和差集等;隨機(jī)從集合中讀取元素 |
| HASH ( 哈希散列表) | 它類(lèi)似于 Java 語(yǔ)言中的 Map,是一個(gè)鍵值對(duì)應(yīng)的無(wú)序列表 | 可以附、刪 、 查、改單個(gè)鍵值對(duì), 也可以獲取所有的鍵值對(duì) |
| ZSET (有序集合〉 | 它是一個(gè)有序的集合 , 可以包含字符串、整數(shù)、浮點(diǎn)數(shù)、分值( score ) , 元素的排序是依據(jù)分值的大小來(lái)決定的 | 可以地、刪、查、改元素,根據(jù)分值的泡因或者成員來(lái)獲取對(duì)應(yīng)的元素 |
| HyperLogLog (基數(shù)) | 它的作用是計(jì)算主復(fù)的值, 以確定存儲(chǔ)的數(shù)量 | 只提供基數(shù)的運(yùn)算,不提供返回的功能 |
如上表格粗略描述了 Redis 的 6 種數(shù)據(jù)類(lèi)型 , 并簡(jiǎn)要說(shuō)明了它們的作用,后面還會(huì)詳細(xì)介紹它們的數(shù)據(jù)結(jié)構(gòu)和常用 Redis 命令 。
此外, Red is 還支持一些事務(wù) 、 發(fā)布訂閱消息模式、 主從復(fù)制、持久化等。
在線網(wǎng)站
http://try.redis.io/
總結(jié)
以上是生活随笔為你收集整理的Redis-01Redis概述的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 实战SSM_O2O商铺_48【用户登录】
- 下一篇: Redis-04Redis数据结构--哈