Redis相關(guān)

Redis相關(guān)

  • 數(shù)據(jù)庫(kù)類(lèi)型
    1. 關(guān)系型數(shù)據(jù)庫(kù):Oracle,MySQL,SqlServer,DB2

    2. 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
    3. 非關(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)境.
    4. 與關(guān)系型數(shù)據(jù)區(qū)分:
      關(guān)系型數(shù)據(jù)庫(kù)最典型的數(shù)據(jù)結(jié)構(gòu)是表,由二維表及其之間的聯(lián)系所組成的一個(gè)數(shù)據(jù)組織

      • 優(yōu)點(diǎn):
        1. 易于維護(hù):都是使用表結(jié)構(gòu),格式一致;
        2. 使用方便:SQL語(yǔ)言通用,可用于復(fù)雜查詢(xún);
        3. 復(fù)雜操作:支持SQL,可用于一個(gè)表以及多個(gè)表之間非常復(fù)雜的查詢(xún)。
      • 缺點(diǎn):
        1. 讀寫(xiě)性能比較差,尤其是海量數(shù)據(jù)的高效率讀寫(xiě);
        2. 固定的表結(jié)構(gòu),靈活度稍欠;
        3. 高并發(fā)讀寫(xiě)需求,傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)來(lái)說(shuō),硬盤(pán)I/O是一個(gè)很大的瓶頸。
    5. 非關(guān)系型數(shù)據(jù)庫(kù)嚴(yán)格上不是一種數(shù)據(jù)庫(kù),應(yīng)該是一種數(shù)據(jù)結(jié)構(gòu)化存儲(chǔ)方法的集合,可以是文檔或者鍵值對(duì)等。

      • 優(yōu)點(diǎn):
        1. 格式靈活:存儲(chǔ)數(shù)據(jù)的格式可以是key,value形式、文檔形式、圖片形式等等,文檔形式、圖片形式等等,使用靈活,應(yīng)用場(chǎng)景廣泛,而關(guān)系型數(shù)據(jù)庫(kù)則只支持基礎(chǔ)類(lèi)型。
        2. 速度快:nosql可以使用硬盤(pán)或者隨機(jī)存儲(chǔ)器作為載體,而關(guān)系型數(shù)據(jù)庫(kù)只能使用硬盤(pán);
        3. 高擴(kuò)展性;
        4. 成本低:nosql數(shù)據(jù)庫(kù)部署簡(jiǎn)單,基本都是開(kāi)源軟件。
      • 缺點(diǎn):
        1. 不提供sql支持,學(xué)習(xí)和使用成本較高;
        2. 無(wú)事務(wù)處理;
        3. 數(shù)據(jù)結(jié)構(gòu)相對(duì)復(fù)雜,復(fù)雜查詢(xún)方面稍欠。
  • 什么是redis?
    1. redis定位是緩存, 提高數(shù)據(jù)讀寫(xiě)速度, 減輕對(duì)數(shù)據(jù)庫(kù)存儲(chǔ)與訪問(wèn)壓力
    2. 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):
        1. 對(duì)數(shù)據(jù)高并發(fā)讀寫(xiě)(直接是內(nèi)存中進(jìn)行讀寫(xiě)的)
        2. 對(duì)海量數(shù)據(jù)的高效率存儲(chǔ)和訪問(wèn)
        3. 對(duì)數(shù)據(jù)的可拓展性和高可用性.
        4. 單線程操作,每個(gè)操作都是原子操作,沒(méi)有并發(fā)相關(guān)問(wèn)題(redis 6)
      • 缺點(diǎn):
        1. redis(ACID處理非常簡(jiǎn)單)
        2. 無(wú)法做太復(fù)雜的關(guān)系數(shù)據(jù)庫(kù)模型
    3. 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)型
    1. 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)用情景:
        1. 計(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
        2. 共享session:出于負(fù)載均衡的考慮,分布式服務(wù)會(huì)將用戶(hù)信息的訪問(wèn)均衡到不同服務(wù)器上,用戶(hù)刷新一次訪問(wèn)可能會(huì)需要重新登錄,為避免這個(gè)問(wèn)題可以用redis將用戶(hù)session集中管理,在這種模式下只要保證redis的高可用和擴(kuò)展性的,每次獲取用戶(hù)更新或查詢(xún)登錄信息都直接從redis中集中獲取。
    2. 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)用情景:
        1. 哈希結(jié)構(gòu)相對(duì)于字符串序列化緩存信息更加直觀,并且在更新操作上更加便捷。所以常常用于用戶(hù)信息等管理,
        2. 但是哈希類(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ù)成本高
        3. 開(kāi)發(fā)中不建議使用hash, 如果真的需要用到, 使用對(duì)象, 轉(zhuǎn)換成json格式字符串
    3. 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.....]
    4. 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)用情景:
        1. 去重;
        2. 抽獎(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
    5. 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ù)等。
  • 如何選用?
    1. 項(xiàng)目操作涉及到緩存操作, 首選 redis- memcache
    2. 如果確定使用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)
      
    3. java操作中如果使用各種類(lèi)型: list set其他的操作redis時(shí)需要明確指定的泛型, 麻煩所以有些公司統(tǒng)一規(guī)范, 統(tǒng)一使用字符串, 減少泛型操作
    4. 怎么設(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í)命令
    1. keys * 查詢(xún)r(jià)edis中所有的key
    2. exists key 是否存在某個(gè)key(例:exists name是否存在name的鍵值對(duì))
    3. expire key seconds 使某個(gè)key經(jīng)過(guò)多少秒后失效(例:expire name 10 //表示10秒之后key為name的這個(gè)鍵值對(duì)就被干掉了)
    4. persist key 使操作了expire操作失效,即撤銷(xiāo)過(guò)期操作
    5. 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 * 返回所有配置*/
      
    6. 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 [密碼]*/
      
    7. 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ù)
          */
      
    8. 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
  • 基本使用:
    <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
        <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>
    
    在application.poperties中做好如下配置
        #application.properties
        spring.redis.host=127.0.0.1
        spring.redis.port=6379
        #如果有密碼,這里才要設(shè)置
        # spring.redis.password=admin
    
    編寫(xiě)java代碼
        @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
    

配置文件詳解:

  1. redis之詳解redis.conf配置文件_清風(fēng)自來(lái)-CSDN博客
  2. Redis (十三) redis-4.0.8 配置文件解讀 - 躍小云 - 博客園 (cnblogs.com)

linux上部署:centos6.9 安裝redis_dushan1234的專(zhuān)欄-CSDN博客_centos6.9安裝redis

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Redis相關(guān) Reids沒(méi)有直接使用C語(yǔ)言傳統(tǒng)的字符串表示,而是自己構(gòu)建了一種名為簡(jiǎn)單動(dòng)態(tài)字符串(simple ...
    萬(wàn)福來(lái)閱讀 398評(píng)論 0 0
  • 1、什么是Redis? Redis 是完全開(kāi)源免費(fèi)的, 遵守 BSD 協(xié)議, 是一個(gè)高性能的 key-value ...
    陳二狗想吃肉閱讀 412評(píng)論 0 5
  • 優(yōu)點(diǎn) 內(nèi)存型數(shù)據(jù)庫(kù),讀寫(xiě)速度快 支持的數(shù)據(jù)類(lèi)型豐富 支持事務(wù) 特性豐富, 可用于緩存、消息隊(duì)列、按 key 設(shè)置過(guò)...
    MuMu童鞋閱讀 502評(píng)論 1 0
  • 什么是Redis ??Redis首先是一個(gè)存儲(chǔ)數(shù)據(jù)庫(kù),數(shù)據(jù)在緩存在內(nèi)存中,數(shù)據(jù)是K-V結(jié)構(gòu)。 Redis的使用 R...
    OPice閱讀 552評(píng)論 0 0
  • 1、什么是Redis ??Redis是一個(gè)高性能的key/value的分布式內(nèi)存數(shù)據(jù)庫(kù),基于內(nèi)存運(yùn)行并支持持久化的...
    小胖六閱讀 471評(píng)論 3 0

友情鏈接更多精彩內(nèi)容