Redis相關(guān)
- 數(shù)據(jù)庫(kù)類(lèi)型
關(guān)系型數(shù)據(jù)庫(kù):Oracle,MySQL,SqlServer,DB2
-
NoSql數(shù)據(jù)庫(kù):NoSQL最常見(jiàn)的解釋是“non-relational”, “Not Only SQL”也被很多人接受。NoSQL僅僅是一
個(gè)概念,泛指非關(guān)系型的數(shù)據(jù)庫(kù),區(qū)別于關(guān)系數(shù)據(jù)庫(kù),它們不保證關(guān)系數(shù)據(jù)的ACID特性。,其具體分類(lèi)如下- 鍵值存儲(chǔ):這一類(lèi)數(shù)據(jù)庫(kù)主要會(huì)使用到一個(gè)哈希表,這個(gè)表中有一個(gè)特定的鍵和一個(gè)指針指向特
定的數(shù)據(jù)。Key/value模型對(duì)于IT系統(tǒng)來(lái)說(shuō)的優(yōu)勢(shì)在于簡(jiǎn)單、易部署
代表: Redis - 列存儲(chǔ)數(shù)據(jù)庫(kù):這部分?jǐn)?shù)據(jù)庫(kù)通常是用來(lái)應(yīng)對(duì)分布式存儲(chǔ)的海量數(shù)據(jù)。鍵仍然存在,但是它們的特點(diǎn)是指向了多個(gè)列。這些列是由列家族來(lái)安排的。
代表: HBase - 文檔型數(shù)據(jù)庫(kù):文檔型數(shù)據(jù)庫(kù)的靈感是來(lái)自于Lotus Notes辦公軟件的,而且它同第一種鍵值存儲(chǔ)相類(lèi)似。該類(lèi)型的數(shù)據(jù)模型是版本化的文檔,半結(jié)構(gòu)化的文檔以特定的格式存儲(chǔ),比如JSON。文檔型數(shù)據(jù)庫(kù)可 以看作是鍵值數(shù)據(jù)庫(kù)的升級(jí)版,允許之間嵌套鍵值。而且文檔型數(shù)據(jù)庫(kù)比鍵值數(shù)據(jù)庫(kù)的查詢(xún)效率更高代表: MongoDb
- 圖形數(shù)據(jù)庫(kù):圖形結(jié)構(gòu)的數(shù)據(jù)庫(kù)同其他行列以及剛性結(jié)構(gòu)的SQL數(shù)據(jù)庫(kù)不同,它是使用靈活的圖形模型,并且能夠擴(kuò)展到多個(gè)服務(wù)器上。NoSQL數(shù)據(jù)庫(kù)沒(méi)有標(biāo)準(zhǔn)的查詢(xún)語(yǔ)言(SQL),因此進(jìn)行數(shù)據(jù)庫(kù)查詢(xún)需要制定數(shù)據(jù)模型。許多NoSQL數(shù)據(jù)庫(kù)都有REST式的數(shù)據(jù)接口或者查詢(xún)API代表: Neo4J
- 鍵值存儲(chǔ):這一類(lèi)數(shù)據(jù)庫(kù)主要會(huì)使用到一個(gè)哈希表,這個(gè)表中有一個(gè)特定的鍵和一個(gè)指針指向特
-
非關(guān)系型數(shù)據(jù)庫(kù)特點(diǎn):
- 數(shù)據(jù)模型比較簡(jiǎn)單.(主要)
- 需要靈活性更強(qiáng)的應(yīng)用系統(tǒng)
- 對(duì)數(shù)據(jù)庫(kù)性能要求較高(主要)
- 不需要高度的數(shù)據(jù)一致性(主要)
- 對(duì)于給定key,比較容易映射復(fù)雜值的環(huán)境.
-
與關(guān)系型數(shù)據(jù)區(qū)分:
關(guān)系型數(shù)據(jù)庫(kù)最典型的數(shù)據(jù)結(jié)構(gòu)是表,由二維表及其之間的聯(lián)系所組成的一個(gè)數(shù)據(jù)組織- 優(yōu)點(diǎn):
- 易于維護(hù):都是使用表結(jié)構(gòu),格式一致;
- 使用方便:SQL語(yǔ)言通用,可用于復(fù)雜查詢(xún);
- 復(fù)雜操作:支持SQL,可用于一個(gè)表以及多個(gè)表之間非常復(fù)雜的查詢(xún)。
- 缺點(diǎn):
- 讀寫(xiě)性能比較差,尤其是海量數(shù)據(jù)的高效率讀寫(xiě);
- 固定的表結(jié)構(gòu),靈活度稍欠;
- 高并發(fā)讀寫(xiě)需求,傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)來(lái)說(shuō),硬盤(pán)I/O是一個(gè)很大的瓶頸。
- 優(yōu)點(diǎn):
-
非關(guān)系型數(shù)據(jù)庫(kù)嚴(yán)格上不是一種數(shù)據(jù)庫(kù),應(yīng)該是一種數(shù)據(jù)結(jié)構(gòu)化存儲(chǔ)方法的集合,可以是文檔或者鍵值對(duì)等。
- 優(yōu)點(diǎn):
- 格式靈活:存儲(chǔ)數(shù)據(jù)的格式可以是key,value形式、文檔形式、圖片形式等等,文檔形式、圖片形式等等,使用靈活,應(yīng)用場(chǎng)景廣泛,而關(guān)系型數(shù)據(jù)庫(kù)則只支持基礎(chǔ)類(lèi)型。
- 速度快:nosql可以使用硬盤(pán)或者隨機(jī)存儲(chǔ)器作為載體,而關(guān)系型數(shù)據(jù)庫(kù)只能使用硬盤(pán);
- 高擴(kuò)展性;
- 成本低:nosql數(shù)據(jù)庫(kù)部署簡(jiǎn)單,基本都是開(kāi)源軟件。
- 缺點(diǎn):
- 不提供sql支持,學(xué)習(xí)和使用成本較高;
- 無(wú)事務(wù)處理;
- 數(shù)據(jù)結(jié)構(gòu)相對(duì)復(fù)雜,復(fù)雜查詢(xún)方面稍欠。
- 優(yōu)點(diǎn):
- 什么是redis?
- redis定位是緩存, 提高數(shù)據(jù)讀寫(xiě)速度, 減輕對(duì)數(shù)據(jù)庫(kù)存儲(chǔ)與訪問(wèn)壓力
- Redis簡(jiǎn)介:是以key-value形式存儲(chǔ),和傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)不一樣.不一定遵循傳統(tǒng)數(shù)據(jù)庫(kù)的一些基本要求. (非關(guān)系型的,分布式的,開(kāi)源的,水平可拓展的)
- 優(yōu)點(diǎn):
- 對(duì)數(shù)據(jù)高并發(fā)讀寫(xiě)(直接是內(nèi)存中進(jìn)行讀寫(xiě)的)
- 對(duì)海量數(shù)據(jù)的高效率存儲(chǔ)和訪問(wèn)
- 對(duì)數(shù)據(jù)的可拓展性和高可用性.
- 單線程操作,每個(gè)操作都是原子操作,沒(méi)有并發(fā)相關(guān)問(wèn)題(redis 6)
- 缺點(diǎn):
- redis(ACID處理非常簡(jiǎn)單)
- 無(wú)法做太復(fù)雜的關(guān)系數(shù)據(jù)庫(kù)模型
- 優(yōu)點(diǎn):
- Redis是以key-value store存儲(chǔ).鍵可以包含:(string)字符串,哈希,(list)鏈表,(set)集合,(zset)有序集合.這些數(shù)據(jù)集合都指出
push/pop,add/remove及取交集和并集以及更豐富的操作.redis支持各種不同方式排序,為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中.它可以從周期性的把更新的數(shù)據(jù)寫(xiě)入到磁盤(pán)或者把修改操作寫(xiě)入追加的文件中.
- Redis命令用法:類(lèi)型命令 key 參數(shù)數(shù)據(jù),type key :表示查key的類(lèi)型
- String類(lèi)型
1. set key value #存入鍵值對(duì) 2. get key #取出key對(duì)應(yīng)的value 3. setex key #超時(shí)時(shí)間(表示:過(guò)了多少秒這個(gè)鍵值對(duì)失效) value //存入key value鍵值對(duì),過(guò)了超時(shí)時(shí)間便失效了,如果對(duì)已經(jīng)存在的key執(zhí)行setex操作,過(guò)了規(guī)定時(shí)間,那么之前存在的鍵值對(duì)也會(huì)被干掉,比如之前先執(zhí)行了set name zs,接著又執(zhí)行setex name 5 ls 那么在5秒之內(nèi),name的值為ls,當(dāng)過(guò)了5秒,name就為nil了 4. ttl key #查看該key還有多少時(shí)間過(guò)期,為-2時(shí)表示已過(guò)期 5. incr key #給key對(duì)應(yīng)的value值加1,如果不是數(shù)值類(lèi)型的則會(huì)報(bào)錯(cuò),如set name zs,此時(shí)再操作 incr name就會(huì)報(bào)錯(cuò),而set age 18 ,再操作incr age就不會(huì)報(bào)錯(cuò),結(jié)果為19,并且如果key之前是不存在的,那么就會(huì)創(chuàng)建出對(duì)應(yīng)的key,默認(rèn)的value是0,做一次自增就是1了 6. decr key #和上面相反,自減,與incr同理,如果當(dāng)前操作的key之前不存在,那么就會(huì)自動(dòng)創(chuàng)建,默認(rèn)value為0,操作完后結(jié)果就為-1 7. del key #刪除對(duì)應(yīng)的鍵值對(duì) 8. setnx key value #表示如果當(dāng)前的key之前不存在才存入該鍵值對(duì),否則不處理 9.其他不常用的 incrby key num #-> 偏移值 mset k1 v1 k2 v2 ... #-> 批量存入鍵值對(duì) mget k1 k2 ... #-> 批量取出鍵值 append key 'value' #-> 原值后拼接新內(nèi)容 setrange key index value #-> 修改鍵對(duì)應(yīng)的值,index表示開(kāi)始的索引位置- 應(yīng)用情景:
- 計(jì)數(shù)器:許多運(yùn)用都會(huì)使用redis作為計(jì)數(shù)的基礎(chǔ)工具,他可以實(shí)現(xiàn)快速計(jì)數(shù)、查詢(xún)緩存的功能,同時(shí)數(shù)據(jù)可以異步落地到其他的數(shù)據(jù)源。如:視頻播放數(shù)系統(tǒng)就是使用redis作為視頻播放數(shù)計(jì)數(shù)的基礎(chǔ)組件。incr viewnum 1
- 共享session:出于負(fù)載均衡的考慮,分布式服務(wù)會(huì)將用戶(hù)信息的訪問(wèn)均衡到不同服務(wù)器上,用戶(hù)刷新一次訪問(wèn)可能會(huì)需要重新登錄,為避免這個(gè)問(wèn)題可以用redis將用戶(hù)session集中管理,在這種模式下只要保證redis的高可用和擴(kuò)展性的,每次獲取用戶(hù)更新或查詢(xún)登錄信息都直接從redis中集中獲取。
- 應(yīng)用情景:
- hash類(lèi)型:Hash類(lèi)型是String類(lèi)型的field和value的映射表.或者說(shuō)是一個(gè)String集合.它特別適合存儲(chǔ)對(duì)象,相比較而言,講一個(gè)對(duì)象存儲(chǔ)在Hash類(lèi)型里要比存儲(chǔ)在String類(lèi)型里占用更少的內(nèi)存空間,并方便存儲(chǔ)整個(gè)對(duì)象
#1.給對(duì)象添加屬性值(鍵值對(duì)) hset key hashkey hashvalue #舉例(在開(kāi)發(fā)中的場(chǎng)景就是向user對(duì)象中添加name屬性,name對(duì)應(yīng)的值為zs,age對(duì)應(yīng)的值為19) hset user name zs hset user age 19 #2. 取值 hget key hashkey #舉例(根據(jù)對(duì)象的屬性去取值,獲取user對(duì)象中的name屬性值) hget user name #3.對(duì)象里面對(duì)應(yīng)的key是否存在 hexists key hashkey #舉例(user對(duì)象中是否存在name屬性) hexists user name #4.刪除對(duì)象里面對(duì)應(yīng)的屬性 hdel key hashkey #舉例(刪除user中的name屬性) hdel user name #5以下為其他不常用的 hincrby key hashkey #遞增值 -> 遞增hashkey對(duì)應(yīng)的值 hlen key #-> 獲取hash對(duì)象鍵的數(shù)量 hkeys key #-> 獲取hash對(duì)象的所有鍵 hvals key #-> 獲取hash對(duì)象的所有值 hgetall key #-> 獲取hash對(duì)象的所有數(shù)據(jù) 同樣有hsetnx,其作用跟用法和setnx一樣- 應(yīng)用情景:
- 哈希結(jié)構(gòu)相對(duì)于字符串序列化緩存信息更加直觀,并且在更新操作上更加便捷。所以常常用于用戶(hù)信息等管理,
- 但是哈希類(lèi)型和關(guān)系型數(shù)據(jù)庫(kù)有所不同,哈希類(lèi)型是稀疏的,而關(guān)系型數(shù)據(jù)庫(kù)是完全結(jié)構(gòu)化的,關(guān)系型數(shù)據(jù)庫(kù)可以做復(fù)雜的關(guān)系查詢(xún),而redis去模擬關(guān)系型復(fù)雜查詢(xún)開(kāi)發(fā)困難,維護(hù)成本高
- 開(kāi)發(fā)中不建議使用hash, 如果真的需要用到, 使用對(duì)象, 轉(zhuǎn)換成json格式字符串
- 應(yīng)用情景:
- list:Redis中的List類(lèi)似Java中的queue,也可以當(dāng)做List來(lái)用.List類(lèi)型是一個(gè)鏈表結(jié)構(gòu)的集合,其主要功能有push,pop,獲取元素等.更詳細(xì)的說(shuō),List類(lèi)型是一個(gè)雙端鏈表的結(jié)構(gòu),我們可以通過(guò)相關(guān)操作進(jìn)行集合的頭部或者尾部添加刪除元素,list的設(shè)計(jì)非常簡(jiǎn)單精巧,即可以作為棧,又可以作為隊(duì)列.滿足絕大多數(shù)需求.
#1.左邊開(kāi)始往右添加 lpush arrs aa bb cc dd #得到結(jié)果:dd cc bb aa #2如果是往右邊添加(r表示右邊的意思) rpush arrs aa bb cc dd #得到結(jié)果:aa bb cc dd #3.左彈出(假設(shè)arrs中的數(shù)據(jù)為a b c d) lpop arrs #得到結(jié)果為(將a彈出,剩下b c d) #4.右彈出(假設(shè)arrs中的數(shù)據(jù)為a b c d) rpop arrs #得到結(jié)果為(將d彈出,剩下a b c) #5.打印list中的數(shù)據(jù) lrange arrs 0 -1 #從左到右打印arrs中的數(shù)據(jù),0表示從第0個(gè)元素開(kāi)始,-1就表示打印全部,其余的數(shù)值表示從第0個(gè)到第多少個(gè),比如3就表示從第0個(gè)到第3個(gè) #6.獲取長(zhǎng)度(這里表示獲取arrs的長(zhǎng)度) llen arrs #7.其他應(yīng)用場(chǎng)景 linsert key before/after refVal newVal #-> 參考值之前/后插入數(shù)據(jù) lset key index value #-> 根據(jù)索引修改數(shù)據(jù) lrem key count value #-> 在列表中按照個(gè)數(shù)刪除數(shù)據(jù) ltrim key start end #-> 范圍截取列表 lindex key index #-> 根據(jù)索引取列表中數(shù)據(jù)- 應(yīng)用情景:1.用戶(hù)收藏文章列表:xxxx_user_articles:uid [aid1, aid2, aid3.....]
- set類(lèi)型:Set集合是string類(lèi)型的無(wú)序集合,set是通過(guò)hashtable實(shí)現(xiàn)的,對(duì)集合我們可以取交集,并集,差集
#1.往集合中添加元素 sadd set1 aa bb cc ff #2.列出集合中所有元素 smembers set1 #3.刪除集合中的元素 srem set1 aa #這里表示刪除set1集合中的aa元素 #4.隨機(jī)從集合中彈出多少個(gè)元素 spop set1 3 #這里表示隨機(jī)從集合中彈出3個(gè)元素 #5.求差集 sdiff set1 set2 #這里表示的是求出set1中獨(dú)有的元素,比如set1中有元素(aa bb ff gg) 而set2中有元素 (aa bb cc dd),那么執(zhí)行該操作后得到的結(jié)果為ff gg ,因?yàn)閍a bb 是共有的,只有ff gg 是set1獨(dú)有的 #6.求交集 sinter set1 set2 #這里表示的是求set1和set2的交集(就是共同都有的元素) #7.求并集 sunion set1 set2 #這里表示求set1與set2的并集,比如set1中的元素為(a b c),set2中的元素為(e f)那么其并集就為(a b c e f) #8.返回集合中元素的個(gè)數(shù) scard set1 #表示查詢(xún)set1集合中元素的個(gè)數(shù)- 應(yīng)用情景:
- 去重;
- 抽獎(jiǎng):
- 準(zhǔn)備一個(gè)抽獎(jiǎng)池:sadd luckydraw 1 2 3 4 5 6 7 8 9 10 11 12 13
- 抽3個(gè)三等獎(jiǎng):spop luckydraw 3
- 抽2個(gè)二等獎(jiǎng):spop luckydraw 2
- 抽1個(gè)二等獎(jiǎng):spop luckydraw 1
- 應(yīng)用情景:
- zset類(lèi)型:可以排序的set類(lèi)型
#1.添加元素 zadd set1 1 a #這里表示往set1集合中添加元素a,并且a元素對(duì)應(yīng)的分值為1,這個(gè)分值就是用來(lái)排序的 #2.一次性添加多個(gè)元素 zadd set1 2 b 3 c 4 f #這里表示同時(shí)向set1集合中添加了分值為2的b元素,分值為3的c元素,分值為4的f元素 #3.根據(jù)分值順序排序 zrange set1 0 -1 #這里表示set1升序全部輸出,0表示開(kāi)始的元素,-1表示所有的元素,如果為2則表示從第0號(hào)元素到第2號(hào)元素,其余的的以此類(lèi)推 #4.反序輸出 zrevrange set1 0 -1 #這里表示set1反序輸出所有元素,0和-1的用法同上面的正序 #5.正序返回集合中某元素的位置 zrank set1 a #這里表示返回集合set1中按照升序的規(guī)則a所處的位置,這里a的位置就是第0位,因?yàn)樗谧钋懊? #6.反序返回集合中某元素的位置 zrevrank set1 a #這里表示返回結(jié)婚set1按照降序規(guī)則a所處的位置,這里a就是第3號(hào)元素 #7. 返回元素個(gè)數(shù) zcard set1 #這里表示返回集合set1元素的個(gè)數(shù) #8. 給集合中的元素增加分值,改變分值就可以改變排名了 zincrby set1 4 b #這里表示給集合set1中的b元素的分值增加了4,那么此時(shí)升序輸出的話b元素就應(yīng)該在最后面了,因?yàn)榇藭r(shí)的b元素分值為2+4=6,而f是4,所以b元素分值是最大的,從而在最后面 #9.其他不常用的 zrangebyscore key min max [withscores] #-> 按照分?jǐn)?shù)范圍升序輸出名稱(chēng) zrevrangebyscore key max min [withscores] #-> 按照分?jǐn)?shù)范圍降序輸出名稱(chēng) zrem key name #-> 刪除名稱(chēng)和分?jǐn)?shù) zremrangebyscore key min max [withscores] #-> 根據(jù)分?jǐn)?shù)范圍刪除元素 zremrangebyrank key start end #-> 根據(jù)排名刪除元素 zcount key min max #-> 按照分?jǐn)?shù)范圍統(tǒng)計(jì)個(gè)數(shù)- 應(yīng)用情景:排行榜:有序集合經(jīng)典使用場(chǎng)景。例如視頻網(wǎng)站需要對(duì)用戶(hù)上傳的視頻做排行榜,榜單維護(hù)可能是多方面:按照時(shí)間、按照播放量、按照獲得的贊數(shù)等。
- String類(lèi)型
- 如何選用?
- 項(xiàng)目操作涉及到緩存操作, 首選 redis- memcache
- 如果確定使用redis, 此時(shí)需要考慮使用哪個(gè)數(shù)據(jù)類(lèi)型
- 如果要排序選用zset
- 如果數(shù)據(jù)是多個(gè)且允許重復(fù)選用list
- 如果數(shù)據(jù)是多個(gè)且不允許重復(fù)選用set
- 剩下的使用string
- 有些公司約定: 所有的redis的key跟value都使用字符串(排除使用zset場(chǎng)景)1>如果要排序選用zset;2>剩下的使用string
java list ---- redis JSON.toJsonString(list) java set --- redis set java set ----redis JSON.toJsonString(set) - java操作中如果使用各種類(lèi)型: list set其他的操作redis時(shí)需要明確指定的泛型, 麻煩所以有些公司統(tǒng)一規(guī)范, 統(tǒng)一使用字符串, 減少泛型操作
- 怎么設(shè)計(jì)key與value值
- 唯一性
- 可讀性(就是見(jiàn)名知意),比如
設(shè)計(jì)keyvalue 緩存用戶(hù)收藏文章列表 key value article_favor:uid1 [1,2,3,4] article_favor:uid2 [1,2,3,4] - 靈活性
- 時(shí)效性
- value的值根據(jù)需求決定
- redis高級(jí)命令
- keys * 查詢(xún)r(jià)edis中所有的key
- exists key 是否存在某個(gè)key(例:exists name是否存在name的鍵值對(duì))
- expire key seconds 使某個(gè)key經(jīng)過(guò)多少秒后失效(例:expire name 10 //表示10秒之后key為name的這個(gè)鍵值對(duì)就被干掉了)
- persist key 使操作了expire操作失效,即撤銷(xiāo)過(guò)期操作
- flushdb清空當(dāng)前的數(shù)據(jù)庫(kù),flushall清空所有數(shù)據(jù)庫(kù)
/*select 選擇數(shù)據(jù)庫(kù) 數(shù)據(jù)庫(kù)為0到15(一共16個(gè)數(shù)據(jù)庫(kù)) 默認(rèn)進(jìn)入的是0數(shù)據(jù)庫(kù) move [key] [數(shù)據(jù)庫(kù)下標(biāo)] 將當(dāng)前數(shù)據(jù)中的key轉(zhuǎn)移到其他數(shù)據(jù)庫(kù)中 randomkey 隨機(jī)返回?cái)?shù)據(jù)庫(kù)里的一個(gè)key rename重命名key echo 打印名 dbsize 查看數(shù)據(jù)庫(kù)的key數(shù)量 info 獲取數(shù)據(jù)庫(kù)信息 config get 實(shí)時(shí)傳儲(chǔ)收到的請(qǐng)求(返回相關(guān)的配置信息) config get * 返回所有配置*/ - redis安全性:
/*因?yàn)閞edis速度非???所以在一臺(tái)比較好的服務(wù)器下,一個(gè)外部用戶(hù)在一秒內(nèi)可以進(jìn)行15w次的密 碼嘗試,這意味你需要設(shè)定非常強(qiáng)大的密碼來(lái)方式暴力破解. vi編輯redis.conf文件,找到下面進(jìn)行保存修改 requirepass [密碼] 重啟服務(wù)器 pkill redis-server 再次進(jìn)入127.0.01:6379>keys * (error)NOAUTH Authentication required. 會(huì)發(fā)現(xiàn)沒(méi)有權(quán)限進(jìn)行查詢(xún)auth [密碼] 輸入密碼則成功進(jìn)入 每次進(jìn)入的時(shí)候都需要輸入免密,還有種簡(jiǎn)單的方式: redis-cli -a [密碼]*/ - redis事務(wù)
/*1.Redis的事務(wù)非常簡(jiǎn)單,使用方法如下: 首先是使用multi方法打開(kāi)事務(wù),然后進(jìn)行設(shè)置,這時(shí)設(shè)置的數(shù)據(jù)會(huì)放到隊(duì)列里進(jìn)行保存.最后使用exec執(zhí)行.把數(shù)據(jù)依次存儲(chǔ)到redis中.使用discard方法取消事務(wù) 2.注意注意注意:redis的事務(wù)并不是原子性的,它只是把一堆任務(wù)打包放到一起執(zhí)行,其中一個(gè)任務(wù)掛了,并不會(huì)影響其他任務(wù)的執(zhí)行,所以是個(gè)假事務(wù) */ - redis持久化機(jī)制:Redis是一個(gè)支持持久化的內(nèi)存數(shù)據(jù)庫(kù),也就是說(shuō)redis需要經(jīng)常將內(nèi)存中中的數(shù)據(jù)同步到硬盤(pán)來(lái)保證持久化;Redis持久化的兩種方式:
- RDB方式:snapshotting(快照)默認(rèn)方式.將內(nèi)存中以快照的方式寫(xiě)入到二進(jìn)制文件中.默認(rèn)為dump.rdb.可以配置設(shè)置自動(dòng)做快照持久化方式.我們可以配置redis在n秒內(nèi)如果超過(guò)m個(gè)key就修改自動(dòng)做快照.
Snapshotting設(shè)置: save 900 1 #900秒內(nèi)如果超過(guò)1個(gè)Key被修改則發(fā)起快照保存 save 300 10 #300秒內(nèi)如果超過(guò)10個(gè)key被修改,則發(fā)起快照保存 save 60 10000 - RDB方式,簡(jiǎn)而言之就是快照,相當(dāng)于把redis數(shù)據(jù)庫(kù),也就是內(nèi)存數(shù)據(jù)庫(kù),復(fù)制一份,然后粘貼到磁盤(pán)的dump.rdb文件中-->快照針對(duì)的是整個(gè)數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)里面所有的數(shù)據(jù),當(dāng)redis重新啟動(dòng)時(shí),就會(huì)把dump.rdb中所有的數(shù)據(jù)加載到內(nèi)存中去,其中有個(gè)致命的缺點(diǎn),就是快照是有時(shí)間間隔的,在間隔空隙里操作的數(shù)據(jù)可能丟失(不會(huì)保存在dump.rdb中)
- AOF方式:append-only file (縮寫(xiě)aof)的方式,由于快照方式是在一定時(shí)間間隔做一次,所以可能發(fā)生reids意外down的情況就會(huì)丟失最后一次快照后的所有修改的數(shù)據(jù).aof比快照方式有更好的持久化性,是由于在使用aof時(shí),redis會(huì)將每一個(gè)收到的寫(xiě)命令都通過(guò)write函數(shù)追加到命令中,當(dāng)redis重新啟動(dòng)時(shí)會(huì)重新執(zhí)行文件中保存的寫(xiě)命令來(lái)在內(nèi)存中重建這個(gè)數(shù)據(jù)庫(kù)的內(nèi)容.這個(gè)文件在bin目錄下:appendonly.aof
aof默認(rèn)是關(guān)閉的,如果要打開(kāi)可以去redis.windows.conf配置文件里面去修改 aof不是立即寫(xiě)到硬盤(pán)中,可以通過(guò)配置文件修改強(qiáng)制寫(xiě)到硬盤(pán)中. aof設(shè)置: appendonly yes #啟動(dòng)aof持久化方式有三種修改方式 appendfsync always #收到命令就立即寫(xiě)到磁盤(pán),效率最慢.但是能保證完全的持久化 appendfsync everysec #每秒寫(xiě)入磁盤(pán)一次,在性能和持久化方面做了很好的折中 appendfsync no #完全以依賴(lài)os 性能最好,持久化沒(méi)保證 - Redis內(nèi)存淘汰機(jī)制及過(guò)期Key處理:https://www.cnblogs.com/maguanyue/p/12090414.html
- RDB方式:snapshotting(快照)默認(rèn)方式.將內(nèi)存中以快照的方式寫(xiě)入到二進(jìn)制文件中.默認(rèn)為dump.rdb.可以配置設(shè)置自動(dòng)做快照持久化方式.我們可以配置redis在n秒內(nèi)如果超過(guò)m個(gè)key就修改自動(dòng)做快照.
- 基本使用:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.3</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> - 集成SpringBoot
在application.poperties中做好如下配置<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
編寫(xiě)java代碼#application.properties spring.redis.host=127.0.0.1 spring.redis.port=6379 #如果有密碼,這里才要設(shè)置 # spring.redis.password=admin@Autowired private StringRedisTemplate redisTemplate; @Test public void testRedisTemplate() { // 操作string redisTemplate.opsForValue().xx(); // 操作hash redisTemplate.opsForHash().xx(); // 操作list redisTemplate.opsForList().xx(); // 操作set redisTemplate.opsForSet().xx(); // 操作zset redisTemplate.opsForZSet().xx(); } ----------------------------------------- redisTemplate.opsForValue();//操作字符串 redisTemplate.opsForHash();//操作hash redisTemplate.opsForList();//操作list redisTemplate.opsForSet();//操作set redisTemplate.opsForZSet();//操作有序set
配置文件詳解:
- redis之詳解redis.conf配置文件_清風(fēng)自來(lái)-CSDN博客
- Redis (十三) redis-4.0.8 配置文件解讀 - 躍小云 - 博客園 (cnblogs.com)