這篇文章主要為大家展示了“JavaEE中Redis怎么用”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“JavaEE中Redis怎么用”這篇文章吧。
成都創(chuàng)新互聯(lián)公司一直秉承“誠信做人,踏實做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個客戶多一個朋友!為您提供網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、成都網(wǎng)頁設(shè)計、成都小程序開發(fā)、成都網(wǎng)站開發(fā)、成都網(wǎng)站制作、成都軟件開發(fā)、app軟件定制開發(fā)是成都本地專業(yè)的網(wǎng)站建設(shè)和網(wǎng)站設(shè)計公司,等你一起來見證!Redis是一個key-value的nosql數(shù)據(jù)庫.先存到內(nèi)存中,會根據(jù)一定的策略持久化到磁盤,即使斷電也不會丟失數(shù)據(jù)。支持的數(shù)據(jù)類型比較多。
主要用來做緩存數(shù)據(jù)庫的數(shù)據(jù)和web集群時當(dāng)做中央緩存存放seesion。
守護(hù)進(jìn)程:在linux或者unix操作系統(tǒng)中在系統(tǒng)引導(dǎo)的時候會開啟很多服務(wù),這些服務(wù)就叫做守護(hù)進(jìn)程。為了增加靈活性,root可以選擇系統(tǒng)開啟的模式,這些模式叫做運行級別,每一種運行級別以一定的方式配置系統(tǒng)。 守護(hù)進(jìn)程是脫離于終端并且在后臺運行的進(jìn)程。守護(hù)進(jìn)程脫離于終端是為了避免進(jìn)程在執(zhí)行過程中的信息在任何終端上顯示并且進(jìn)程也不會被任何終端所產(chǎn)生的終端信息所打斷。
高性能,高可用性和可伸縮性
Redis和Memcache區(qū)別:
Redis和Memcache都是將數(shù)據(jù)存放在內(nèi)存中,都是內(nèi)存數(shù)據(jù)庫。不過memcache還可用于緩存其他東西,例如圖片、視頻等等。
Redis不僅僅支持簡單的k/v類型的數(shù)據(jù),同時還提供list,set,hash等數(shù)據(jù)結(jié)構(gòu)的存儲。
虛擬內(nèi)存--Redis當(dāng)物理內(nèi)存用完時,可以將一些很久沒用到的value 交換到磁盤
nosql數(shù)據(jù)庫分類:
緩存:
把經(jīng)常需要查詢的、很少修改數(shù)據(jù),放到讀速度很快的空間(內(nèi)存),以便下次訪問減少時間。減輕壓力,減少訪問時間。
計數(shù)器:
Redis中的計數(shù)器是原子性的內(nèi)存操作。
可以解決庫存溢出問題.進(jìn)銷存系統(tǒng)庫存溢出。
session緩存服務(wù)器:
web集群時作為session緩存服務(wù)器
緩存隊列等
Json字符串:
需要把對象轉(zhuǎn)換為json字符串,當(dāng)做字符串處理。直接使用set get來設(shè)置或者或。
優(yōu)點:設(shè)置和獲取比較簡單
缺點:沒有提供專門的方法,需要把把對象轉(zhuǎn)換為json。(jsonlib)
字節(jié):需要做序列號,就是把對象序列化為字節(jié)保存。
如果是擔(dān)心JSON轉(zhuǎn)對象會消耗資源的情況,這個問題需要考量幾個地方:
第一點:就是使用的JSON轉(zhuǎn)換lib是否就會存在性能問題。
第二點:就是數(shù)據(jù)的數(shù)據(jù)量級別,如果是存儲百萬級的大數(shù)據(jù)對象,建議采用存儲序列化對象方式。如果是少量的數(shù)據(jù)級對象,或者是數(shù)據(jù)對象字段不多,還是建議采用JSON轉(zhuǎn)換成String方式。
畢竟redis對存儲字符類型這部分優(yōu)化的非常好。具體采用的方式與方法,還要看你所使用的場景。
在 Redis 中,允許用戶設(shè)置大使用內(nèi)存大小 server.maxmemory,在內(nèi)存限定的情況下是很有用的。譬如,在一臺 8G 機子上部署了 4 個 Redis 服務(wù)點,每一個服務(wù)點分配 1.5G 的內(nèi)存大小,減少內(nèi)存緊張的情況,由此獲取更為穩(wěn)健的服務(wù)。
內(nèi)存大小有限,需要保存有效的數(shù)據(jù)?
Redis 內(nèi)存數(shù)據(jù)集大小上升到一定大小的時候,就會施行數(shù)據(jù)淘汰策略。
Redis 提供 6種數(shù)據(jù)淘汰策略:
volatile-lru:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中挑選最近最少使用的數(shù)據(jù)淘汰
volatile-ttl:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中挑選將要過期的數(shù)據(jù)淘汰
volatile-random:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中任意選擇數(shù)據(jù)淘汰
allkeys-lru:從數(shù)據(jù)集(server.db[i].dict)中挑選最近最少使用的數(shù)據(jù)淘汰
allkeys-random:從數(shù)據(jù)集(server.db[i].dict)中任意選擇數(shù)據(jù)淘汰
no-enviction(驅(qū)逐):禁止驅(qū)逐數(shù)據(jù)
使用jedis java客戶端來訪問redis服務(wù)器,有點類似通過jdbc訪問mysql一樣。
當(dāng)然如果是spring進(jìn)行集成時,可以使用spring data來訪問redis,spring data只是對jedis的二次封裝。jdbcTemplate jdbc關(guān)系一樣。
1.String
要把一個String保存到redis中,用set(key,value),獲取值用get(key)。
2.Hash(一般用于保存對象)
要把一個Hash保存到redis中,遍歷Map
3.List
要把一個List保存到redis中,遍歷List
這里lpush的意思是從左邊保存,也就是后來居上。
4.Set
要把一個Set保存到redis中,遍歷Set
5.SortedSet
SortedSet的意思是他的每一個元素是有順序的,順序根據(jù)其score來決定,如果socre一樣,則按value排序。保存到redis的方法是,對每一個要保存的元素,調(diào)用zadd(key,score,value),獲取值用zrange(key,satrt,end),start代表開始位置,end代表結(jié)束位置,如果為-1則代表到未尾。
類似mysql的master-slave模式一樣,redis的master-slave可以提升系統(tǒng)的可用性,master節(jié)點寫入cache后,會自動同步到slave上。Master以寫為主,Slave以讀為主。
可以實現(xiàn):讀寫分離和容災(zāi)恢復(fù)
缺點:延時,由于所有的寫操作都是在Master上操作,然后同步更新到Slave上,所以從Master同步到Slave機器有一定的延遲,當(dāng)系統(tǒng)很繁忙的時候,延遲問題會更加嚴(yán)重,Slave機器數(shù)量的增加也會使得這個問題更加嚴(yán)重。
配置過程:
主Redis:192.168.10.1 6379 從Redis:192.168.10.2 6380
將主從redis配置文件redis.conf中的aemonize no 改為 yes
修改從redis配置文件redis.conf中的port 6379 改為 6380,添加slaveof 192.168.10.1 6379
啟動主從服務(wù)
主Redis:
[root@localhost redis-2.8.3]# src/redis-server /soft/redis-2.8.3-master/redis-2.8.3/redis.conf
從Redis:
[root@localhost redis-2.8.3]# src/redis-server /soft/redis-2.8.3-slave/redis-2.8.3/redis.conf
測試數(shù)據(jù)同步
主Redis:
[root@localhost redis-2.8.3]# src/redis-cli -p 6379 127.0.0.1:6379> set name abc OK 127.0.0.1:6379> get name "abc" 127.0.0.1:6379>
從Redis:
[root@localhost redis-2.8.3]# src/redis-cli -p 6380 127.0.0.1:6380> get name "abc" 127.0.0.1:6380>
默認(rèn)是讀寫分離的
在從Redis:
[root@localhost redis-2.8.3]# src/redis-cli -p 6380 127.0.0.1:6380> set name 123 (error) READONLY You can't write against a read only slave.
[root@localhost redis-2.8.3]# src/redis-cli -n 6379 shutdown [root@localhost redis-2.8.3]# src/redis-cli -p 6379 Could not connect to Redis at 127.0.0.1:6379: Connection refused not connected>
[root@localhost redis-2.8.3]# src/redis-cli -p 6380 slaveof NO ONE OK
[root@localhost redis-2.8.3]# src/redis-cli -p 6380 127.0.0.1:6380> set name 123 OK 127.0.0.1:6380> get name "123" 127.0.0.1:6380>
1)將現(xiàn)在的主redis的數(shù)據(jù)進(jìn)行保存
[root@localhost redis-2.8.3]# src/redis-cli -p 6380 127.0.0.1:6380> get name "abc" 127.0.0.1:6380> set name 123 OK 127.0.0.1:6380> get name "123" 127.0.0.1:6380> save OK 127.0.0.1:6380> get name "123" 127.0.0.1:6380>
2)將現(xiàn)在的主redis根目錄下dump.rdb文件拷貝覆蓋到原來主redis的根目錄
3)啟動原來的主redis
[root@localhost redis-2.8.3]# src/redis-server /soft/redis-2.8.3-master/redis-2.8.3/redis.conf
4)在現(xiàn)在的主redis中切換
[root@localhost redis-2.8.3]# src/redis-cli -p 6380 slaveof 192.168.10.1 6379 OK
常用的設(shè)計方案:
一主二仆:一個Master,兩個Slave,Slave只能讀不能寫;當(dāng)Slave與Master斷開后需要重新slave of連接才可建立之前的主從關(guān)系;Master掛掉后,Master關(guān)系依然存在,Master重啟即可恢復(fù)。
薪火相傳:上一個Slave可以是下一個Slave的Master,Slave同樣可以接收其他slaves的連接和同步請求,那么該slave作為了 鏈條中下一個slave的Master,如此可以有效減輕Master的寫壓力。如果slave中途變更轉(zhuǎn)向,會清除之前的數(shù)據(jù),重新建立最新的。
反客為主: 當(dāng)Master掛掉后,Slave可鍵入命令 slaveof no one使當(dāng)前Redis停止與其他Master redis數(shù)據(jù)同步,轉(zhuǎn)成Master redis。
復(fù)制原理:
Slave啟動成功連接到master后會發(fā)送一個sync命令;
Master接到命令啟動后的存盤進(jìn)程,同時收集所有接收到的用于修改數(shù)據(jù)集命令,在后臺進(jìn)程執(zhí)行完畢之后,master將傳送整個數(shù)據(jù)文件到slave,以完成一次完全同步;
全量復(fù)制:而slave服務(wù)在數(shù)據(jù)庫文件數(shù)據(jù)后,將其存盤并加載到內(nèi)存中;
增量復(fù)制:Master繼續(xù)將新的所有收集到的修改命令依次傳給slave,完成同步;
但是只要是重新連接master,一次完全同步(全量復(fù)制)將被自動執(zhí)行。
哨兵模式:
反客為主的自動版,能夠后臺監(jiān)控Master庫是否故障,如果故障了根據(jù)投票數(shù)自動將slave庫轉(zhuǎn)換為主庫。一組sentinel能同時監(jiān)控多個Master。
使用步驟:
1、在Master對應(yīng)redis.conf同目錄下新建sentinel.conf文件,名字絕對不能錯;
2、配置哨兵,在sentinel.conf文件中填入內(nèi)容:
sentinel monitor 被監(jiān)控數(shù)據(jù)庫名字(自己起名字) ip port 1
說明:上面最后一個數(shù)字1,表示主機掛掉后slave投票看讓誰接替成為主機,得票數(shù)多少后成為主機。
3、啟動哨兵模式:
命令鍵入:redis-sentinel /myredis/sentinel.conf
注:上述sentinel.conf路徑按各自實際情況配置
普通的連接使用沒有辦法把Java對象直接存入Redis,而需要我們自己提供方案-對象序列化,然后存入redis,取回序列化內(nèi)容后,轉(zhuǎn)換為java對象。Spring模板中提供了封裝的方案,在它內(nèi)部提供了RedisSerializer接口(org.springframework.data.redis.serializer.RedisSerializer)和一些實現(xiàn)類。也可以自定義序列化器,實現(xiàn)RedisSerializer接口。常用的有:StringRedisSerializer,JdkSerializationRedisSerializer
RedisTemplate默認(rèn)的系列化類是JdkSerializationRedisSerializer,用JdkSerializationRedisSerializer序列化的話,被序列化的對象必須實現(xiàn)Serializable接口。在存儲內(nèi)容時,除了屬性的內(nèi)容外還存了其它內(nèi)容在里面,總長度長,且不容易閱讀。 我們要求是存儲的數(shù)據(jù)可以方便查看,也方便反系列化,方便讀取數(shù)據(jù)。
Jackson2JsonRedisSerializer和GenericJackson2JsonRedisSerializer,兩者都能序列化成json,但是后者會在json中加入@class屬性,類的全路徑包名,方便反系列化。前者如果存放了List則在反系列化的時候如果沒指定TypeReference則會報錯:java.util.LinkedHashMap cannot be cast to。
WebSocket 是 HTML5 開始提供的一種在單個 TCP 連接上進(jìn)行全雙工通訊的協(xié)議。
WebSocket 使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允許服務(wù)端主動向客戶端推送數(shù)據(jù)。在 WebSocket API 中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸。
在 WebSocket API 中,瀏覽器和服務(wù)器只需要做一個握手的動作,然后,瀏覽器和服務(wù)器之間就形成了一條快速通道。兩者之間就直接可以數(shù)據(jù)互相傳送。
現(xiàn)在,很多網(wǎng)站為了實現(xiàn)推送技術(shù),所用的技術(shù)都是 Ajax 輪詢。輪詢是在特定的的時間間隔(如每1秒),由瀏覽器對服務(wù)器發(fā)出HTTP請求,然后由服務(wù)器返回最新的數(shù)據(jù)給客戶端的瀏覽器。這種傳統(tǒng)的模式帶來很明顯的缺點,即瀏覽器需要不斷的向服務(wù)器發(fā)出請求,然而HTTP請求可能包含較長的頭部,其中真正有效的數(shù)據(jù)可能只是很小的一部分,顯然這樣會浪費很多的帶寬等資源。
WebSocket 協(xié)議本質(zhì)上是一個基于 TCP 的協(xié)議。
為了建立一個 WebSocket 連接,客戶端瀏覽器首先要向服務(wù)器發(fā)起一個 HTTP 請求,這個請求和通常的 HTTP 請求不同,包含了一些附加頭信息,其中附加頭信息"Upgrade: WebSocket"表明這是一個申請協(xié)議升級的 HTTP 請求,服務(wù)器端解析這些附加的頭信息然后產(chǎn)生應(yīng)答信息返回給客戶端,客戶端和服務(wù)器端的 WebSocket 連接就建立起來了,雙方就可以通過這個連接通道自由的傳遞信息,并且這個連接會持續(xù)存在直到客戶端或者服務(wù)器端的某一方主動的關(guān)閉連接。
websocket事件觸發(fā)機制:
open:
一旦服務(wù)器響應(yīng)了WebSocket連接請求,open事件觸發(fā)并建立一個連接。open事件對應(yīng)的回調(diào)函數(shù)稱作onopen。
到open事件觸發(fā)時,協(xié)議握手已經(jīng)完成,WebSocket已經(jīng)準(zhǔn)備好發(fā)送和接收數(shù)據(jù)。如果應(yīng)用程序接收到一個open事件,那么 可以確定WebSocket服務(wù)器成功地處理了連接請求,并且同意與應(yīng)用程序通信。
message:
WebSocket消息包含來自服務(wù)器的數(shù)據(jù)。你也可能聽說過組成WebSocket消息的WebSocket幀(Frame)。第3章將詳細(xì)討論消息和幀的概念。為了理解消息使用API的方式,WebSocket API只輸出完整的消息,而不是WebSocket幀。message事件在接收到消息時觸發(fā),對應(yīng)于該事件的回調(diào)函數(shù)是onmessage。
除了文本,WebSocket消息還可以處理二進(jìn)制數(shù)據(jù),這種數(shù)據(jù)作為Blob消息或者ArrayBuffer消息處理。因為設(shè)置WebSocket消息二進(jìn)制數(shù)據(jù)類型的應(yīng)用程序會影響二進(jìn)制消息,所以必須在讀取數(shù)據(jù)之前決定用于客戶端二進(jìn)制輸入數(shù)據(jù)的類型。
error:
error事件在響應(yīng)意外故障的時候觸發(fā)。與該事件對應(yīng)的回調(diào)函數(shù)為onerror。錯誤還會導(dǎo)致WebSocket連接關(guān)閉。如果你接收一個error事件,可以預(yù)期很快就會觸發(fā)close事件。close事件中的代碼和原因有時候能告訴你錯誤的根源。error事件處理程序是調(diào)用服務(wù)器重連邏輯以及處理來自WebSocket對象的異常的最佳場所。
close:
close事件在WebSocket連接關(guān)閉時觸發(fā)。對應(yīng)于close事件的回調(diào)函數(shù)是onclose。一旦連接關(guān)閉,客戶端和服務(wù)器不再能接收或者發(fā)送消息。
說明:WebSocket規(guī)范還定義了ping和pong幀,可以用于持續(xù)連接(keep-alive)、心跳、網(wǎng)絡(luò)狀態(tài)檢測、延遲測量等,但是WebSocket API目前沒有輸出這些特性。盡管瀏覽器接受ping幀,但是不會觸發(fā)對應(yīng)WebSocket上的ping事件。相反,瀏覽器將自動響應(yīng)pong幀。然而,瀏覽器實例化的ping如果在一段時間內(nèi)沒有得到pong應(yīng)答,可能會觸發(fā)連接的close事件。
當(dāng)調(diào)用close()方法終止與服務(wù)器的連接時,也會觸發(fā)onclose事件處理程序;WebSocket close事件在連接關(guān)閉時觸發(fā),這可能有多種原因,比如連接失敗或者成功的WebSocket關(guān)閉握手。WebSocket對象特性readyState反映了連接的狀態(tài)(2為正在關(guān)閉,3為已關(guān)閉)。
close事件有3個有用的屬性(property),可以用于錯誤處理和恢復(fù):wasClean、code和error。wasClean屬性是一個布爾屬性,表示連接是否順利關(guān)閉。如果WebSocket的關(guān)閉是對來自服務(wù)器的一個close幀的響應(yīng),則該屬性為true。如果連接是因為其他原因(例如,因為底層TCP連接關(guān)閉)關(guān)閉,則該屬性為false。code和reason屬性表示服務(wù)器發(fā)送的關(guān)閉握手狀態(tài)。這些屬性和WebSocket.close()方法中的code和reason參數(shù)一致。
針對于上面所涉及到的知識點我總結(jié)出了有1到5年開發(fā)經(jīng)驗的程序員在面試中涉及到的絕大部分架構(gòu)面試題及答案做成了文檔和架構(gòu)視頻資料免費分享給大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并發(fā)等架構(gòu)技術(shù)資料),希望能幫助到您面試前的復(fù)習(xí)且找到一個好的工作,也節(jié)省大家在網(wǎng)上搜索資料的時間來學(xué)習(xí),也可以關(guān)注我一下以后會有更多干貨分享。
以上是“JavaEE中Redis怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站制作公司行業(yè)資訊頻道!
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。