潮人地東莞seo博客小編下面跟大家分享關于網站優化seo:網絡緩存服務器有怎樣軟件,Redis緩存、持久性、高可用性等問題,希望seo專員在做seo優化的過程中有所幫助,內容僅供參考。
?
1、 Redis作為緩存服務器
Redis作為緩存服務器是許多企業的選擇之一。雖然技術非常成熟,但也存在一些問題。它指的是緩存滲透、緩存崩潰和緩存失效的問題,然后是分布式鎖。
1.1緩存滲透
seo博客相關推薦閱讀:seo優化推廣:seo排名推廣技術代做(seo推廣軟件代理)
在今天的項目中,大多數采用垂直MVC架構。服務層調用DAO層,然后DAO層查詢數據庫。Redis作為緩存服務器,在服務層調用DAO層進行查詢時首先查詢緩存服務器。如果存在,則直接返回數據。否則,它將查詢數據庫。從中可以看出,這樣做大大減少了磁盤I/O操作,并減輕了數據庫的壓力。
現在讓我們假設數據庫中有ID從1到1000的數據。現在,如果有人手動模擬ID為1001的請求,則緩存服務器中不存在數據,因此他們將查詢數據庫。那就有問題了。如果查詢數據庫有大量無效請求。這勢必會對數據庫造成難以承受的壓力,這就是所謂的緩存滲透。
如何解決?

1.將查詢的空值直接保存到緩存服務器,但不建議這樣做,因為大量不同的請求ID也會查詢數據庫。
2.接口限流、降級和熔斷
在項目中,您必須限制重要接口的流量。對于上述惡意攻擊請求,您不僅必須限制流量,還必須做好降級和融合的準備。這可以有效地控制大量無效請求。
3.布隆過濾器
Bloomfilter類似于哈希集,用于快速確定集合中是否存在元素。它的典型應用場景是快速確定容器中是否存在密鑰,如果不存在則直接返回。Blum過濾器的關鍵是大多數企業選擇的哈希算法和容器大小。
1.2緩存故障
在高并發中,查詢一些熱點的值,但此時緩存剛剛過期,緩存丟失,導致大量請求直接落在數據庫上。此時,如此大量的請求可能會導致數據庫崩潰。
解決方案:
1.將熱點密鑰設置為永不過期。
2.使用互斥鎖。
以上兩種情況都屬于緩存失效,但有一些小細節。也就是說,多個緩存同時失敗,特別是在高并發期。為了避免多次緩存失敗的問題,我們可以在設置超時時使用固定時間+隨機時間。避免在緩存無法工作時大量查詢數據庫的請求。
1.3分布式鎖
通常,分布式鎖可以通過三種方式實現:1.樂觀數據庫鎖;2.基于ZooKeeper的分布式鎖;3.基于Redis的分布式鎖;這里只記錄了基于Redis的分布式鎖。
分布式鎖的要求:
互斥:確保在分布式應用程序集群中,同一鎖只能由一臺計算機上的一個線程同時執行。避免死鎖:當客戶端在持有鎖而未解鎖時崩潰時,它還可以確保其他客戶端可以鎖定。
首先請參見以下代碼:
公共列表<;商品>;GoodsManager(){System.out.println(“已調用業務層的GoodsManager方法”);return goodsDao.queryAllPage();//1.首先查詢緩存服務器List<;Goods>;goodsList=(List<redisTemplate。opsForValue()。獲取(“貨物”);if(goodsList==null){//2.應用分布式鎖RedisConnection conn=redisTemplate.getConnectionFactory().get-Connection();if(conn.setNX(“lock”.getBytes()),“1”.getBytes()){//3.為分布式鎖設置超時conn.expire(“lock“.getByte(),60);System.out.println(“查詢數據庫中的所有商品”);//4。緩存中沒有商品列表的數據goodsList=goodsDao。queryAllPage()//5.將結果放入緩存redisTemplate中。opsForValue()。set(“貨物”,goodsList);redisTemplate。快遞(“貨物”,5,TimeUnit.MI NUTES);//6.釋放分布式鎖conn.dl(“lock”.getBytes());}否則{try{Thread.sleep(50);goodsManager();}catch(InterruptedException e){e.printStackTrace();}}return goodsList;}else{//緩存服務器中商品列表的數據返回goodsList;}}前>
代碼設計思路:
1.請求調用方法。
2.進入Redis緩存,查詢是否存在。如果沒有,請查詢數據庫。
3.使用本機連接(setNX)獲取分布式鎖,然后設置超時。
設置超時時間的原因是,如果t
###2.1 Redis提供了兩種持久化方法:RDB:它是備份時Redis內存中的數據結構(我們稱之為快照)。AOF:用于在Redis執行寫入命令后,在一定條件下將執行的寫入命令依次保存在Redis文件中,然后依次執行這些保存的命令以回復Redis數據。
2.2 RDB原理分析
RDB持久性有兩種操作模式:持久性的手動操作。
save:在持久化完成之前,當前的Redis服務器將被阻止。應禁止在線使用。Bgsave:此觸發器方法派生一個子進程,該子進程負責持久化進程。因此,阻塞僅在分叉子進程時發生。
bgsave和save的最大區別是,bgsave不會阻止客戶端的寫入操作。然而,如果bgsave失敗,Redis將默認停止接受訪問操作,否則沒有人會注意到災難。如果你不想這樣做,你可以
停止寫入bgsave錯誤yes設置為no
另一種是自動觸發持久性。首先,我們可以在配置文件中配置快照規則。
保存900 1在900秒內執行寫入命令并使用快照備份
保存300 10在300秒內執行10個寫入命令并使用快照備份
保存60 10000在60秒內執行10000個寫入命令并使用快照備份
注意:當Redis執行備份命令時,禁止寫入該命令
2.3 AOF原理分析
一般來說,AOF的整個過程可以分為兩個步驟:一個是命令的實時寫入,另一個是重寫AOF文件以減小AOF文件的大小。
附加AOF文件的一般過程是:命令寫入-->;附加到aof_Buf(緩沖區)-->;同步到aof磁盤。為什么要先寫入buf緩沖區,然后將其同步到磁盤?因為實時寫入會帶來大量的磁盤I/O操作,這將大大降低系統性能。
有幾種關于AOF持久性的配置。
appendonly no是否啟用AOF備份。默
江門神馬seo排名認值為no,并且未啟用。如果需要啟用,則更改為yes。Appendfilename“appendonly.aof”定義了append命令編寫的文件是appendonly aof#appendfsync始終意味著執行的每個Redis命令都將同步保存到aof文件中。性能會受到影響,但安全性很高。Appendfsync everysec evarysec(默認值)表示每秒執行一次同步,性能將得到提高,但安全性將降低,一秒鐘內的命令可能會丟失#Appendfsync no表示同步未同步。同步命令需要手動執行。性能有保證,但安全性差。
2.4 Redis內存回收策略
在Redis中,conf中的配置項maxmemory策略用于配置Redis的內存回收策略以及當內存達到最大值時的內存處理方法。
Redis提供六種內存消除策略
易失性lru:allkeys-lru:Volatile random:allkeys random:avolatile ttl:noevication(默認):
在內存回收機制中,LRU算法和TTl算法在Redis中都不是精確的計算,而是近似算法。默認情況下,Redis配置了探測最大內存樣本數,默認值為3。
3、 Redis高度可用
3.1、主從復制
當用戶數量非常大時,單個Redis肯定是不夠的。因此,我們更喜歡讀/寫分離。讀/寫分離的前提是讀操作比寫操作更頻繁。將數據長期放置在多個服務器上可以消除單個服務器上的壓力。
因此,服務器設置如下圖所示:
假設一臺服務器負責寫操作,其他三臺服務器負責讀操作,以實現單獨的寫緩存功能。然而,存在一個明顯的缺點,即讀取數據的其他三個服務器之間的數據無法同步。這將導致數據不一致。此時,有必要在它們之間進行數據交換。
簡要介紹主從復制的概念。如上圖所示,主機負責寫入數據,其他三臺從機負責讀取數據。當寫入數據時,更新的數據將根據配置的屬性自動復制到其他三個服務器,從而實現服務器之間的數據一致性
哨兵是一個獨立的過程。Sentinel將檢測多個Redis服務器,包括主服務器和從服務器。發送命令以使Redis服務器響應并檢查其運行狀態。當哨兵檢測到主機停機時,它會自動將從機切換到主機,然后通知其他從機修改配置文件并通過發布訂閱模式切換主機。為了實現哨兵的高可用性,可以將其配置為多哨兵模式,即多個哨兵進程在不同的服務器上運行,以檢測各種Redis服務器,并且哨兵也會相互監視。在多哨兵模式下,一旦主設備關閉,哨兵1在檢測到該結果時不會立即故障切換,但只有哨兵1的主管認為主設備不可用。當其他哨兵也檢測到主人不可用,并且有一定數量的哨兵時,將在哨兵之間進行投票。投票結果由哨兵發起,將執行切換操作。切換完成后,每個哨兵將能夠通過發布和訂閱來切換他們監視的服務器的主機。
3.哨兵模式配置
3.1,#配置哨兵配置文件:
redis/src/ssentinel.conf
3.2,#禁用保護模式
保護模式否
3.3,#配置主監控服務。最后2個表示當兩個或多個哨兵認為主服務不可用時將執行故障切換
Sentinel監控服務器名稱(用戶定義)主服務IP端口2
3.4,#定義服務密碼
Sentinel auth pass服務器名稱(同上)密碼
3.5,#啟動哨兵模式;
./redis sentinel sentinel.conf
4.其他相關配置
毫秒后哨兵關閉:當哨兵檢測到Redis服務時,當Redis服務在一毫秒內無法應答時,單個哨兵考慮的主觀離線時間默認為30秒。
Sentinel故障切換超時:指定故障切換運行的毫秒數。當該數字超過此數字時,故障切換將被視為失敗。默認值為3分鐘。長春百度seo優化排名
哨兵通知腳本:指定哨兵檢測到Redis實例異常時要調用的警報腳本。
3.3.碎片集群
分片集群的原理是多個緩存服務器兩兩通信,每個副本集有一個主實例和多個從實例。此外,每個副本集在數據庫中存儲一部分鍵值對,這解決了主從副本集中總數據存儲的最小實例的限制,并大大擴展了緩存服務器的大小。
結構圖如下:
1.碎片集群的特點
1.客戶端直接連接到Redis節點,不需要中間代理層。
2.Redis集群將所有物理節點映射到[0-136383]插槽,由集群負責維護。
3.所有Redis節點彼此互連(PING-ONG短視頻抖音seo排名前十機制),內部使用Gossip二進制協議優化數據傳輸。
4.當集群中超過一半的節點發生故障時,節點故障檢測生效。
==問題:Redis集群中內置了16384個哈希槽。Redis集群如何決定將密鑰放入哪個插槽==
當一個鍵值被放置在redis集群中時,redis首先使用crc16算法來計算該鍵的結果,然后將結果的剩余部分計算為16384。這樣,每個鍵將對應于一個編號為0-16383的哈希槽。redis將根據節點的數量大致相等地將哈希槽映射到不同的節點。
2.集群建設步驟
前提條件:
刪除appendonly。aof,轉儲。Redis/src下的rdb、nodes-6379.conf文件。
1.修改redis。conf,配置集群信息,并啟用集群,
Cluster enabled yes指定群集的配置文件,
群集配置文件節點port.conf
2.使用redis trib。rb來構建集群。因為redis trib。rb是一個用Ruby實現的Redis集群管理工具,我們需要先安裝Ruby環境
2.1.安裝Ruby
yum-y安裝zlib-ruby-rubygems
2.2安裝Rubygems的Redis依賴項
gem安裝-l redis-3.3.0.gem
3.安裝依賴環境后,我們可以使用script命令
注意:此腳本文件位于解壓縮目錄src中。
執行命令:
./redis三角形。Rb創建--副本0 192.168.10.167:6379 192.168.10.167:3380 192.168.10.167:8381打開16379 Redis端口+1W
以上是潮人地東莞seo博客跟大家分享關于網站優化seo:網絡緩存服務器有怎樣軟件,Redis緩存、持久性、高可用性等問題,希望能對大家有所幫助,若有不足之處,請諒解,我們大家可以一起討論關于網站seo優化排名的技巧,一起學習,以上內容僅供參考。