色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

持久化數據到硬盤上并采用RocksDB作為存儲引擎

工程師鄧生 ? 來源:coding到燈火闌珊 ? 作者:李明 ? 2022-09-29 10:00 ? 次閱讀

在上一篇文章中,我們使用內存做數據的存儲。在這一篇文章中,我們持久化數據到硬盤上,采用RocksDB作為存儲引擎。同時也增加了一個service層,將命令解析和存儲邏輯提取到這一層中。

RocksDB 先在Cargo.toml文件中加入rocksdb依賴:

poYBAGM0_GqAZhS6AAAXGsoUAAs416.jpg

然后,在src/storage目錄下創建rocksdb_storage.rs文件。代碼如下:

 1#[derive(Debug)]
 2pubstructRocksDbStorage(DB);
 3
 4implRocksDbStorage{
 5pubfnnew(path:implAsRef)->Self{
 6Self(DB::open_default(path).unwrap())
 7}
 8}
 9
10implStorageforRocksDbStorage{
11fnget(&self,key:&str)->Result,Box>{
12letv=self.0.get(key)?.unwrap();
13Ok(Some(v.into()))
14}
15
16fnset(&self,key:&str,value:bytes::Bytes)->Result,Box>{
17self.0.put(key,value.clone()).unwrap();
18Ok(Some(value))
19}
20}
Service層 創建src/service目錄,然后創建mod.rs文件及cmd_service.rs文件。在mod.rs文件中加入如下代碼:
1pubmodcmd_service;
2
3pubtraitCmdService{
4//解析命令,返回Response
5fnexecute(self,store:&implStorage)->CmdResponse;
6}
在cmd_service.rs文件中為命令實現CmdService trait,代碼如下:
 1usecrate::{CmdResponse,CmdService,Get,Set};
 2
 3//為GET實現execute
 4implCmdServiceforGet{
 5fnexecute(self,store:&implcrate::Storage)->CmdResponse{
 6//從存儲中獲取數據,返回CmdResponse
 7matchstore.get(&self.key){
 8Ok(Some(value))=>value.into(),
 9Ok(None)=>"Notfound".into(),
10Err(e)=>e.into(),
11}
12}
13}
14
15//為SET實現execute
16implCmdServiceforSet{
17//存儲數據
18fnexecute(self,store:&implcrate::Storage)->CmdResponse{
19matchstore.set(&self.key,self.value){
20Ok(Some(value))=>value.into(),
21Ok(None)=>"Setfail".into(),
22Err(e)=>e.into(),
23}
24}
25}
在src/pb/mod.rs中實現從Bytes、&str、Box轉換為CmdResponse:
 1implFromforCmdResponse{
 2fnfrom(v:Bytes)->Self{
 3Self{
 4status:200u32,
 5message:"success".to_string(),
 6value:v,
 7}
 8}
 9}
10
11implFrom<&str>forCmdResponse{
12fnfrom(s:&str)->Self{
13Self{
14status:400u32,
15message:s.to_string(),
16..Default::default()
17}
18}
19}
20
21implFrom>forCmdResponse{
22fnfrom(e:Box)->Self{
23Self{
24status:500u32,
25message:e.to_string(),
26..Default::default()
27}
28}
29}
然后在src/service/mod.rs中加入service代碼:
 1//設置默認存儲為RocksDB
 2pubstructService{
 3store_svc:Arc>,
 4}
 5
 6//在多線程中進行clone
 7pubstructStoreService{
 8store:Store,
 9}
10
11implService{
12pubfnnew(store:Store)->Self{
13Self{
14store_svc:Arc::new(StoreService{store}),
15}
16}
17
18//執行命令
19pubasyncfnexecute(&self,cmd_req:CmdRequest)->CmdResponse{
20println!("===ExecuteCommandBefore===");
21letcmd_res=process_cmd(cmd_req,&self.store_svc.store).await;
22println!("===ExecuteCommandAfter===");
23cmd_res
24}
25}
26
27//實現Clonetrait
28implCloneforService{
29fnclone(&self)->Self{
30Self{
31store_svc:self.store_svc.clone(),
32}
33}
34}
35
36//處理請求命令,返回Response
37asyncfnprocess_cmd(cmd_req:CmdRequest,store:&implStorage)->CmdResponse{
38matchcmd_req.req_data{
39//處理GET命令
40Some(ReqData::Get(cmd_get))=>cmd_get.execute(store),
41//處理SET命令
42Some(ReqData::Set(cmd_set))=>cmd_set.execute(store),
43_=>"Invalidcommand".into(),
44}
45}

配置 我們修改配置,在conf/server.conf中加入RocksDB路徑
......[rocksdb_path]path = '/tmp/kvserver'
在src/config.rs中加入如下代碼:
 1//Server端配置
 2#[derive(Debug,Serialize,Deserialize)]
 3pubstructServerConfig{
 4......
 5pubrocksdb_path:RocksdbPath,
 6}
 7
 8......
 9
10//RocksDB存儲目錄
11#[derive(Debug,Serialize,Deserialize)]
12pubstructRocksdbPath{
13pubpath:String,
14}
修改kv_server 在kv_server.rs中使用service執行命令,刪除process_cmd函數:
 1#[tokio::main]
 2asyncfnmain()->Result<(),?Box>{
 3......
 4
 5//初始化Service及存儲
 6letservice=Service::new(RocksDbStorage::new(rocksdb_path));
 7
 8loop{
 9......
10letsvc=service.clone();
11
12tokio::spawn(asyncmove{
13//使用Frame的LengthDelimitedCodec進行編解碼操作
14letmutstream=Framed::new(stream,LengthDelimitedCodec::new());
15whileletSome(Ok(mutbuf))=stream.next().await{
16......
17
18//執行請求命令
19letcmd_res=svc.execute(cmd_req).await;
20
21......
22}
23info!("Client{:?}disconnected",addr);
24});
25}
26}

審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據存儲
    +關注

    關注

    5

    文章

    983

    瀏覽量

    51000
  • 編解碼
    +關注

    關注

    1

    文章

    140

    瀏覽量

    19645
  • Rust
    +關注

    關注

    1

    文章

    230

    瀏覽量

    6641

原文標題:用Rust實現KV Server-4 持久化存儲及service層

文章出處:【微信號:Rust語言中文社區,微信公眾號:Rust語言中文社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    SAS固態硬盤存儲技術

    SAS固態硬盤存儲技術是一種介于傳統硬盤和內存之間的存儲技術,在IOPS上,相比普通機械硬盤存儲速度快50
    發表于 06-18 05:00

    Docker持久數據存儲方案

    Docker持久存儲數據共享
    發表于 03-23 11:17

    硬盤是怎么來存儲數據的?

    存儲是模擬格式的音樂,而硬盤上存儲的是數字格式的數據。寫入時,磁頭線圈上加電,在周圍產生磁場,磁化其下的磁性材料;電流的方向不同,所以磁場的方向也不同,可以表示 0 和 1 的區別。
    發表于 07-07 08:03

    硬盤上數據是如何組織與管理的呢?

    硬盤的外部物理結構是由哪些部分組成的?硬盤的內部物理結構是由哪些部分組成的?硬盤存儲的邏輯結構是由哪些部分組成的?硬盤上數據是如何組織與管
    發表于 07-13 07:00

    OpenHarmony持久存儲UI狀態:PersistentStorage

    最好是小于2kb的數據,不要大量的數據持久,因為PersistentStorage寫入磁盤的操作是同步的,大量的數據本地
    發表于 10-19 14:34

    HarmonyOS數據管理與應用數據持久(一)

    為應用提供Key-Value鍵值型的數據處理能力,支持應用持久輕量級數據對其修改和查詢。當用戶希望有一個全局唯一
    發表于 11-01 16:27

    Rocksdb原理簡介

    Rocksdb作為當下nosql中性能的代表被各個存儲組件(mysql、tikv、pmdk、bluestore)作為存儲
    的頭像 發表于 06-01 17:17 ?939次閱讀
    <b class='flag-5'>Rocksdb</b>原理簡介

    如何開啟RDB持久方式

    ? RDB快照(Redis DataBase) RDB是一種快照存儲持久方式,具體就是將Redis某一時刻的內存數據保存到硬盤的文件當中,
    的頭像 發表于 06-25 11:52 ?924次閱讀
    如何開啟RDB<b class='flag-5'>持久</b><b class='flag-5'>化</b>方式

    Redis持久RDB方式介紹

    時Redis會自動將內存中的數據進行快照持久硬盤。 觸發快照的時機 符合自定義配置的快照規
    的頭像 發表于 10-09 14:56 ?529次閱讀
    Redis<b class='flag-5'>持久</b><b class='flag-5'>化</b>RDB方式介紹

    redis兩種持久方式的區別

    Redis是一款高性能、開源的鍵值存儲數據庫,它支持多種數據結構,并且具有高效的內存讀寫以及持久功能。Redis的
    的頭像 發表于 12-04 11:12 ?550次閱讀

    redis持久機制和如何實現持久

    File)。 RDB是Redis默認采用持久方式,它通過在指定時間間隔內將內存中的數據集快照寫入磁盤的二進制文件中,實現
    的頭像 發表于 12-05 10:02 ?486次閱讀

    redis持久機制優缺點

    Redis是一個基于內存的高性能鍵值存儲系統,它提供了多種持久機制來保證數據的可靠性。本文將詳細介紹Redis的持久
    的頭像 發表于 12-05 10:03 ?757次閱讀

    redis里數據什么時候持久

    Redis是一種開源的高性能、非關系型內存數據庫,它使用了鍵值對存儲數據,并且支持多種數據結構。 Redis提供了持久
    的頭像 發表于 12-05 10:05 ?478次閱讀

    EEPROM存儲器:實現數據持久存儲的關鍵組件

    在計算機系統中,存儲器是用于存儲數據和程序指令的關鍵部件。其中,EEPROM(電可擦除可編程只讀存儲器)作為一種非易失性
    的頭像 發表于 05-27 16:36 ?1613次閱讀

    硬盤擦除遇到硬盤上鎖怎么解決?完整指南告訴你

    本文深入探討硬盤上鎖原因及解決方案,提供PSID解鎖硬盤的詳細指南。了解硬盤加密、密碼遺失、Secure Erase中斷等導致硬盤鎖定的問題,
    的頭像 發表于 12-17 16:32 ?641次閱讀
    <b class='flag-5'>硬盤</b>擦除遇到<b class='flag-5'>硬盤上</b>鎖怎么解決?完整指南告訴你
    主站蜘蛛池模板: 免费无码一区二区三区蜜桃大 | 亚洲高清无码在线 视频 | 狠狠操伊人 | 免费国产久久啪久久爱 | 空姐内射出白浆10p 空姐厕所啪啪啪 | 欧美人与动牲交ZOOZ特 | 丰满女友bd高清在线观看 | 亚洲精品入口一区二区乱麻豆精品 | 羽月希被黑人吃奶dasd585 | 亚洲呦女专区 | 亚洲熟妇无码乱子AV电影 | 男人插曲视频大全免费网站 | 日韩中文字幕欧美在线视频 | 伊人久久综在合线影院 | 久久伊人免费 | 秋霞电影网伦大理电影在线观看 | 亚洲成片在线看 | 中国欧美日韩一区二区三区 | 日本高清加勒比 | 巨大乳hdbbw 巨爆乳中文字幕爆乳区 | 亚洲高清在线视频 | 午夜福利视频极品国产83 | 色久久一个亚洲综合网 | 97成人碰碰在线人妻少妇 | 邪恶肉肉全彩色无遮琉璃神社 | 另类欧美尿交 | 欧美另类老少配hd | 2022久久精品国产色蜜蜜麻豆 | 久久天堂视频 | 久久久久久久久久毛片精品美女 | 国产精品人妻无码久久久蜜桃臀 | 亚洲精品理论电影在线观看 | 午夜人妻理论片天堂影院 | 欧美重口绿帽video | 亚洲欧洲无码AV在线观看你懂的 | 一个人的视频在线观看免费观看 | 九九热视频 这里有精品 | 国产成人小视频在线观看 | 雪恋电影完整版免费观看 | 国语对白老女人8av 国语对白刺激真实精品 | 国产精品成人影院在线观看 |