0284-KVS-分离读取文件逻辑

news/2025/10/27 10:36:12/文章来源:https://www.cnblogs.com/jiangbo4444/p/19168151

环境

  • 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"

log.rs

use std::collections::HashMap;
use std::fs::{File, OpenOptions};
use std::io::{BufWriter, Write};use anyhow::{Ok, Result};use crate::cmd::Command;mod reader;pub(crate) struct CommandLog {writer: BufWriter<File>,map: HashMap<String, String>,
}pub type KvResult = Result<Option<String>>;impl CommandLog {pub(crate) fn new() -> Result<Self> {let path = "/root/log/1.log";let writer = new_writer(path)?;let mut map = HashMap::default();reader::load(path, &mut map)?;Ok(Self { writer, map })}pub(crate) fn get(&mut self, key: &str) -> KvResult {Ok(self.map.get(key).map(String::from))}pub fn set(&mut self, key: String, value: String) -> KvResult {let command = Command::Set {key: key.to_string(),value: value.to_string(),};let json = serde_json::to_string(&command)?;self.writer.write_all(json.as_bytes())?;Ok(self.map.insert(key, value))}pub(crate) fn remove(&mut self, key: String) -> KvResult {let command = Command::Remove { key: &key };let json = serde_json::to_string(&command)?;self.writer.write_all(json.as_bytes())?;Ok(self.map.remove(&key))}
}fn new_writer(path: &str) -> Result<BufWriter<File>> {let file = OpenOptions::new().append(true).create(true).open(path)?;Ok(BufWriter::new(file))
}

reader.rs

use std::collections::HashMap;
use std::fs::{File, OpenOptions};
use std::io::BufReader;use anyhow::Result;
use serde_json::Deserializer;use crate::cmd::Command;pub fn load(path: &str, map: &mut HashMap<String, String>) -> Result<()> {let stream = Deserializer::from_reader(new_reader(path)?).into_iter();for cmd in stream {match cmd? {Command::Set { key, value } => map.insert(key, value),Command::Remove { key } => map.remove(key),};}Ok(())
}fn new_reader(path: &str) -> Result<BufReader<File>> {let file = OpenOptions::new().read(true).open(path)?;Ok(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 name ZhangSan
SET KEY: name, VALUE: JiangBo
root@jiangbo12490:~/git/game/target/release# ./kvs get name
GET KEY: name, VALUE: ZhangSan
root@jiangbo12490:~/git/game/target/release# ./kvs rm name
REM KEY: name, VALUE: ZhangSan

查看文件

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

总结

将读取文件的逻辑分离到了单独的文件中。

附录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/947324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

0283-KVS-实现 set 和 remove

环境Time 2022-12-11 WSL-Ubuntu 22.04 Rust 1.65.0前言 说明 参考:https://github.com/pingcap/talent-plan 目标 在上一节的基础上,实现 set 和 remove 的返回。 Cargo.toml [package] edition = "2021"…

0282-KVS-使用 anyhow 处理错误

环境Time 2022-12-11 WSL-Ubuntu 22.04 Rust 1.65.0前言 说明 参考:https://github.com/pingcap/talent-plan 目标 在上一节的基础上,新增 anyhow 依赖,处理代码中的错误。 Cargo.toml [package] edition = "2…

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

环境Time 2022-12-11 WSL-Ubuntu 22.04 Rust 1.65.0前言 说明 参考:https://github.com/pingcap/talent-plan 目标 在上一节的基础上,启动时将文件的内容加载到内存,实现读取操作。 Cargo.toml [package] edition =…

0280-KVS-将日志记录到文件

环境Time 2022-12-11 WSL-Ubuntu 22.04 Rust 1.65.0前言 说明 参考:https://github.com/pingcap/talent-plan 目标 在上一节的基础上,将转为 JSON 的日志操作记录到文件。 Cargo.toml [package] edition = "202…

2025年口碑好的搜荐系统公司、2025年搜荐系统服务商、专业的搜荐系统平台、搜荐系统公司推荐、搜荐系统服务口碑推荐全面解析

文章摘要 本文深入分析2025年搜荐系统市场趋势,重点推荐口碑好、专业的搜荐系统服务商,并详细介绍摘星人工智能(摘星AI)的核心优势。内容涵盖用户搜索意图、行业竞争分析,以及为什么摘星AI成为首选解决方案,帮助…

Playwright for Python 的基本使用与常用交互API-使用笔记

Playwright for Python 的基本使用与常用交互API-使用笔记 安装 安装分为只做自动化,和做自动化测试两种 # 做自动化时 pip install playwright # 做测试框架时 pip install pytest-playwright # 只安装chromium引擎(…

5款能帮你自动做PPT的AI工具,我全都试过了,最好用的是它!

别再为做PPT熬夜秃头了,AI来拯救你!朋友们,有没有经历过这种绝望?明天就要述职汇报/毕业答辩/项目提报了,而你的PPT还是一片空白。找模板、搭框架、填内容、调格式……一晚上就这么耗过去,做的还是个“丑东西”。…

c++中include和import的区别

在C++中,#include和import是两种不同的文件引用方式,它们在功能和使用场景上有显著的区别。 #include的作用 #include是C和C++中非常常见的预处理指令,用于包含头文件。它的作用是将目标头文件的内容在编译前复制到…

大模型训练

1.Warmup(热身)和余弦衰减(Cosine Decay)是深度学习训练中「学习率调度」的黄金组合,核心是解决「训练初期不稳定」和「后期难收敛」的问题,以下结合实操逻辑、实现方式和关键细节,帮你彻底落地这两个技巧: Wa…

MySQL WHERE 条件书写顺序:真的影响查询效率吗?

1、问题 在日常 MySQL 开发中,很多人会纠结一个问题:WHERE子句里条件的书写顺序,到底会不会影响查询的执行结果和效率?比如where created_at=xx and status=1和where status=1 and created_at=xx,这两种写法有没有…

2025 年无缝钢管厂家最新推荐榜,技术实力与市场口碑深度解析Q355E/20G/12Cr1MoVG/15CrMoG/20CrMnTi/16MnDG 无缝钢管公司推荐

引言 无缝钢管作为工业制造、能源输送等领域的核心基础材料,其品质直接关乎下游产业安全与效率。2025 年行业面临产能过剩与需求升级的双重考验,产能利用率仅 70.85% 的同时,新能源、高端装备等领域对高精度、耐腐蚀…

2025年北京离婚房产律所权威推荐榜单:婚姻/离婚/离婚事务所专业律师团队精选

在离婚率持续走高、房产价值攀升的背景下,离婚房产分割已成为婚姻家事案件中最复杂的法律难题之一。据公开数据显示,2025年北京离婚案件中涉及房产分割争议的比例已超过70%,其中涉及企业股权、境外资产等复杂财产形…

2025 年留学咨询服务机构最新推荐榜,技术实力与服务品质双重维度剖析英国 / 澳洲 / 香港 / 美国 / 加拿大留学 / 留学中介 / 留学咨询机构推荐

引言 随着留学市场需求持续攀升,选择专业可靠的留学咨询机构成为学子及家长的关键决策。本次 2025 年留学咨询服务机构推荐榜,由教育国际交流协会联合留学服务质量测评中心共同指导,历经 3 个月实地调研与数据核验生…

字符串-函数

字符串-函数python中的7中类型: str、bool、数值(float、int)、列表、字典、元组、集合字符串索引(index)正向从0开始,负向从-1开始。name[0:4:2], name[-1:-6:2], name[::2], name[0::2], name[:5:2],包左不包…

魔改最短路

魔改最短路光 abc 就败在这上面两次了,其他地方有没有过不记得了,感觉不得不记一下了。

解决 c# 同步方法调用异步方法,使用 .Result 导致死锁问题

同步方法直接使用 .Result 会导致 UI 界面的死锁。 需要使用 Task.Run: var result = Task.Run(() => AsyncMethod()).GetAwaiter().GetResult();

2025 年纤维喷涂厂家最新推荐榜,技术实力与市场口碑深度解析机房无机 / 隔音无机 / 地下室无机 / A 级防火无机纤维喷涂公司推荐

引言 为助力建筑及工业领域从业者精准选择优质纤维喷涂产品,本次推荐榜依托建筑节能协会 2024-2025 年度行业测评数据编制。测评采用 “三维九项” 评估体系,从技术维度(材料性能、工艺创新、设备水平)、市场维度(…

2025 年路灯厂家最新推荐榜单:结合照明电器协会测评数据,精选市政 / 景观 / 太阳能等多场景优质路灯企业

引言 随着户外照明行业不断升级,路灯品质对城市建设至关重要。为给采购方提供可靠参考,照明电器协会联合行业专家开展 2025 年路灯品牌测评,本次测评覆盖全国 200 余家路灯企业,采用多维度测评方法。从企业资质来看…

Office 2024 安装包免费版使用+详细安装教程Office

一、Office2024软件下载: 软件名称:Office2024 软件大小:5.21G 安装环境:Win 10/Win 11 下载链接:https://pan.quark.cn/s/f86ae4b4a104 二、Office2024安装教程: 注意!!!开始解压安装前一定要退出杀毒软件 (不…

2025年想降本?项目进度管理软件至少帮你省20%人力成本!

你的团队是否也在为这些痛点焦虑? 最近和几位项目经理聊天,听到最多的吐槽是:“明明团队每天加班到十点,项目还是延期;跨部门沟通靠群消息和Excel,进度永远对不上;人力成本越涨越高,效率却像卡在瓶颈里。” 数…