更新時間:2018年09月06日17時54分 來源:傳智播客 瀏覽次數(shù):
1、為什么用redis
(1) 提升數(shù)據(jù)的響應(yīng)速度
(2) 減輕關(guān)系型數(shù)據(jù)庫的壓力
Redis的執(zhí)行流程
當(dāng)用戶要來操作數(shù)據(jù)時直接連接數(shù)據(jù)庫進(jìn)行查詢?nèi)缓笳故?,相同的?shù)據(jù)也需要再進(jìn)行數(shù)據(jù)庫的查詢,對于大數(shù)據(jù)量的并發(fā)訪問,會給數(shù)據(jù)造成距大的壓力。
為了減輕數(shù)據(jù)庫的壓力,使用了這種非關(guān)系型數(shù)據(jù)庫(nosql數(shù)據(jù)庫)redis
當(dāng)用戶第一次訪問時,首先訪問redis,redis中如果沒有數(shù)據(jù)再去查詢數(shù)據(jù)庫,當(dāng)查詢完數(shù)據(jù)庫后,先將數(shù)據(jù)存放到redis中,然后再返回給用戶。
當(dāng)用戶第二次訪問的時候還是去訪問redis,此時redis中有數(shù)據(jù),這時就不需要再次去查詢數(shù)據(jù)庫了。
第一次查詢,此時redis中有了數(shù)據(jù),如果對DB中的數(shù)據(jù)產(chǎn)生了更新
第二次查詢的時候以為redis中已經(jīng)有了數(shù)據(jù),那么就會直接返回,但是問題發(fā)生了,db與redis中的數(shù)據(jù)不同步
此時需要清除redis中的數(shù)據(jù)
當(dāng)數(shù)據(jù)庫發(fā)生數(shù)據(jù)改變的時候清空redis
這就是緩存同步:解決nosql數(shù)據(jù)庫與關(guān)系型數(shù)據(jù)庫不同步的問題
Redis有五種數(shù)據(jù)類型
String key value 有一種特殊的寫法可以實現(xiàn)數(shù)據(jù)的分類使用冒號分隔
Clothes:褲子 100
Clothes:風(fēng)衣 100
Hash key field value key后面跟了個map map中是field value 完成數(shù)據(jù)歸類的操作 存值hset key field value 取值hget key field
List 有序 數(shù)據(jù)可重復(fù)
右壓棧--以中心點的位置向右添加 rpush lrange key 0 -1取所有
左壓棧--以中心點的位置向左添加 lpush lrange key 0 -1取所有
Set 無序不可重復(fù)
存值 sadd key value
取值 smembers key
SortedSet有序不可重復(fù)(可以做排行榜信息)
額外的一些對key操作的命令
Expire 設(shè)置過期時間,以秒為單位
Ttl 查看某一個key的狀態(tài) 狀態(tài)值為-1為持久化狀態(tài) -2為key不存在
Persist將某一個key轉(zhuǎn)換為持久化狀態(tài)
僅適用于linux
Redis的前臺啟動 redis-server
Redis的后臺啟動 修改redis.conf中的屬性daemonize 改為yes輸入redis-server redis.conf完成后臺啟動
一個單機(jī)的redis默認(rèn)會存在16個數(shù)據(jù)庫 也可以在redis.conf中修改
./redis-cli --raw 客戶端連接可以顯示中文
在進(jìn)行連接的時候默認(rèn)連接的是0號數(shù)據(jù)庫,在同一個數(shù)據(jù)庫中key是不可以重復(fù)的,重復(fù)的話就會發(fā)生值覆蓋,在不同的數(shù)據(jù)庫中key是可以重復(fù)的,使用select 1命令進(jìn)行數(shù)據(jù)庫的切換
Redis的持久化策略是對redis內(nèi)部數(shù)據(jù)整體的持久化(產(chǎn)生緩存文件,記錄信息,緩存文件存放到磁盤中)
1、RDB默認(rèn)開啟的持久化,快照的形式進(jìn)行記錄,dump.rdb。默認(rèn)存在三種觸發(fā)條件save 900 1在900秒內(nèi)如果有1個key發(fā)生改變就會觸發(fā)RDB進(jìn)行數(shù)據(jù)存放 save 300 10 在300秒內(nèi)10個可以發(fā)生改變會觸發(fā)RDB,save 60 10000 60秒內(nèi)至少有10000個可以發(fā)生改變會觸發(fā)RDB
2、AOF需要手動開啟,在redis.ocnf文件中的appendonly屬性做修改,當(dāng)開啟后會每秒進(jìn)行磁盤的寫操作,記錄的不是單獨的數(shù)據(jù),會記錄所有對redis 的添加、修改、刪除的命令。Appendonly屬性改為yes 會生成appendonly.aof文件。默認(rèn)開啟每秒記錄 appendfsync everysec模式
兩種持久化策略是可以同時開啟的,但是AOF的優(yōu)先級高于RDB
Aof的數(shù)據(jù)安全性高于RDB,但是運行速度低于RDB,建議不開啟AOF
Redis集群
在redis3.0版本以后可以直接使用,redis集群中的服務(wù)器節(jié)點之間是相互聯(lián)通的,當(dāng)用戶訪問集群的節(jié)點時,無需關(guān)注連接的是哪一個節(jié)點,只需要連接集群中任意的節(jié)點就可以獲取到整個集群的數(shù)據(jù)
Redis集群數(shù)據(jù)的存放:0-16383的槽值,當(dāng)設(shè)置值時,根據(jù)key計算該key的值,這個值肯定是在0-16383的范圍內(nèi),根據(jù)計算得到的值確定該key的數(shù)據(jù)存放到哪一個節(jié)點中。Key的值可能是相同的。
Redis集群默認(rèn)有一個投票機(jī)制,當(dāng)集群超過半數(shù)的節(jié)點認(rèn)為某一節(jié)點已經(jīng)掛了,那么不管該節(jié)點是否掛掉投票結(jié)束后就真的掛了,所以一般都是基數(shù)個服務(wù)器為了實現(xiàn)投票機(jī)制。
主從備份:給集群中每一個節(jié)點額外搭建一個備份機(jī),為了完成整個集群的高可用,主節(jié)點叫master,從節(jié)點叫slave。Master對外提供服務(wù),slave實時的做兩件事,第一就是同步主節(jié)點的數(shù)據(jù),第二就是向主節(jié)點發(fā)送心跳包保證主節(jié)點的存活。當(dāng)主節(jié)點無回應(yīng)時slave變?yōu)橹鞴?jié)點向外提供服務(wù)。
基于(心跳檢測機(jī)制)keepalived搭建完主從備份后,在用戶進(jìn)行連接時,會在用戶和服務(wù)之間搭建一個虛擬IP,用戶直接連接虛擬IP(VIP),VIP連接master實現(xiàn)用戶的間接連接,當(dāng)master發(fā)生問題時,VIP會轉(zhuǎn)接到slave上
首發(fā):http://java.itcast.cn