主頁 > 軟體設計 > 我設計了個【方案】:比redis好10倍的kv庫【一統kv】

我設計了個【方案】:比redis好10倍的kv庫【一統kv】

2023-05-05 09:41:28 軟體設計

我設計的redis9.0方案:redis自帶中間件

基于ssd磁盤,此我設計了比redis更好的快取方案,此方案:沒有快取擊穿問題,沒有快取雪崩問題,沒有快取污染問題,沒有熱key問題,
不需要snap和aof,支持任何sql庫,sql庫不需要帶有任何分布式功能,

 基于ssd磁盤,此我設計了比redis更好的快取方案:在ssd上增加key的lru資訊,從ssd到網路存盤,到sql,

 

redis 好10倍 一統kv 1.0 博客園
2023-0503,這個方案目前是1.0,方案會持續修補更新,版本號也會變,

世界上為什么沒有這種3級資料庫?


cpu3級快取,大家都知道吧,
cpu3級快取的作用,大家都知道吧,就是分冷熱資料,冷資料淘汰,

那么為什么世界上,沒有一種【3級,冷熱資料自動分層,資料庫】?


--------【1級=記憶體級,lru佇列,】--------

記憶體級,lru佇列,佇列有容量限制,存盤redis兼容的資料型別,佇列中的每個鍵值,都有一個熱度值,
客戶端來讀,已有資料:已有資料直接回傳,
客戶端來讀,但本級無資料:絕不會去讀下級佇列,而是回傳本級沒有資料,解決快取污染問題,

整理佇列:只在沒有客戶端讀請求時做,
超出lru佇列的冷資料:放入寫佇列,寫后移除,
當記憶體空余超過多少mb時,讀下級佇列中,最熱的100條資料,把下級熱度值一并讀取,

記憶體中,永遠只有最熱的key,不支持客戶端,把key寫入記憶體,

記憶體中的某些key,有個屬性,此屬性阻止key寫入到ssd磁盤,這樣的key斷電將丟失,

 

--------【2級=ssd磁盤級,】--------

 

直讀請求:
1本級已有資料,回傳資料,不寫入上級佇列,支持限制并發數,
2本級無資料:則放入讀取下級佇列,定時從下級讀取,比如每隔2秒,讀取每個資料時,相鄰的16k資料一同讀取,回傳資料,不寫入上級佇列,
支持對客戶端ip,限制并發數,比如,建立一個以客戶端ip為key,ip{k1=v1; k2=v2}把已經向下級查找,但未回傳的資料,寫入到這個key中,
給這個key設定警告容量=50,最大容量=100,則超過100,回傳:太頻繁的查詢,
支持對一批客戶端ip,設定限制警告,最大并發數,

寫請求:維護一個很小的緩沖區,基本每秒寫入,

 

整理佇列:
lru佇列:佇列有容量限制,佇列中的每個鍵值,都有一個熱度值,
超出lru佇列的冷資料:放入寫佇列,定時寫入下級,寫后移除,
幾乎必須要有這個功能:從kv到非kv,比如到sql,到存盤,
定時計算出本級最熱的100個key,算出幾個,以供上級讀取,


1級2級lru之間,有一個邊緣,這個邊緣記錄在一個變數中,臨近此邊緣的資料,會被頻繁移出,移入,
有一個設定值:
上級寫下來的冷資料:標記為最冷-2,
上級寫下來的冷資料:標記為最熱-100,

ssd中的某些key,有個屬性,此屬性阻止key寫入到下級存盤,這樣的key斷電不會丟失,但遷移時會被丟棄,導致丟失,

通過半夜運行的統計功能插件,實作熱key分門別類統計,為資料分片,分集群提供建議,
提供一個管理員命令,手動變更key的熱度,


還可以在這個中間件中實作:
1對后端3級庫分庫分表,
2對后端3級庫讀寫分離,
3對后端3級庫:從未分庫分表,到分庫分表,讀寫分離轉換,
4對后端3級庫:從1種分庫分表,讀寫分離,轉換到另一種分庫分表,讀寫分離的轉換,
5分布式cap,做在此中間件上,不需要后端資料庫,帶有任何分布式功能,不需要后端資料庫,帶有主從功能,

問:不需要后端資料庫,帶有任何分布式功能,為什么?
問:它用什么實作的cap?
答:
中間件自己,通過客戶端2步提交,實作了對資料庫的cap,
2步提交是一種傳統cap的手藝,并不神奇,


6這種庫(你叫中間件也可以),支持多種后端nosql,sql庫,只需要,用各種語言開發插件即可,
7
* 功能以腳本為介面,采用插件的方式,
* 支持各種語言撰寫的插件,
* 插件運行后是獨立行程,支持各種資料庫的客戶端,
* 熱變更,沒有停服的概念,隨時啟動,停止所有功能,

 

集群:
通過一個標簽,如ip,或域名,或專案名,來標識集群peer,最終寫入檔案名,
對于集群,提供如下管理功能:
1 收,把ssd上的資訊,丟棄掉不需要保存的后,從每個集群peer,按照專案備份,
2 放,把備份的恢復到ssd上,
3 整理熱key,根據key的熱度,在每個peer上平均key,通過這一點,可以達到熱key永遠平均分布在每個peer,
經過熱key重新分布后,在每個peer上的鍵值對,和專案無法一一對應,即節點1上,有專案125的熱key,

沒有人能事先知道哪些key熱,我的方案通過在ssd上存盤key的熱度,通過一個每天半夜運行的熱key移動程式,達到了熱key平均分布在各個集群peer,

--------【3級=網路存盤,】--------

 

不分冷熱,存有所有資料,

 

--------【3級=任意sql,nosql資料庫,資料庫不需要帶cap,資料庫不需要帶主從,】--------

 

不分冷熱,存有所有資料,與上述3互斥,

 

 

--------【此資料庫的特性:】--------

 

1必須有2級存盤,即必須使用ssd,

2程式永遠只操作redis的kv物件,不關心是否有sql,
后端庫sql庫不關心kv功能,
因為所有的活,都被這個庫中的2級快取中的,中間件干了,

3對于一個冷讀取,至少需要等待3秒:即從3級庫hdd磁盤到2級磁盤等2秒,從2級磁盤到1級ssd等1秒,

4對于每個寫請求:可選寫入:4-1記憶體表示寫入成功,4-2寫入ssd表示寫入成功,4-3寫入hdd磁盤表示成功,4-4寫入分布式庫表示成功,
4-1會丟資料,丟資料情況為:斷電,行程死機,資料被列入佇列拋棄,234不會,這其中,最不重要的資料寫入4-1,其次大多數寫入4-2,剩下所有重要的資料寫入4-4,
從4-2,到4-3,或到4-4,只能管理員手動操作,給管理員提供一個命令即可,

5不需要redis的snap,和aof,落盤功能,因為上述234保證了資料安全,

ssd2級磁盤,相當于redis的snap,
hdd3級磁盤,相當于redis的snap的snap,但又不是單純的snap,這里面有很多種玩法,

5-1 hsnap比ssnap更大,是資料庫,這樣就不需要任何sql資料庫,nosql庫,
5-2 hsnap檔案的大小,格式,都可以自定義,
5-3 hsnap可以帶上域名,服務器ip,這樣就成了分布式快取,如此一來只需要網路上的2個副本,redis3主3從集群也沒必要了,


6redis只是快取,不能當庫用,redis不存冷資料,但這個庫可以,redis存盤空間有限,但這個庫可以看做空間無限,

6沒有快取擊穿問題,沒有快取雪崩問題,沒有快取污染問題,沒有熱key問題,


--------【結論】--------

 

記憶體快取 ---> ssd硬碟 ---> 網路存盤上的檔案
記憶體快取 ---> ssd硬碟 ---> nosql,sql資料庫 <--- 資料分析工具

 

問:為什么說redis集群沒必要了?為什么說redis集群錯了?

答:

網路磁盤分為:【單臺】,【冗余】,對于自帶冗余的網路磁盤,我們只需要簡單的寫入1臺即可,
這里我們只談:【單臺】,單臺需要從ssd讀取,寫入到所有2臺【單臺】網路磁盤,這里采用2步提交即可,
對于從【ssd】到【nosql,sql資料庫】也是采用2步提交,
也就是說redis的集群,維持心跳,都沒必要,
我再說明白點:
1客戶端給ab提交,帶著uuid,和寫入時間,只要成功寫入其中1臺ssd即可,
2讀的時候,任意1臺客戶機讀成功即可,

 

redis集群特色:
每個集群節點,只有部分資料,
通過分插槽的方法,盡量平均讀寫壓力,

本架構集群特色:

集群服務器不需要選主,沒有raft,不需要3,5節點,支持1-4節點,

每個節點【最多】只需要2臺網路副本,簡稱網路raid1,不分主,從,
基于2級磁盤ssd,可以人為手動,或組態檔自動,分庫,分表,合庫,合表,
繼而實作:分節點,合節點,


集群客戶端:


每個集群節點記憶體中,內有個key,含有所有集群的節點的ip,埠,版本,此key永遠存在記憶體中,
客戶端來讀,非本集群的key,回傳錯誤,
客戶端來寫,非本集群的key,回傳錯誤,
或者說從客戶端,選擇回傳資料的服務器,即,假如客戶端不知道某key所在的節點,客戶端首次讀寫某key,需要遍歷所有服務器,
得到某個key所在的服務器后,會把本key的服務器ip,埠,寫在本地,
也就是說,客戶端維持每個key的服務器屬性,這個屬性,保存到磁盤上,
當服務器上的key,遷移到其他服務器后,不會通知客戶端,只會回傳錯誤,此時,客戶端將從新遍歷服務器,以查找key的所在,

假設集群有10個節點,那么客戶端最多讀10次,才能讀到key值,
為了給這個操作提速,可以增加一個【key索引服務器】,
【key索引服務器】也是一個記憶體kv庫,它頻繁從10個節點上的ssd中,讀key,然后建立索引,
有了【key索引服務器】,客戶端只需要2次,即可讀到key值:
1讀key索引服務器,回傳此key所在的peer的ip,記錄在本地,
2從peer的ip,讀取值,
很顯然,集群節點少的情況,不需要【key索引服務器】,


問:為什么說redis的snap錯了?

答:
客戶端進來的資料,直接寫入ssd,相當于aof,
因為本架構不需要snap,本架構沒有snap程序,
在本架構中,1級快取寫入資料到ssd,必須經過lru,分buffer,分時段,寫入,這個程序最多耗時1-2秒,即分片寫入,
而行程重啟后,從下級ssd快取讀取,也只選擇ssd盤上lru佇列中的topn條資料,塞滿記憶體快取的95%即可,
或者說redis的缺點是:snap保存到磁盤時,丟失了lru佇列資訊,


--------【關于名字】--------

中文名字:一統kv
英文名字:kvAIO

這個資料庫架構,我看不但能夠一統kv,還能一統db,

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/551666.html

標籤:其他

上一篇:【訪問者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

下一篇:返回列表

標籤雲
其他(158453) Python(38117) JavaScript(25400) Java(18012) C(15221) 區塊鏈(8261) C#(7972) AI(7469) 爪哇(7425) MySQL(7157) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5334) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4565) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2432) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1964) Web開發(1951) HtmlCss(1932) python-3.x(1918) 弹簧靴(1913) C++(1912) xml(1889) PostgreSQL(1874) .NETCore(1857) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 我設計了個【方案】:比redis好10倍的kv庫【一統kv】

    基于ssd磁盤,此我設計了比redis更好的快取方案。此方案:沒有快取擊穿問題。沒有快取雪崩問題。沒有快取污染問題。沒有熱key問題。
    不需要snap和aof。支持任何sql庫,sql庫不需要帶有任何分布式功能。 ......

    uj5u.com 2023-05-05 09:41:28 more
  • 【訪問者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    簡介 訪問者模式(Visitor Pattern)是一種行為型模式。它封裝一個訪問者類,把各元素類的操作集合起來,目的是將資料結構與資料操作分離。在不改變原有元素類資料結構的前提下,改變了元素類的執行演算法。 當某些較為穩定的東西(資料結構或演算法),不想直接被改變但又想擴展功能,這時候適合用訪問者模式 ......

    uj5u.com 2023-05-05 09:41:21 more
  • 抽象工廠模式(Abstract Factory Pattern)

    回顧工廠方法設計模式的不足:具體產品增加時,系統中類的個數將成對增加,在一定程度上增加了系統的復雜度 模式動機 產品等級結構:產品等級結構即產品的繼承結構,即抽象產品與具體產品 產品族:在抽象工廠模式中,產品族是指由同一個工廠生產的,位于不同產品等級結構中的一組產品 模式定義 提供一個創建一系列相關 ......

    uj5u.com 2023-05-05 09:41:04 more
  • 【訪問者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    簡介 訪問者模式(Visitor Pattern)是一種行為型模式。它封裝一個訪問者類,把各元素類的操作集合起來,目的是將資料結構與資料操作分離。在不改變原有元素類資料結構的前提下,改變了元素類的執行演算法。 當某些較為穩定的東西(資料結構或演算法),不想直接被改變但又想擴展功能,這時候適合用訪問者模式 ......

    uj5u.com 2023-05-05 09:40:57 more
  • 中臺,真的是一場自欺欺人的騙局嗎?

    前段時間,隨著阿里集團CEO張勇的公開信發布,阿里集團也做出了歷史上最大的一次組織調整。



    隨著新的1+6+N的組織陣型的調整和落地,阿里曾經的中臺戰略,變得有點非常的尷尬了,似乎成為了一個巨大的爭議。 ......

    uj5u.com 2023-05-05 09:40:30 more
  • 我設計了個【方案】:比redis好10倍的kv庫【一統kv】

    基于ssd磁盤,此我設計了比redis更好的快取方案。此方案:沒有快取擊穿問題。沒有快取雪崩問題。沒有快取污染問題。沒有熱key問題。
    不需要snap和aof。支持任何sql庫,sql庫不需要帶有任何分布式功能。 ......

    uj5u.com 2023-05-05 09:40:21 more
  • 開發復雜軟體的系統方法(二)之軟體建模

    這幾周與公司的軟體開發專家(職稱)討論產品的軟體新架構與方案,主要涉及兩點 是否復用現有的核心機制 基于領域建模設計 關于第一點,雙方達成一致。 關于第二點,領域可以理解為業務,業務專家(產品經理,需求工程師,臨床工程師等)與研發人員一起,通過頭腦風暴、事件風暴、會議、協作等方式,使得研發人員對產品 ......

    uj5u.com 2023-05-04 08:11:46 more
  • 軟體開發、設計、架構的其他原則

    LOD:迪米特法則(Law of Demeter) CRP:合成復用原則(Composite Reuse Principle) DRY:不要重復你自己原則 (Don’t Repeat Yourself Principle) KISS:KISS原則 (Keep It Simple and Stupid ......

    uj5u.com 2023-05-04 08:11:42 more
  • 開發復雜軟體的系統方法(二)之軟體建模

    這幾周與公司的軟體開發專家(職稱)討論產品的軟體新架構與方案,主要涉及兩點 是否復用現有的核心機制 基于領域建模設計 關于第一點,雙方達成一致。 關于第二點,領域可以理解為業務,業務專家(產品經理,需求工程師,臨床工程師等)與研發人員一起,通過頭腦風暴、事件風暴、會議、協作等方式,使得研發人員對產品 ......

    uj5u.com 2023-05-04 08:11:10 more
  • 軟體開發、設計、架構的其他原則

    LOD:迪米特法則(Law of Demeter) CRP:合成復用原則(Composite Reuse Principle) DRY:不要重復你自己原則 (Don’t Repeat Yourself Principle) KISS:KISS原則 (Keep It Simple and Stupid ......

    uj5u.com 2023-05-04 08:11:05 more