在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    993

    瀏覽量

    51569
  • 編解碼
    +關注

    關注

    1

    文章

    144

    瀏覽量

    19945
  • Rust
    +關注

    關注

    1

    文章

    233

    瀏覽量

    6909

原文標題:用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 ?1134次閱讀
    <b class='flag-5'>Rocksdb</b>原理簡介

    如何開啟RDB持久方式

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

    Redis持久RDB方式介紹

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

    redis兩種持久方式的區別

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

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

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

    redis持久機制優缺點

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

    redis里數據什么時候持久

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

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

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

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

    本文深入探討硬盤上鎖原因及解決方案,提供PSID解鎖硬盤的詳細指南。了解硬盤加密、密碼遺失、Secure Erase中斷等導致硬盤鎖定的問題,
    的頭像 發表于 12-17 16:32 ?3161次閱讀
    <b class='flag-5'>硬盤</b>擦除遇到<b class='flag-5'>硬盤上</b>鎖怎么解決?完整指南告訴你
    主站蜘蛛池模板: 四虎4hu| 亚洲高清免费观看 | 91视频观看 | 国产成人综合一区人人 | 97午夜理伦片在线影院 | 国产999星空传媒在线观看 | 免费的黄色的视频 | 你懂的手机在线观看 | 一级毛片真人免费观看 | 羞羞影院男女午夜爽爽影视 | 四虎影永久地址www 四虎影永久在线观看精品 四虎影永久在线观看网址 四虎影院.com | 亚洲小说区图片区另类春色 | 在线毛片免费 | 四虎影院一区二区 | 欧美亚洲综合在线观看 | 色综合天天五月色 | 国产成人精品曰本亚洲78 | 3344在线 | 高清激情小视频在线观看 | 李老汉的性生生活1全部 | 亚洲第一成年网 | 男男污肉高h坐便器调教 | 深夜视频免费在线观看 | 二级黄绝大片中国免费视频 | 免费看国产精品久久久久 | jzzjlzz亚洲乱熟在线播放 | 美女被免费视频的网站 | 97人人草| 亚洲网站在线观看 | 成人精品一区二区三区电影 | 黄色1级视频| 成人午夜小视频手机在线看 | 日本三级黄在线观看 | 久久精品夜色国产 | 女人被两根一起进3p在线观看 | 男人和女人在床做黄的网站 | 国产综合精品久久久久成人影 | 欧美久久综合 | 国产香港日本三级在线观看 | 欧美一区二区不卡视频 | 亚洲视频在线一区 |