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

    文章

    900

    浏览量

    50594
  • 编解码
    +关注

    关注

    1

    文章

    138

    浏览量

    19340
  • Rust
    +关注

    关注

    1

    文章

    223

    浏览量

    6387

原文标题:用Rust实现KV Server-4 持久化存储及service层

文章出处:【微信号:Rust语言中文社区,微信公众号:Rust语言中文社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    教你如何在硬盘上安装Ubuntu

    我这里是有安装到硬盘上的全过程。。就是硬盘上有资料的情况下如何启动硬盘上的系统。。
    发表于 10-18 08:43

    时间序列数据存储和计算 - 开源时序数据库解析

    明了的。和其他时序数据库一样,除了数据存储库,还有一份索引库。V3的索引结构比较简单,直接引用文章中给的例子:从文章描述看,V3没有和V2一样采用LevelDB,在已经
    发表于 01-25 14:53

    硬盘、软盘、光盘的区别

    和光盘纯粹的作为数据存储的介质,没有额外的部件,所以一般重量只有几克十数克,而硬盘因为其苛刻的工作环境要求(无尘,极高转速,以及散热等)需
    发表于 09-26 12:00

    ORM技术是如何解决持久设计的

    空间.采用POJO结构可以充分利用现有语言及开发工具中的一系列基础设施,大大降低了持久结构的构造成本.而透明的get/set操作使得我们可以完全基于相对知识对持久
    发表于 05-29 07:46

    SAS固态硬盘存储技术

    SAS固态硬盘存储技术是一种介于传统硬盘和内存之间的存储技术,在IOPS上,相比普通机械硬盘存储速度快50
    发表于 06-18 05:00

    Docker持久数据存储方案

    Docker持久存储数据共享
    发表于 03-23 11:17

    硬盘是怎么来存储数据的?

    存储是模拟格式的音乐,而硬盘上存储的是数字格式的数据。写入时,磁头线圈上加电,在周围产生磁场,磁化其下的磁性材料;电流的方向不同,所以磁场的方向也不同,可以表示 0 和 1 的区别。
    发表于 07-07 08:03

    硬盘上数据是如何组织与管理的呢?

    硬盘的外部物理结构是由哪些部分组成的?硬盘的内部物理结构是由哪些部分组成的?硬盘存储的逻辑结构是由哪些部分组成的?硬盘上数据是如何组织与管
    发表于 07-13 07:00

    如何使得redis中的数据不再有

    ,原因是redis的持久功能导致的,所谓的持久就是redis在系统关闭的时候把数据存储
    发表于 11-05 08:50

    OpenHarmony持久存储UI状态:PersistentStorage

    最好是小于2kb的数据,不要大量的数据持久,因为PersistentStorage写入磁盘的操作是同步的,大量的数据本地
    发表于 10-19 14:34

    HarmonyOS数据管理与应用数据持久(一)

    为应用提供Key-Value键值型的数据处理能力,支持应用持久轻量级数据对其修改和查询。当用户希望有一个全局唯一
    发表于 11-01 16:27

    采用FPGA和DSP直接控制硬盘实现存储控制的方法

    采用FPGA和DSP直接控制硬盘实现存储控制的方法  摘  要  介绍了采用FPGA和DSP直接控制硬盘进行
    发表于 01-12 11:27 998次阅读
    <b class='flag-5'>采用</b>FPGA和DSP直接控制<b class='flag-5'>硬盘</b>实现<b class='flag-5'>存储</b>控制的方法

    安装完固态硬盘后老硬盘上的分区应该如何解决

    在加装固态硬盘之后,用户有两个选择:将原机械盘上的C盘迁移到新固态硬盘,或者在固态硬盘上全新安装操作系统。如果选择后者的话,可能会遇到一些意想不到的问题。
    的头像 发表于 01-30 11:51 4480次阅读

    手把手教你如何恢复服务器硬盘数据

    小编就和大家聊一聊如何恢复硬盘上丢失的数据。 服务器硬盘数据怎么恢复? 硬盘是非常常用的数据存储
    的头像 发表于 07-22 17:26 5338次阅读

    Rocksdb原理简介

    Rocksdb作为当下nosql中性能的代表被各个存储组件(mysql、tikv、pmdk、bluestore)作为存储
    的头像 发表于 06-01 17:17 593次阅读
    <b class='flag-5'>Rocksdb</b>原理简介