網(wǎng)站開發(fā)自學還是培訓市場營銷計劃
??? 1.NOSQL、Redis概述,通用命令,redis五大數(shù)據(jù)類型,三大特殊數(shù)據(jù)類型
????????????? NOSQL概述:
???????????????????? (NOT ONLY SQL-不僅僅是SQL),泛指非關系型數(shù)據(jù)庫,為解決大規(guī)模數(shù)據(jù)集合多重數(shù)據(jù)種類帶來的挑戰(zhàn),尤其是大數(shù)據(jù)應用問題
???????????????????? 常見nosql:redis,hbase。
???????????????????? 和關系型數(shù)據(jù)的對比區(qū)別:數(shù)據(jù)之間沒有關聯(lián)關系,數(shù)據(jù)存儲在內(nèi)存中,操作數(shù)據(jù)相對較快。關系型數(shù)據(jù)庫數(shù)據(jù)之間存在關聯(lián)關系,數(shù)據(jù)存儲在磁盤中,操作數(shù)據(jù)非常耗時。
???????????????????? 優(yōu)點:成本低、查詢速度快、支持多種數(shù)據(jù)格式(基本數(shù)據(jù)類型、集合、對象、圖片、文檔等格式)、擴展性相對關系型數(shù)據(jù)庫較好。
???????????????????? 非關系型數(shù)據(jù)庫優(yōu)勢:復雜查詢較方便,事務的支持導致安全性很高。
???????????????????? 總結(jié):關系型數(shù)據(jù)庫和非關系型數(shù)據(jù)庫并非對立而是互補的關系,從而彌補對方的劣勢。一般將數(shù)據(jù)存儲在關系型數(shù)據(jù)庫中,非關系型數(shù)據(jù)庫中備份關系型數(shù)據(jù)庫的數(shù)據(jù)(熱點數(shù)據(jù)、高頻訪問且不常修改的數(shù)據(jù))。
???????????????????? 主流的nosql:
?????? ???????????????????? key-value存儲數(shù)據(jù)庫:redis。典型用于內(nèi)容緩存,處理大量數(shù)據(jù)的高訪問負載
??????????????????????????? 列存儲數(shù)據(jù)庫:Hbase。典型用于分布式的文件系統(tǒng)
??????????????????????????? 文檔型數(shù)據(jù)庫:Mongdb。典型用于web應用
??????????????????????????? 圖形數(shù)據(jù)庫:Neo4J。典型用于社交網(wǎng)絡
????????????? Redis概述:
???????????????????? C語言開發(fā)的高性能鍵值對數(shù)據(jù)庫,在內(nèi)存中就是一個Map集合。支持多種鍵值數(shù)據(jù)類型。key為字符串,value可是任意類型。
???????????????????? value類型分類:
??????????????????????????? 字符串類型-String:Map<String,String>
?????? ???????????????????? 散列類型-hash:Map<String,Map<String,String>>
??????????????????????????? 列表類型-list:Map<String,List<String>> 數(shù)據(jù)可重復
??????????????????????????? 集合類型-set:Map<String,Set<String>>?? 數(shù)據(jù)不可重復
??????????????????????????? 有序集合類型-sortedset:Map<String,sortedset<String>> 數(shù)據(jù)不可重復,支持排序
???????????????????? 應用場景:緩存、聊天室好友在線列表、任務隊列(秒殺、搶購、12306搶票)、應用排行榜、網(wǎng)站訪問統(tǒng)計、數(shù)據(jù)過期處理、分布式集群架構(gòu)中session分離
???????????????????? 相關指令
??????????????????????????? 數(shù)據(jù)庫操作指令:
?????????????????????????????????? 啟動redis,默認16個庫(編號從0至15),select 編號 選擇指定庫
?????????????????????????????????? 清空當前庫:FLUSHDB
?????????????????????????????????? 清空全部庫:FLUSHALL
?????????????????????????????????? 客戶端顯示中文:./redis-cli -p 700 --raw
??????????????????????????? 操作key相關指令:
?????????????????????????????????? DEL KEY[KEY...] 刪除單個或多個Key,返回刪除數(shù)量,不存在的key忽略
?????????????????????????????????? EXISTS KEY;判斷key是否存在,存在返回1,否則返回0
?????????????????????????????????? EXPIRE KEY seconds;為key設置生存時間,秒為單位,生存時間為0自動刪除。成功返回1
?????????????????????????????????? KEYS PATTERN;查找符合pattern的key
?????????????????????????????????? MOVE KEY DB;將Key移動到指定db中
?????????????????????????????????? PEXPIRE KEY milliseconds;為key設置生存時間,毫秒為單位。成功返回1,否則返回0
?????????????????????????????????? PEXPIREAT KEY milliseconds-timestap;為Key設置生存時間,以毫秒為單位設置過期的時間戳
?????????????????????????????????? TTL KEY ;以秒為單位,返回指定key的剩余存活時間
?????????????????????????????????? PTTL KEY ;以毫秒為單位,返回指定key的剩余存活時間
?????????????????????????????????? RANDOMKEY;隨機返回一個key
?????????????????????????????????? RENAME KEY NEWKEY;將Key命名修改為newkey
?????????????????????????????????? TYPE KEY ;返回KEY對應VALUE的類型。none(key不存在),string,list(列表),set(集合),zset(有序集合),hash(哈希表)
???????????????????? 5種數(shù)據(jù)類型
??????????????????????????? String:基礎存儲類型,在redis中二進制安全,存入和取出數(shù)據(jù)相同,最大容納數(shù)據(jù)長度512M。
?????????????????????????????????? 常用命令:
????????????????????????????????????????? set key value;例如:set company "sunny";key存在則進行覆蓋,返回 OK
????????????????????????????????????????? get key;返回key對應的值
????????????????????????????????????????? del key;刪除 key
??????????????????????????? 哈希類型-hash:適合存儲值對象信息,value是一個鍵值對,key 無序
?????????????????????????????????? 常用命令
????????????????????????????????????????? hset key field value 為指定key設置field/value鍵值對。給同一個field設置,后者會覆蓋前者
????????????????????????????????????????? hmset key1 field/value key2 field/value 為多個key設定field/value
????????????????????????????????????????? hget key field 返回指定Key中field的值
????????????????????????????????????????? hmget key field1 field2 field3 返回指定Key中多個field的值
????????????????????????????????????????? hdel key field [field … ] 刪除1個或多個字段,返回被刪除字段的個數(shù)
????????????????????????????????????????? hgetall key 獲取Key的所有數(shù)據(jù)
??????????????????????????? 列表類型-list:有序可重復,類似雙端隊列的數(shù)據(jù)結(jié)構(gòu),可作為redis實現(xiàn)消息隊列的數(shù)據(jù)結(jié)構(gòu)
?????????????????????????????????? 常用命令:
????????????????????????????????????????? lpush key values[value1 value2…] 在指定key關聯(lián)的list頭部添加這些元素,如果key不存在,則新建元素。添加成功,返回元素個數(shù)
????????????????????????????????????????? lpop key 返回key關聯(lián)鏈表的頭部元素
????????????????????????????????????????? rpop key 從尾部彈出元素
????????????????????????????????????????? lrange key start end 輸出該key的所有數(shù)據(jù)。示例:lrange key 0 10;輸出key對應list的索引0至索引10的數(shù)據(jù),即前11個元素
??????????????????????????? 列表類型-set(無序且不可重復)
?????????????????????????????????? 常用命令:
????????????????????????????????????????? sadd key values[value1、value2…] 向key對應set中添加數(shù)據(jù)
????????????????????????????????????????? smembers key 顯示key對應set中所有數(shù)據(jù)
????????????????????????????????????????? srem key members[member1、member2…] 刪除key對應set中指定數(shù)據(jù)
??????????????????????????? 有序列表類型-zset(sortedSet,可排序,可保證不重復),value中的每個元素都會關聯(lián)一個double類型的份數(shù),redis中正式通過分數(shù)來為元素實現(xiàn)從小到大的排序
?????????????????????????????????? 特點:可排序的set集合,相當于java中的treeSet
?????????????????????????????????? 常用命令:
????????????????????????????????????????? zadd key values[value1、value2…] 向key對應set添加元素
????????????????????????????????????????? zrange key start end? 通過索引區(qū)間返回指定范圍內(nèi)的元素,升序
????????????????????????????????????????? zrevrange key start end 通過索引區(qū)間返回指定范圍內(nèi)的元素,降序
????????????????????????????????????????? zrange key start end? [withscores]? 通過索引區(qū)間返回指定范圍內(nèi)的元素及其對應score數(shù)字,升序
????????????????????????????????????????? zrevrange key start end [withscores] 通過索引區(qū)間返回指定范圍內(nèi)的元素及其對應score數(shù)字,降序
???????????????????? redis通用命令
??????????????????????????? key pattern ;pattern表示格式,作用是獲取與pattern匹配的Key。* 表示任意1個或多個字符,?表示任意1個字符
??????????????????????????? exists key ;判斷key是否存在,存在返回1 否則返回0
??????????????????????????? type key ;返回key對應的value數(shù)據(jù)類型。none、string、list、set、zset、hash
??????????????????????????? expire key time;設置key的存活時間
???????????????????? 3種特殊數(shù)據(jù)類型
??????????????????????????? Hyperloglog 基數(shù)統(tǒng)計算法,類似于set數(shù)據(jù)類型,允許容錯,使用此類型。不允許容錯使用set即可
??????????????????????????? Bitmap 位存儲,操作二進制位來記錄。
??????????????????????????? Geospatial 地理位置
??? 2.redis持久化機制、RDB持久化、AOF持久化
????????????? REDIS持久化概述:
???????????????????? redis高性能原因是因為將數(shù)據(jù)保存在內(nèi)存中,為了保證redis重啟后數(shù)據(jù)不丟失,將數(shù)據(jù)從內(nèi)存保存到硬盤中,過程稱為持久化。
???????????????????? 持久化支持RDB和AOF兩種方式,可以單獨使用1種,也可以將2種進行結(jié)合使用。
???????????????????? 默認支持RDB持久化,無序配置。此機制是在固定時間間隔將內(nèi)存的數(shù)據(jù)集快照寫入磁盤。
???????????????????? AOF持久化以日志的形式記錄服務器所處理的寫操作,在redis啟動之初會讀取此文件來重建redis數(shù)據(jù)庫。以保證重啟后數(shù)據(jù)完整。
???????????????????? 持久化可通過配置來禁用
???????????????????? 可同時使用RDB和AOF持久化
????????????? RDB持久化,也稱快照(Snapshot)
???????????????????? RDB持久化特點:將內(nèi)存種數(shù)據(jù)以一定時間間隔,將內(nèi)存數(shù)據(jù)寫入硬盤中,默認持久化的方式,保存的文件以.rdb為后綴
???????????????????? 快照生成方式:客戶端方式(BGSAVE和SAVE指令)、服務器配置自動觸發(fā)
??????????????????????????? 客戶端方式之BGSAVE操作(并行操作):客戶端使用BGSAVE命令創(chuàng)建快照,當redis服務器收到客戶端發(fā)送的BGSAE命令,服務器會調(diào)用fork創(chuàng)建1個子線程,
???????????????????? ?????????????????????????????????????????????????????????????? 子線程負責快照寫入磁盤,主線程繼續(xù)處理命令請求??
??????????????????????????? 客戶端方式之SAVE操作(串行操作):客戶端使用SAVE命令創(chuàng)建快照,redis服務器收到客戶端發(fā)送的SAVE命令,服務器在快照完畢之前不會響應其他命令。此模式不常用
??????????????????????????? 配置自動觸發(fā):和Mysql的redo機制類似。如果在redis.conf種設置了save配置選項,redis會在選項滿足之后自動觸發(fā)一次BGSAVE命令,如果設置多個save配置選項,
???????????????????????????????????????????????? 其中一個滿足,也會執(zhí)行一次BGSAVE命令
??????????????????????????? 服務器接受客戶端shutdown指令:服務器收到客戶端的shutdown指令后,會執(zhí)行一個save命令,阻塞所有客戶端,不再執(zhí)行任何客戶端命令,并再save命令執(zhí)行完畢后關閉服務器
???????????????????? 配置生成快照名稱和位置:
??????????????????????????? 修改生成快照名稱:dbfilename dump.rdb
??????????????????????????? 修改生成位置 dir./
???????????????????? RDB(快照)持久化的缺點:
??????????????????????????? 無法保證系統(tǒng)高可用性質(zhì),即無法避免最大程度的數(shù)據(jù)丟失。因為一旦在持久化之前出現(xiàn)服務宕機,未來得及保存進入磁盤的數(shù)據(jù)就會丟失
????????????? AOF只追加日志文件
???????????????????? 特點:可將客戶端執(zhí)行的所有set命令記錄到日志文件中,AOF持久化會將被執(zhí)行的寫命令保存到AOF文件的末尾,以此來記錄數(shù)據(jù)變化;
?????????????????????????????????? 恢復內(nèi)存數(shù)據(jù),只需要將AOF文件中包含的寫命令從頭到尾執(zhí)行一次即可;
?????????????????????????????????? redis服務器啟動之初會讀取該文件,來重新構(gòu)建redis數(shù)據(jù)庫,從而保證數(shù)據(jù)完整
???????????????????? 開啟AOF持久化:
??????????????????????????? redis.conf默認配置中的AOF持久化機制是關閉的,需要配置中開啟。
??????????????????????????? 開啟步驟:修改 appendonly yes 開啟持久化;修改appendfilename "appendonly.aof"; 指定生成文件名稱
???????????????????? 日志追加頻率:
??????????????????????????? always:每次寫操作,都寫入磁盤,可最大程度減少數(shù)據(jù)的丟失,但是此同步策略需要對磁盤大量操作,因此redis處理速度會受到磁盤性能的限制。謹慎使用
??????????????????????????? everysec:每秒執(zhí)行一次同步,顯式的將多個命令存入磁盤。使用此方式和不使用此方式時性能相差無幾,同時每秒一次即便系統(tǒng)崩潰也只會丟失1S的數(shù)據(jù)。 推薦使用
??????????????????????????? no:由操作系統(tǒng)決定何時同步。不會對性能帶來影響,但是會丟失不定量數(shù)據(jù)。不推薦
???????????????????? 修改同步頻率:通過 appendfsync always/everysec/no 指定
????????????? AOF文件的重寫
???????????????????? AOF(日志文件)的缺點:持久化文件越來越大,為了壓縮AOF持久化文件,redis提供了AOF重寫(ReWriter)機制
???????????????????? AOF重寫可在一定程度上減小AOF文件的體積
???????????????????? 觸發(fā)重寫方式
??????????????????????????? 客戶端方式觸發(fā)重寫:執(zhí)行 BGREWRITEAOF 命令,不會阻塞redis服務
??????????????????????????? 服務端方式配置自動重寫:修改redis.conf文件中的 auto-aof-rewrite-percentage和auto-aof-rewrite-min-size。
?????????????????????????????????? 例如:auto-aof-rewrite-percentage值為100和auto-aof-rewrite-min-size 64mb。在開啟AOF持久化時,當AOF文件大于64M,并且AOF文件比上次重寫后體積大了至少幾倍,自動觸發(fā)
???????????????????? 重寫原理:將內(nèi)存中的數(shù)據(jù)庫用命令的方式重寫生成了一個AOF文件,來替換原來的文件
???????????????????? 重寫流程:
????????????? 持久化總結(jié)
???????????????????? RDB和AOF兩種方案可同時使用,也可單獨使用,也可都不使用。使用那種取決于用戶的數(shù)據(jù)和應用決定
???????????????????? 無論是使用RDB還是AOF,持久化文件都是保存在磁盤的,有必要除了持久化外,還應該對持久化文件進行備份(最好備份在多個地方)
???????????????????? RDB和AOF的選擇問題:
??????????????????????????? 對數(shù)據(jù)非常敏感,選擇AOF。但是文件體積較大,恢復速度較慢
??????????????????????????? 數(shù)據(jù)呈現(xiàn)階段有效性,選擇rdb,可做到階段內(nèi)數(shù)據(jù)無丟失,恢復速度較快。但是利用RDB實現(xiàn)緊湊的持久化會使得redis性能降低很多
??????????????????????????? 總之如果不能承受數(shù)分鐘以內(nèi)的數(shù)據(jù)丟失,對業(yè)務數(shù)據(jù)非常敏感選擇AOF;可以承受數(shù)分鐘以內(nèi)的數(shù)據(jù)丟失,且追求大數(shù)據(jù)集的恢復速度,選擇RDB。
??????????????????????????? 災難恢復選用RDB
??????????????????????????? 雙重保險策略,同時開啟AOF和RDB,重啟后先使用AOF進行數(shù)據(jù)恢復,降低丟失數(shù)據(jù),兩者同時開啟,數(shù)據(jù)恢復時會選擇忽略RDB,選擇AOF進行恢復,從而避免數(shù)據(jù)不一致或重復問題
??? 3.java操作redis、jedis連接池、使用redis緩存不常修改的數(shù)據(jù)
????????????? jedis基本使用:
???????????????????? redis不僅可通過命令操作,主流語言都有客戶端支持。官方推薦java客戶端使用jedis和redisson。企業(yè)中jedis使用居多
???????????????????? 實現(xiàn)步驟:引入jedis依賴;創(chuàng)建jedis對象;調(diào)用jedis對方的方法實現(xiàn)對string、list、set、zset、hash的操作
????????????? jedis連接池的基本概念:jedis資源的創(chuàng)建和消費非常消耗性能,jedis提供了池化技術,jedispool在創(chuàng)建時初始化一些連接資源存儲到池中,使用jiedis連接資源時間無需創(chuàng)建,從連接池中獲取,使用完畢后將jedis還給連接池,供其他請求使用。使用GenericObjectPoolConfig 和JedisPool來創(chuàng)建連接池
??? 4.spring boot整合redis核心api
????????????? springboot data redis 提供了stringredistemplate和redistemplate,stringredistemplate是redistemplate的子類。
????????????? 區(qū)別在于stringredistemplate的key和value只能是string,而redistemplate的key和value可以是object任意類型的數(shù)據(jù)。
????????????? 使用redistemplate默認是將對象序列化到redis中,因此放入的對象必須實現(xiàn)對象序列化接口 serializable
????????????? 實現(xiàn)步驟:引入依賴;配置連接;使用redistemplate進行操作
??? 5.redis事務、watch鎖、redis實現(xiàn)分布式鎖、數(shù)據(jù)的刪除策略、淘汰策略
????????????? redis事務
???????????????????? 定義:一系列預定義命令保證成一個整體(隊列),執(zhí)行時一次性按照添加順序依次執(zhí)行,中途不會中斷或干擾。
???????????????????? 本質(zhì):一組命令的集合
???????????????????? 沒有隔離級別的概念,所有命令在事務中并未直接執(zhí)行,只有在執(zhí)行exec命令時才會執(zhí)行
???????????????????? redis單條命令保證原子性,事務不保證原子性
???????????????????? 執(zhí)行步驟:開啟事務(multi),執(zhí)行操作,提交事務(exec)
???????????????????? 事務操作
??????????????????????????? 開啟事務 multi (設定事務開啟位置,后續(xù)所有指令均加入到事務中)
??????????????????????????? 取消事務 discard 終止當前事務的定義,在multi之后,exec之前
??????????????????????????? 執(zhí)行事務 exec 設定事務的結(jié)束位置,同時執(zhí)行事務,與multi成對出現(xiàn)??杀WC事務的一致性
??????????????????????????? 注意事項:定義事務中,命令存在語法錯誤,則事務中所有命令都不會執(zhí)行;
??????????????????????????????????????? 如果命令格式語法正確,但是無法正確執(zhí)行,則正確的命令會執(zhí)行,運行錯誤的命令不會執(zhí)行(例如對list執(zhí)行incr),已經(jīng)執(zhí)行完畢的命令對應數(shù)據(jù)不會自動回滾,需要自行回滾。
???????????????????? watch鎖:
??????????????????????????? 問題:線程1監(jiān)聽某個key,當事務還未執(zhí)行完,事務2操作了這個key,watch會通知線程1事務失敗
??????????????????????????? 基于特定條件的事務執(zhí)行:假如對已售空的商城進行補貨,多個采購員都可以進行,為了避免數(shù)據(jù)重復操作,所以在操作某一數(shù)據(jù)前,先鎖定要操作的數(shù)據(jù),一旦發(fā)生變化,終止當前事務
??????????????????????????? 基于特定條件的事務執(zhí)行(鎖):對key添加監(jiān)視鎖,在執(zhí)行exec操作前,如果Key發(fā)生了變化,則終止事務執(zhí)行。watch key1[kye2...].取消所有key的監(jiān)視 unwatch;
???????????????????????????
??????????????????????????? watch鎖操作:
?????????????????????????????????? 悲觀鎖:認為什么時候都會出問題,無論做什么都會加鎖
?????????????????????????????????? 樂觀鎖:認為什么時候都不會出現(xiàn)問題,所以不會加鎖,更新數(shù)據(jù)時候判斷一下,在此期間是否有人更改此數(shù)據(jù)(獲取version,更新的時候比較version)
????????????? redis中數(shù)據(jù)的刪除策略
???????????????????? 定時刪除、惰性刪除、定期刪除
????????????? 淘汰策略 ????
??? 6.mybatis自身本地緩存結(jié)合redis實現(xiàn)分布式緩存????? ??
????????????? redis實現(xiàn)分布式緩存
???????????????????? 緩存:計算機內(nèi)存中的一段數(shù)據(jù)
???????????????????? 內(nèi)存中數(shù)據(jù)特點:讀寫快、斷電立即丟失
???????????????????? 緩存解決的問題:提高網(wǎng)站吞吐量,網(wǎng)絡運行效率快,解決數(shù)據(jù)庫訪問壓力
???????????????????? 數(shù)據(jù)庫中極少修改的數(shù)據(jù)適合使用緩存,更多用于數(shù)據(jù)查詢
???????????????????? 本地緩存和分布式緩存的區(qū)別:本地緩存保存在應用服務器內(nèi)存中(mybatis的一級和二級緩存就是本地緩存);分布式緩存存儲在應用服務器之外的數(shù)據(jù)
???????????????????? 集群:將一種服務創(chuàng)建多個節(jié)點,放在一起共同對系統(tǒng)提供服務的過程稱為集群
???????????????????? 分布式:多個不同服務集群共同對系統(tǒng)提供服務的系統(tǒng)稱為分布式系統(tǒng)。
???????????????????? 利用mybatis自身本地緩存結(jié)合redis緩存實現(xiàn)分布式緩存:todo
??? 7.主從復制簡介、工作流程、常見問題
????????????? 主從復制簡介
???????????????????? redis集群實現(xiàn)高可用:避免單機redis服務故障,準備多臺服務器,互相連通,將數(shù)據(jù)復制多個副本保存在多個服務器上,連接在一起,并保證數(shù)據(jù)式同步的。
???????????????????? 即便其中1臺服務宕機,其他服務器依然可以繼續(xù)提供服務,實現(xiàn)redis的高可用,同時實現(xiàn)數(shù)據(jù)冗余備份。
???????????????????? 主從復制定義:即將master中的數(shù)據(jù)及時、有效的復制到slave中.master支持讀寫,在進行寫時間,將出現(xiàn)變化的數(shù)據(jù)自動同步至slave。
???????????????????? 主從復制作用:
?????????????????????????????????? 讀寫分離:master負責寫,slave負責讀取,提高服務器的讀寫負載能力
?????????????????????????????????? 負載均衡:基于主從結(jié)構(gòu),配合讀寫分離,由slave分擔master負載,并根據(jù)需求變化,改變slave數(shù)量,通過多個從節(jié)點分擔數(shù)據(jù)讀取負載,大大提高了redis服務器并發(fā)量和吞吐量
?????????????????????????????????? 故障恢復:master出現(xiàn)問題,slave提供服務,實現(xiàn)快速的故障恢復
?????????????????????????????????? 數(shù)據(jù)冗余:實時數(shù)據(jù)熱備份,持久化之外的一種數(shù)據(jù)冗余方式,slava和master數(shù)據(jù)同步
?????????????????????????????????? 高可用基石:基于主從機制,構(gòu)建哨兵模式和集群,實現(xiàn)redis高可用方案
????????????? 主從復制流程
???????????????????? 建立連接:準備階段,slave連接master。
??????????????????????????? 連接的三種方式:
?????????????????????????????????? 客戶端發(fā)送命令:slaveof masterip masterport;
?????????????????????????????????? 驅(qū)動服務器參數(shù):redis-server -slaveof masterip masterport
?????????????????????????????????? 服務器配置:slaveof masterip masterport
??????????????????????????? 斷開連接:slaveof no one;斷開連接后之前接受數(shù)據(jù)不會刪除,只是不在接收新的master數(shù)據(jù)????
???????????????????? 數(shù)據(jù)同步: master數(shù)據(jù)同步slave
???????????????????? 命令傳播:master后續(xù)執(zhí)行寫入操作,將數(shù)據(jù)同步slave
??? 8.哨兵機制Sentinel、哨兵原理
????????????? 哨兵機制sentinel
???????????????????? 哨兵概念:是redis的高可用性解決方案,由1個或多個sentinel實例構(gòu)成的sentinel系統(tǒng)可監(jiān)視多個主服務器,以及這些主服務器下的所有子服務器。
??????????????????????????? 當被監(jiān)視的主服務器下線時,自動將下線主服務器中的某個從服務器升級為新的主服務器。簡單來說哨兵就是帶有自動故障轉(zhuǎn)移功能的主從架構(gòu)。
??????????????????????????? 哨兵是一個分布式系統(tǒng),用于對主從結(jié)構(gòu)中的每臺服務器進行監(jiān)控,當master出現(xiàn)故障時,選擇新的master,并將所有slave連接到新的master
???????????????????? 哨兵作用
??????????????????????????? 監(jiān)控:不斷檢查master和slave是否正常運行,master存活檢測,master和slave運行情況檢測
??????????????????????????? 通知:當被監(jiān)控的服務器出現(xiàn)問題時,向其他(哨兵、客戶端)發(fā)送通知
??????????????????????????? 自動故障轉(zhuǎn)移:如果master宕機,斷開master和slave的連接,從slave中選取一個作為新的master,將其他slave和新的master建立連接,并告知客戶端新的master地址
??????????????????????????? 注意:哨兵也是一臺服務器,只是不提供服務。通常哨兵配置數(shù)量為單數(shù)。(避免選舉master同票)
????????????? 啟動哨兵機制?????
???????????????????? 配置多個哨兵:將redis中的sentinel.conf拷貝2份,在sentinel.conf中修改端口,以及設置master的端口地址,最后通過 redis-sentinel sentinel-端口號.conf即可啟動哨兵
????????????? 哨兵機制原理
???????????????????? 主從切換:哨兵在主從切換中經(jīng)歷了 監(jiān)控、通知、故障轉(zhuǎn)移 3個階段。
???????????????????? 監(jiān)控階段:啟動哨兵服務之后,哨兵之間會互相監(jiān)控,包括master及master下所有的slave節(jié)點信息。多個哨兵之間可相互通信,之間通過發(fā)布訂閱來互相通知
???????????????????? 通知階段:哨兵之間相互通知,哨兵通知客戶端
???????????????????? 故障轉(zhuǎn)移階段:某個哨兵向master服務器發(fā)送指令,此時master沒反應,也拿不到信息,哨兵意識到master宕機,將此消息告知另外2個哨兵,另外兩哨兵也向master發(fā)送請求,也得不到響應,此時master確定下線,隨后多個哨兵中會選出一個領頭的哨兵將master清楚,并在slave中選出一個新的master,將slave切換為新的master
??? 9.redis集群原理、緩存預熱、緩存擊穿、緩存穿透、緩存雪崩的解決方案
????????????? 集群架構(gòu)
???????????????????? 集群架構(gòu)概念
??????????????????????????? 概念產(chǎn)生背景:業(yè)務發(fā)展過程中遇到的瓶頸。redis提供服務OPS可達到10萬/S,當前業(yè)務ops已達到10萬/s;內(nèi)存單機容量為256G,當前業(yè)務需求內(nèi)存容量為1T。使用集群可解決上述問題
??????????????????????????? 集群:將同一個服務的多個節(jié)點放在一起,共同對系統(tǒng)提供服務的過程稱為集群。換言之集群就是將若干臺網(wǎng)絡連接起來,并提供統(tǒng)一的管理方式,對外呈現(xiàn)單機的服務效果。
??????????????????????????? 分布式:有多個不同服務集群共同對系統(tǒng)提供服務的系統(tǒng)稱為分布式系統(tǒng)
???????????????????? 集群架構(gòu)作用:
??????????????????????????? 分散單臺服務器的訪問壓力,實現(xiàn)負載均衡
??????????????????????????? 分散單臺服務器的存儲壓力,實現(xiàn)可擴展性
??????????????????????????? 降低單臺服務宕機帶來的宕機災難
???????????????????? redis集群原理
??????????????????????????? 所有redis節(jié)點彼此互聯(lián),通過二進制協(xié)議優(yōu)化傳輸速度和帶寬,每個redis節(jié)點都包含自己的master和slave,
??????????????????????????? 集群中節(jié)點宕機是集群中超過半數(shù)的節(jié)點檢測失效時才失效
??????????????????????????? 客戶端只需要連接集群中任意一個節(jié)點即可
??????????????????????????? 客戶端執(zhí)行set命令時,會通過CRC16算法,計算出其哈希槽的位置,根據(jù)該位置存儲到對應的node節(jié)點。執(zhí)行get操作時,會根據(jù)哈希槽的位置,去指定節(jié)點內(nèi)讀取數(shù)據(jù)。
??????????????????????????? 故障轉(zhuǎn)移將宕機的master節(jié)點的哈希槽由選出來的slave來接管,不會新創(chuàng)建哈希槽
????????????? redis集群搭建
???????????????????? https://blog.csdn.net/m0_37989980/article/details/107778257 二
????????????? redis企業(yè)解決方案
???????????????????? 緩存預熱
??????????????????????????? 定義:系統(tǒng)啟動前,提前將相關的緩存數(shù)據(jù)直接加載到緩存系統(tǒng),避免用戶先查詢數(shù)據(jù)庫,再將數(shù)據(jù)緩存的問題!
??????????????????????????? 解決問題:解決用戶請求先查詢數(shù)據(jù)庫,再將數(shù)據(jù)緩存的問題
??????????????????????????? 作用:用戶直接查詢事先被預熱的緩存數(shù)據(jù),加快查詢速度
??????????????????????????? 解決方案:
?????????????????????????????????? 統(tǒng)計訪問頻率較高的熱點數(shù)據(jù),并將統(tǒng)計數(shù)據(jù)分類,根據(jù)級別排序,優(yōu)先加載級別較高的熱點數(shù)據(jù),熱點數(shù)據(jù)主從預熱
?????????????????????????????????? 腳本程序固定觸發(fā)腳本預熱
???????????????????? 緩存雪崩
??????????????????????????? 定義:同一時間大面積的緩存失效,后面的請求都會直接請求數(shù)據(jù)庫,造成數(shù)據(jù)庫短時間內(nèi)接收大量請求而崩潰
??????????????????????????? 后果:數(shù)據(jù)庫服務器崩潰
??????????????????????????? 原因:較短時間內(nèi),緩存中較多的key集中過期
??????????????????????????? 解決方案(道):
?????????????????????????????????? 更多的頁面靜態(tài)化處理(模板+動態(tài)數(shù)據(jù))、構(gòu)建多級緩存架構(gòu)、針對慢SQL進行執(zhí)行計劃分析,進而優(yōu)化SQL、
?????????????????????????????????? 限流降級短時間內(nèi)犧牲用戶體驗,限制一部分請求,降低應用服務器壓力,請求低速運轉(zhuǎn)后再逐步放開訪問
??????????????????????????? 解決方案(術):
?????????????????????????????????? 數(shù)據(jù)有效期策略調(diào)整,根據(jù)業(yè)務有效期進行分類錯峰,過期時間使用固定時間+隨機值的方式,稀釋集中過期的key
?????????????????????????????????? 超熱數(shù)據(jù)使用永久key
???????????????????? 緩存擊穿
??????????????????????????? 定義:緩存中沒有但數(shù)據(jù)庫中有的數(shù)據(jù),一般是緩存時間到期,此時大量并發(fā)請求同一條數(shù)據(jù),緩存中沒有,查詢數(shù)據(jù)庫,從而造成數(shù)據(jù)庫崩潰
??????????????????????????? 原因:緩存中某一個熱點key過期,該Key訪問量巨大,多個請求都壓在這個Keys上,但是均為命中,redis短時間內(nèi)發(fā)起了大量對數(shù)據(jù)庫中同一數(shù)據(jù)的訪問
??????????????????????????? 解決方案(術):
?????????????????????????????????? 設置熱點數(shù)據(jù)永不過期、現(xiàn)場調(diào)整Key的過期時間、后臺定時刷新熱點key有效期
???????????????????? 緩存穿透(布隆過濾器解決)
??????????????????????????? 定義:緩存和數(shù)據(jù)庫中都沒有的數(shù)據(jù),導致所有請求都落在數(shù)據(jù)庫上,造成數(shù)據(jù)庫短時間接到大量請求而崩掉
??????????????????????????? 示例:例如數(shù)據(jù)庫及緩存中的數(shù)據(jù)都是從id為0開始自增,有人惡意請求id=-1的數(shù)據(jù),即緩存穿透
??????????????????????????? 解決方案:
?????????????????????????????????? 接口層增加校驗,如用戶鑒權(quán)校驗,id基礎校驗,小于等于0的直接攔截
?????????????????????????????????? 緩存和數(shù)據(jù)庫中都沒取到,可以設置為key-null,有效期短一點,30秒左右,可防止用戶針對同一個key進行暴力攻擊
?????????????????????????????????? 使用布隆過濾器,判斷請求的key是否存在
?????????????????????????????????? 布隆過濾器:
????????????????????????????????????????? 定義:是一個很長的二進制向量(bit數(shù)組)和一系列哈希函數(shù)(hash),用于檢索一個元素是否在一個集合中。
????????????????????????????????????????? 優(yōu)點:因為基于位數(shù)組和哈希算法,空間效率和查詢時間遠超一般算法
????????????????????????????????????????? 缺點:有一定的誤識別率和刪除困難,但是可以通過增加位數(shù)組大小和hash函數(shù)來降低誤識別率(無法避免)
????????????????????????????????????????? 添加數(shù)據(jù)過程:初始化之后,位數(shù)組中值都為0,當增加變量,會通過多個hash函數(shù)將元素映射到位數(shù)組中各個位上,將對應位置設置為1
????????????????????????????????????????? 查詢數(shù)據(jù)過程:通過多個hash函數(shù)將元素映射到位數(shù)組中各個位上,如果各個位都是1,則元素可能存在,但如果其中有位不為1,則元素一定不存在
???????????????????? 緩存降級
??????????????????????????? 定義:流量驟增,造成響應速度較慢,可對非核心緩存業(yè)務進行降級
??????????????????????????? 目的:保證核心服務可用。有些服務無法降級(如加入購物車、結(jié)算)
??????????????????????????? 服務降級目的:防止redis故障,導致數(shù)據(jù)庫一起發(fā)生雪崩問題,因此可對不重要的緩存數(shù)據(jù),采用服務降級策略。
??????????????????????????????????????????????????????? 例如redis出現(xiàn)問題,不去數(shù)據(jù)庫查詢數(shù)據(jù),而是直接返回默認值(兜底默認值)
??? 10.布隆過濾器解決緩存穿透問題
????????????? 人工智能學習網(wǎng)站:https://www.captainai.net/itcoke/
????????????? 目的:redis實現(xiàn)布隆過濾器
????????????? 使用場景:準確判斷某個數(shù)據(jù)是否在大數(shù)據(jù)集合中,并且不占用內(nèi)存
????????????? 簡介:一種數(shù)據(jù)結(jié)構(gòu),一串很長的二進制向量組成,可看作一個二進制數(shù)組,初始默認值都是0
????????????? 添加數(shù)據(jù):通過多個hash函數(shù),計算出在二進制數(shù)組中的位置,將其設置為1
????????????? 判斷數(shù)據(jù)是否存在:將元素通過hash函數(shù)算出在二進制數(shù)組中的位置,看其是否為1,如果都為1則可能存在,否則一定不存在
????????????? 優(yōu)點:二進制數(shù)據(jù),占用內(nèi)存極少,插入和查詢速度很快
????????????? 缺點:隨著數(shù)據(jù)增加,誤判率增加;無法判斷數(shù)據(jù)一定存在;無法刪除數(shù)據(jù)
????????????? redis實現(xiàn)布隆過濾器:
?????????????????? 在redis中,bitmaps提供了一套命令來操作類似字符串中的每一位(setbit、getbit、bitcount等),因此redis實現(xiàn)布隆過濾器底層是通過bitmap數(shù)據(jù)結(jié)構(gòu)。
???????????????????? Redission是在java中操作redis的庫,因此可利用Redission來實現(xiàn)布隆過濾器,也可用guava來實現(xiàn)布隆過濾器