當前位置:成語大全網 - 書法字典 - redis是如何實現的?

redis是如何實現的?

第壹:什麽是Redis?

Redis是壹個基於內存、持久日誌類型、鍵值數據庫的高性能存儲系統,並提供多種語言的API。

第二:背景。

數據結構需求越來越多,memcache中卻沒有,影響了開發效率。

隨著讀取操作量的增加,需要解決性能要求,經歷的過程如下:

數據庫讀寫分離(M/S)-》數據庫使用多個從服務器-》增加高速緩存(memcache)-》轉到Redis

解決寫作問題:

水平拆分,拆分表,將壹些用戶放在這個表中,將壹些用戶放在另壹個表中;

可靠性要求?

緩存的“雪崩”問題是否令人困惑?

緩存面臨快速恢復的挑戰。

開發成本要求?

維護緩存和DB壹致性的成本越來越高(先清理DB,再清理緩存,不行,太慢了!)?

發展是否需要跟上不斷增長的產品需求?

硬件成本最貴的是數據庫級別的機器,基本上比前端機器貴幾倍。它主要是IO密集型的,消耗硬件。

維護復雜性?

壹致性維護成本越來越高;?

BerkeleyDB使用B-tree,會壹直寫新的,內部不會有文件重組;這將導致文件越來越大;大了需要建檔,建檔操作要定期做;?

這樣,妳需要有壹定的停機時間;;

基於以上考慮,選擇了Redis。

第三,Redis在新浪微博中的應用。

Redis簡介

1.支持五種數據結構。

支持字符串,散列,列表,集合,排序集?

字符串是計數存儲的壹種很好的存儲方法。Sets非常適合構建索引庫;

2.K-V存儲與K-V緩存

目前新浪微博使用的應用98%是持久應用,2%是緩存,使用600+服務器?

Redis中的持久化應用和非持久化方式沒有太大區別:?

非持久是8-9萬tps,那麽持久大概是7-8萬TPS;?

在使用持久化時,需要考慮持久化與寫入性能的比值,即需要考慮redis使用的內存大小與硬盤寫入速度比值的計算;

3.活躍社區

目前Redis有3萬多行代碼,代碼簡潔,有很多巧妙的實現。作者有技術潔癖嗎?

Redis的社區活躍度很高,是衡量開源軟件質量的重要指標。在開源軟件的起步階段,壹般沒有商業化的技術服務支持。如果沒有活躍的社區支持,遇到問題時就無處求助。

Redis基本原則

Redis持久性(aof)附加在線文件:?

寫日誌(aof),在壹定程度上與內存合並,追加和追加,順序寫入磁盤,對性能影響不大。

1.單實例單流程

Redis使用單個進程,因此在配置時,壹個實例將只使用壹個CPU;?

配置時,如果需要最大化Cpu利用率,可以配置與CPU數量對應的Redis實例數量和與端口數量對應的Redis實例數量(8核CPU,8個實例,8個端口),以提高並發性。

單機測試時單機數據為200字節,測試結果為80,000 ~ 90,000 tps。

2.分身術

過程:將數據寫入主機–》主機存儲在從機的rdb中–》從機將rdb加載到內存中。?

保存點:網絡斷開時,連接後繼續傳輸。

主從方式下的第壹次同步是完全傳輸,隨後是增量同步;、

3.數據壹致性

長期運行後多個節點之間存在不壹致的可能性;?

開發兩個工具程序:?

1.對於數據量較大的數據,會定期進行全量檢查;?

2.實時檢查增量數據的壹致性;

主庫與從庫不能及時同步所導致的不壹致稱為延遲問題;?

對於壹致性要求不那麽嚴格的場景,我們只需要保證最終的壹致性即可;?

對於延遲問題,需要分析業務場景的特點,從應用層面添加策略來解決這壹問題;?

比如:?

1.新註冊的用戶必須首先查詢主圖書館;?

2.註冊成功後需要等待3s後才能跳轉,此時後臺正在做數據同步。

第四,分布式緩存的架構設計。

1.建築設計

因為redis是單點,需要在項目中使用,必須自己分發。基本架構圖如下:

2.分布式實現

通過key的壹致性哈希,實現了key對應的redis節點的分布。

壹致散列的實現;

Lhash值計算:通過支持MD5和MurmurHash,默認采用MurmurHash這種高效的哈希計算方式。

l壹致性的實現:通過java的TreeMap模擬環形結構,實現均勻分布。

3.3 .客戶的選擇

jedis的修改主要是分區模塊的修改,使其支持根據BufferKey進行分區,並且可以根據不同的redis節點信息初始化不同的ShardInfo。同時修改了JedisPool的底層實現,使其連接池支持key和value的構造方法,可以根據不同的shardinfo創建不同的jedis連接客戶端,達到分區供應用層調用的效果。

4.模塊的描述

l臟數據處理模塊,用於處理失敗的緩存操作。

l屏蔽監控模塊,監控jedis操作的異常,當某個節點異常時,可以控制redis節點的切除等操作。

整個分布式模塊通過hornetq切斷異常redis節點。對於新節點的添加,您還可以通過reload方法添加它們。(該模塊也可以輕松實現以添加節點。)

上述分布式架構的實現滿足了項目的需求。此外,對於壹些重要的緩存數據,可以單獨設置壹些redis節點來設置特定的優先級。此外,對於緩存接口的設計,我們還可以根據需要實現基本接口和壹些特殊的邏輯接口。對於cas相關的操作,以及壹些東西,操作都可以通過它的watch機制來實現。

免責聲明:所有博客都為分布式框架服務。作為框架的技術支撐和解釋,該框架面向企業,是壹個大規模的互聯網分布式企業架構。稍後將介紹在linux上部署高可用性集群的項目。