{eval=Array;=+count(Array);}
想要了解Redis,先從Redis是什么?為何要用Redis?有哪些特性,以及其集群架構(gòu)來幾個(gè)方面來了解。
Redis 特征
redis就是個(gè)緩存數(shù)據(jù)庫(kù),存儲(chǔ)一些熱點(diǎn)數(shù)據(jù),提高訪問速度,提高并發(fā)量,也可以做分布式鎖,分布式session等,具體參照官網(wǎng)介紹
簡(jiǎn)單的介紹下,也是一種數(shù)據(jù)庫(kù),只是與關(guān)系型數(shù)據(jù)庫(kù)不同(oracle、mysql等)的是,它是將數(shù)據(jù)存儲(chǔ)到內(nèi)存里面,也就是當(dāng)服務(wù)器或者說項(xiàng)目,宕機(jī)了的情況下,會(huì)大幾率會(huì)丟失數(shù)據(jù)(不過redis有快照和備份的功能,可以減低風(fēng)險(xiǎn))。
樓主目前學(xué)習(xí)到了框架,等到了學(xué)習(xí)集成不同框架的時(shí)候,可以集成redis框架進(jìn)行數(shù)據(jù)讀寫來試試看哦。
更詳細(xì)的可以看這個(gè)博文,描述的很詳細(xì)呢(http://www.cnblogs.com/qunshu/p/3196972.html)
——沒事待在家里不出門的 居家程序員。(我不想脫發(fā)!)
作者:我沒有三顆心臟Redis 概述
在我們?nèi)粘5腏ava Web開發(fā)中,無不都是使用數(shù)據(jù)庫(kù)來進(jìn)行數(shù)據(jù)的存儲(chǔ),由于一般的系統(tǒng)任務(wù)中通常不會(huì)存在高并發(fā)的情況,所以這樣看起來并沒有什么問題,可是一旦涉及大數(shù)據(jù)量的需求,比如一些商品搶購(gòu)的情景,或者是主頁(yè)訪問量瞬間較大的時(shí)候,單一使用數(shù)據(jù)庫(kù)來保存數(shù)據(jù)的系統(tǒng)會(huì)因?yàn)槊嫦虼疟P,磁盤讀/寫速度比較慢的問題而存在嚴(yán)重的性能弊端,一瞬間成千上萬的請(qǐng)求到來,需要系統(tǒng)在極短的時(shí)間內(nèi)完成成千上萬次的讀/寫操作,這個(gè)時(shí)候往往不是數(shù)據(jù)庫(kù)能夠承受的,極其容易造成數(shù)據(jù)庫(kù)系統(tǒng)癱瘓,最終導(dǎo)致服務(wù)宕機(jī)的嚴(yán)重生產(chǎn)問題。
NoSQL 技術(shù)為了克服上述的問題,Java Web項(xiàng)目通常會(huì)引入NoSQL技術(shù),這是一種基于內(nèi)存的數(shù)據(jù)庫(kù),并且提供一定的持久化功能。
Redis和MongoDB是當(dāng)前使用最廣泛的NoSQL,而就Redis技術(shù)而言,它的性能十分優(yōu)越,可以支持每秒十幾萬此的讀/寫操作,其性能遠(yuǎn)超數(shù)據(jù)庫(kù),并且還支持集群、分布式、主從同步等配置,原則上可以無限擴(kuò)展,讓更多的數(shù)據(jù)存儲(chǔ)在內(nèi)存中,更讓人欣慰的是它還支持一定的事務(wù)能力,這保證了高并發(fā)的場(chǎng)景下數(shù)據(jù)的安全和一致性。
Redis 在 Java Web 中的應(yīng)用Redis 在 Java Web 主要有兩個(gè)應(yīng)用場(chǎng)景:
在日常對(duì)數(shù)據(jù)庫(kù)的訪問中,讀操作的次數(shù)遠(yuǎn)超寫操作,比例大概在 1:9 到 3:7,所以需要讀的可能性是比寫的可能大得多的。當(dāng)我們使用SQL語句去數(shù)據(jù)庫(kù)進(jìn)行讀寫操作時(shí),數(shù)據(jù)庫(kù)就會(huì)去磁盤把對(duì)應(yīng)的數(shù)據(jù)索引取回來,這是一個(gè)相對(duì)較慢的過程。
如果我們把數(shù)據(jù)放在 Redis 中,也就是直接放在內(nèi)存之中,讓服務(wù)端直接去讀取內(nèi)存中的數(shù)據(jù),那么這樣速度明顯就會(huì)快上不少,并且會(huì)極大減小數(shù)據(jù)庫(kù)的壓力,但是使用內(nèi)存進(jìn)行數(shù)據(jù)存儲(chǔ)開銷也是比較大的,限于成本的原因,一般我們只是使用 Redis 存儲(chǔ)一些常用和主要的數(shù)據(jù),比如用戶登錄的信息等。
一般而言在使用 Redis 進(jìn)行存儲(chǔ)的時(shí)候,我們需要從以下幾個(gè)方面來考慮:
在考慮了這些問題之后,如果覺得有必要使用緩存,那么就使用它!使用 Redis 作為緩存的讀取邏輯如下圖所示:
從上圖我們可以知道以下兩點(diǎn):
從上面的分析可以知道,讀操作的可能性是遠(yuǎn)大于寫操作的,所以使用 Redis 來處理日常中需要經(jīng)常讀取的數(shù)據(jù),速度提升是顯而易見的,同時(shí)也降低了對(duì)數(shù)據(jù)庫(kù)的依賴,使得數(shù)據(jù)庫(kù)的壓力大大減少。
分析了讀操作的邏輯,下面我們來看看寫操作的流程:
從流程可以看出,更新或者寫入的操作,需要多個(gè) Redis 的操作,如果業(yè)務(wù)數(shù)據(jù)寫次數(shù)遠(yuǎn)大于讀次數(shù)那么就沒有必要使用 Redis。
關(guān)于使用內(nèi)存存儲(chǔ)數(shù)據(jù),我知道谷歌好像就是把所有互聯(lián)網(wǎng)的數(shù)據(jù)都存儲(chǔ)在內(nèi)存條的,所以才會(huì)有如此高質(zhì)量、高效的搜索,但它畢竟是谷歌…高速讀/寫的場(chǎng)合
在如今的互聯(lián)網(wǎng)中,越來越多的存在高并發(fā)的情況,比如天貓雙11、搶紅包、搶演唱會(huì)門票等,這些場(chǎng)合都是在某一個(gè)瞬間或者是某一個(gè)短暫的時(shí)刻有成千上萬的請(qǐng)求到達(dá)服務(wù)器,如果單純的使用數(shù)據(jù)庫(kù)來進(jìn)行處理,就算不崩,也會(huì)很慢的,輕則造成用戶體驗(yàn)極差用戶量流失,重則數(shù)據(jù)庫(kù)癱瘓,服務(wù)宕機(jī),而這樣的場(chǎng)合都是不允許的!
所以我們需要使用 Redis 來應(yīng)對(duì)這樣的高并發(fā)需求的場(chǎng)合,我們先來看看一次請(qǐng)求操作的流程圖:
我們來進(jìn)一步闡述這個(gè)過程:
把 Redis 下載下來后找到一個(gè)合適的地方解壓,就能得到如下圖所示的目錄(這里空格被替換成了%20…):
為了方便啟動(dòng),我們?cè)谠撃夸浵滦陆ㄒ粋€(gè) startup.cmd 的文件,然后將以下內(nèi)容寫入文件:
這個(gè)命令其實(shí)就是在調(diào)用 redis-server.exe 命令來讀取 redis.window.conf 的內(nèi)容,我們雙擊剛才創(chuàng)建好的 startup.cmd 文件,就能成功的看到 Redis 啟動(dòng):
上圖的提示信息告訴了我們:① Redis 當(dāng)前的版本為 3.0.503;**② Redis 運(yùn)行在 6379 端口;**③ Redis 進(jìn)程的 PID 為 14748;④ 64 位。
我們可以打開同一個(gè)文件夾下的 redis-cli.exe 文件,這是 Redis 自帶的一個(gè)客戶端工具,它可以用來連接到我們當(dāng)前的 Redis 服務(wù)器,我們做以下測(cè)試:
如此,我們便在 Windows 的環(huán)境下安裝好了 Redis。
在 Java 中使用 Redis第一步:添加 Jedis 依賴想要在 Java 中使用 Redis 緩存,需要添加相關(guān)的Jar包依賴
把它導(dǎo)入工程中去就可以啦,下面我們來對(duì)Redis的寫入性能做一下測(cè)試:
據(jù)說 Redis 的性能能達(dá)到十萬級(jí)別,我不敢相信我的臺(tái)式機(jī)電腦只有十分之一不到的性能,雖然說這里不是流水線的操作,會(huì)造成一定的影響,但我還是不信邪,我查到了官方的性能測(cè)試方法:
**首先在Redis根目錄下召喚Cmd:**具體方法是按住【Shift】點(diǎn)擊右鍵
**然后輸入命令:【redis-benchmark -n 100000 -q】:**來同時(shí)執(zhí)行10萬個(gè)請(qǐng)求測(cè)試性能
好吧,我同時(shí)在我的筆記本上測(cè)試了一下,結(jié)果更加慘淡…low啊low…
第二步:使用 Redis 連接池跟數(shù)據(jù)庫(kù)連接池相同,Java Redis也同樣提供了類來管理我們的Reids連接池對(duì)象,并且我們可以使用來對(duì)連接池進(jìn)行配置,代碼如下:
Redis 只能支持六種數(shù)據(jù)類型(string/hash/list/set/zset/hyperloglog)的操作,但在 Java 中我們卻通常以類對(duì)象為主,所以在需要 Redis 存儲(chǔ)的五中數(shù)據(jù)類型與 Java 對(duì)象之間進(jìn)行轉(zhuǎn)換,如果自己編寫一些工具類,比如一個(gè)角色對(duì)象的轉(zhuǎn)換,還是比較容易的,但是涉及到許多對(duì)象的時(shí)候,這其中無論工作量還是工作難度都是很大的,所以總體來說,就操作對(duì)象而言,使用 Redis 還是挺難的,好在 Spring 對(duì)這些進(jìn)行了封裝和支持。
第三步:在 Spring 中使用 Redis上面說到了 Redis 無法操作對(duì)象的問題,無法在那些基礎(chǔ)類型和 Java 對(duì)象之間方便的轉(zhuǎn)換,但是在 Spring 中,這些問題都可以通過使用RedisTemplate得到解決!
想要達(dá)到這樣的效果,除了 Jedis 包以外還需要在 Spring 引入 spring-data-redis 包:https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis
這里把2.0.7最新版本標(biāo)紅的意思是:別老想著使用最新的Jar包,特別是涉及到框架的一些東西,筆者用實(shí)際的操作體驗(yàn)告訴你們,引入該版本的包是會(huì)導(dǎo)致Jar包沖突的(也就是莫名其妙的錯(cuò)誤),我乖乖換回了1.7.2的版本,代碼就通了…我們來看看怎么做吧:
(1)第一步:使用Spring配置JedisPoolConfig對(duì)象
大部分的情況下,我們還是會(huì)用到連接池的,于是先用 Spring 配置一個(gè) JedisPoolConfig 對(duì)象:
(2)第二步:為連接池配置工廠模型
好了,我們現(xiàn)在配置好了連接池的相關(guān)屬性,那么具體使用哪種工廠實(shí)現(xiàn)呢?在Spring Data Redis中有四種可供我們選擇的工廠模型,它們分別是:
我們這里就簡(jiǎn)單配置成JedisConnectionFactory:
(3)第三步:配置RedisTemplate
普通的連接根本沒有辦法直接將對(duì)象直接存入 Redis 內(nèi)存中,我們需要替代的方案:將對(duì)象序列化(可以簡(jiǎn)單的理解為繼承Serializable接口)。我們可以把對(duì)象序列化之后存入Redis緩存中,然后在取出的時(shí)候又通過轉(zhuǎn)換器,將序列化之后的對(duì)象反序列化回對(duì)象,這樣就完成了我們的要求:
RedisTemplate可以幫助我們完成這份工作,它會(huì)找到對(duì)應(yīng)的序列化器去轉(zhuǎn)換Redis的鍵值:
筆者從《JavaEE互聯(lián)網(wǎng)輕量級(jí)框架整合開發(fā)》中了解到,這一步需要配置多帶帶的序列化器去支撐這一步的工作,但是自己在測(cè)試當(dāng)中,發(fā)現(xiàn)只要我們的POJO類實(shí)現(xiàn)了Serializable接口,就不會(huì)出現(xiàn)問題…所以我直接省略掉了配置序列化器這一步…
(4)第四步:編寫測(cè)試
首先編寫好支持我們測(cè)試的POJO類:
然后編寫測(cè)試類:
運(yùn)行可以成功看到結(jié)果:
第四步:在 SpringBoot 中使用 Redis(1)在SpringBoot中添加Redis依賴:
(2)添加配置文件:
在SpringBoot中使用或者都可以,這里給出的例子,因?yàn)樽约旱奈募瓷先ジ杏X亂糟糟的:
(3)測(cè)試訪問:
通過上面這段極為簡(jiǎn)單的測(cè)試案例演示了如何通過自動(dòng)配置的StringRedisTemplate對(duì)象進(jìn)行Redis的讀寫操作,該對(duì)象從命名中就可注意到支持的是String類型。原本是RedisTemplate<K, V>接口,StringRedisTemplate就相當(dāng)于RedisTemplate<String, String>的實(shí)現(xiàn)。
運(yùn)行測(cè)試,如果一切成功則不會(huì)報(bào)錯(cuò),如果我們沒有拿到或者拿到的數(shù)不是我們想要的 “111” ,那么則會(huì)報(bào)錯(cuò),這是使用Assert的好處(下面是我改成112之后運(yùn)行報(bào)錯(cuò)的結(jié)果):
(4)存儲(chǔ)對(duì)象:
這一步跟上面使用Spring一樣,只需要將POJO類實(shí)現(xiàn)Serializable接口就可以了,我這里就貼一下測(cè)試代碼:
仍然沒有任何問題:
直接黏上兩段簡(jiǎn)單的示例代碼:
在Redis中操作List在Redis中操作Hash總結(jié)在網(wǎng)上看到了關(guān)于MySQL的性能測(cè)試,讀寫操作大概就每秒1000以下的樣子,而且這還和引擎相關(guān),所以可以看出Redis確實(shí)能在性能方面幫助許多
Redis是一個(gè)開源的使用ANSI C語言編寫、遵守BSD協(xié)議、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫(kù),并提供多種語言的API。Reis通常被稱為數(shù)據(jù)結(jié)構(gòu)服務(wù)器,因?yàn)橹担╲alue)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型。
Redis是一個(gè)高性能的key-value數(shù)據(jù)庫(kù),其主要特點(diǎn):
Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中,重啟的時(shí)候可以再次加載進(jìn)行使用。
Redis不僅僅支持簡(jiǎn)單的key-value類型的數(shù)據(jù),同時(shí)還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。
Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
豐富的數(shù)據(jù)類型 – Redis支持二進(jìn)制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作。
原子 – Redis的所有操作都是原子性的,意思就是要么成功執(zhí)行要么失敗完全不執(zhí)行。單個(gè)操作是原子性的。多個(gè)操作也支持事務(wù),即原子性,通過MULTI和EXEC指令包起來。
豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。
Redis吳忠數(shù)據(jù)類型為字符串(String),哈希(Hash), 列表(list), 集合(sets)和有序集合(sorted sets)。
Redis 內(nèi)部使用一個(gè) redisObject 對(duì)象來表示所有的 key 和 value。type 表示一個(gè) value 對(duì)象具體是何種數(shù)據(jù)類型,encoding 是不同數(shù)據(jù)類型在 Redis 內(nèi)部的存儲(chǔ)方式。。
如果解決了你的疑惑,請(qǐng)點(diǎn)點(diǎn)關(guān)注和評(píng)論,謝謝大家支持。
正春華枝俏,待秋實(shí)果茂,與君共勉。
0
回答3
回答0
回答0
回答0
回答0
回答0
回答1
回答1
回答1
回答