当前位置: 首页 > news >正文

0281-KVS-启动时加载文件内容

环境

  • Time 2022-12-11
  • WSL-Ubuntu 22.04
  • Rust 1.65.0

前言

说明

参考:https://github.com/pingcap/talent-plan

目标

在上一节的基础上,启动时将文件的内容加载到内存,实现读取操作。

Cargo.toml

[package]
edition = "2021"
name = "kvs"
version = "1.0.0"[dependencies]
clap = {version = "4", features = ["derive"]}
serde = {version = "1", features = ["derive"]}
serde_json = "1"

lib.rs

use cmd::Command;
use log::CommandLog;mod cmd;
mod log;#[derive(Default)]
pub struct KvStore {log: CommandLog,
}impl KvStore {pub fn get(&mut self, key: &str) -> Option<String> {self.log.get(key)}pub fn set(&mut self, key: String, value: String) -> Option<String> {let command = Command::Set { key, value };self.log.set(command)}pub fn remove(&mut self, key: String) -> Option<String> {let command = Command::Remove { key };self.log.remove(command)}
}

log.rs

use std::collections::HashMap;
use std::fs::{File, OpenOptions};
use std::io::{BufReader, BufWriter, Write};use serde_json::Deserializer;use crate::cmd::Command;pub struct CommandLog {writer: BufWriter<File>,map: HashMap<String, String>,
}impl Default for CommandLog {fn default() -> Self {let path = "/root/log/1.log";let writer = new_writer(path);let mut map = HashMap::default();load(path, &mut map);Self { writer, map }}
}impl CommandLog {pub fn get(&mut self, key: &str) -> Option<String> {self.map.get(key).map(String::from)}pub fn set(&mut self, command: Command) -> Option<String> {let json = serde_json::to_string(&command).unwrap();self.writer.write_all(json.as_bytes()).unwrap();None}pub fn remove(&mut self, command: Command) -> Option<String> {let json = serde_json::to_string(&command).unwrap();self.writer.write_all(json.as_bytes()).unwrap();None}
}fn new_writer(path: &str) -> BufWriter<File> {let file = OpenOptions::new().append(true).create(true).open(path).unwrap();BufWriter::new(file)
}fn load(path: &str, map: &mut HashMap<String, String>) {let stream = Deserializer::from_reader(new_reader(path)).into_iter();for cmd in stream {match cmd.unwrap() {Command::Set { key, value } => map.insert(key, value),Command::Remove { key } => map.remove(&key),};}
}fn new_reader(path: &str) -> BufReader<File> {let file = OpenOptions::new().read(true).open(path).unwrap();BufReader::new(file)
}

运行

使用 cargo build --release 构建后运行。

root@jiangbo12490:~/git/game/target/release# ./kvs set name JiangBo
SET KEY: name, VALUE: None
root@jiangbo12490:~/git/game/target/release# ./kvs set age 44
SET KEY: age, VALUE: None
root@jiangbo12490:~/git/game/target/release# ./kvs get name
GET KEY: name, VALUE: JiangBo
root@jiangbo12490:~/git/game/target/release# ./kvs rm name
REM KEY: name, VALUE: None

查看文件

root@jiangbo12490:~/log# cat /root/log/1.log
{"Set":{"key":"name","value":"JiangBo"}}{"Set":{"key":"age","value":"44"}}{"Remove":{"key":"name"}}

总结

在启动时,将文件加载到内存,实现了持久化的功能。

附录

http://www.jsqmd.com/news/23210/

相关文章:

  • 0280-KVS-将日志记录到文件
  • 2025年口碑好的搜荐系统公司、2025年搜荐系统服务商、专业的搜荐系统平台、搜荐系统公司推荐、搜荐系统服务口碑推荐全面解析
  • Playwright for Python 的基本使用与常用交互API-使用笔记
  • 5款能帮你自动做PPT的AI工具,我全都试过了,最好用的是它!
  • c++中include和import的区别
  • 大模型训练
  • MySQL WHERE 条件书写顺序:真的影响查询效率吗?
  • 2025 年无缝钢管厂家最新推荐榜,技术实力与市场口碑深度解析Q355E/20G/12Cr1MoVG/15CrMoG/20CrMnTi/16MnDG 无缝钢管公司推荐
  • 2025年北京离婚房产律所权威推荐榜单:婚姻/离婚/离婚事务所专业律师团队精选
  • 2025 年留学咨询服务机构最新推荐榜,技术实力与服务品质双重维度剖析英国 / 澳洲 / 香港 / 美国 / 加拿大留学 / 留学中介 / 留学咨询机构推荐
  • 字符串-函数
  • 魔改最短路
  • 解决 c# 同步方法调用异步方法,使用 .Result 导致死锁问题
  • 2025 年纤维喷涂厂家最新推荐榜,技术实力与市场口碑深度解析机房无机 / 隔音无机 / 地下室无机 / A 级防火无机纤维喷涂公司推荐
  • 2025 年路灯厂家最新推荐榜单:结合照明电器协会测评数据,精选市政 / 景观 / 太阳能等多场景优质路灯企业
  • Office 2024 安装包免费版使用+详细安装教程Office
  • 2025年想降本?项目进度管理软件至少帮你省20%人力成本!
  • 2025 年最新推荐!钢结构防火涂料厂家推荐榜:膨胀型 / 非膨胀型 / 室内外 / 超薄型 / 厚型防火涂料精选
  • Java 开发开篇
  • [背包] CF730J Bottles 题解
  • uniapp实现上拉加载、下拉刷新
  • 何为受控组件(controlledcomponent) ?
  • 20232426 2025-2026-1 《网络与系统攻防技术》实验三实验报告
  • 每天浪费 5 分钟杀端口?我开发了一个工具终结这种痛苦
  • Day5表单—下拉菜单与文本域
  • 深入解析:Node.js 完全安装与使用指南:Windows 平台详细教程
  • 界面控件DevExpress WPF v25.1 - 官宣支持Avalonia XPF
  • 终端检测不到npm、nvm、node等配置过环境变量的东西
  • 2025 年液位计厂家最新推荐榜,深度解析行业头部品牌技术实力与市场口碑
  • 2025 年减速机厂家最新推荐榜,技术实力与市场口碑深度解析行星/直角换向器/中空旋转平台减速机厂家推荐