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

自己实现的一个缓存数据库(搞着玩) .net Core/6/8/9

自己实现的一个缓存数据库(搞着玩)

    • 想法来源
    • 特点说明
  • 上代码
    • 主体
    • 基类
    • 测试类
  • `注`

想法来源

做过一个小型项目,客户要求易移植,不能使用收费的数据库,最好是一个包搞定,尝试过用sqlite,在部分linux上可能需要自己安装环境,比较麻烦
mysql也需要安装,客户技术实力比较弱,不安装多的依赖,一键运行最好

特点说明

支持多线程
支持多表
适合小型项目,不用安装配置其它数据库,可以做到只有一个包,一键启动
如果将主键id调整为手动指定的字符串,可以作为系统的配置库来使用,数据都在内存里面,读取速度快
由于是数据是全量进行持久化保存,所以不支持太大的数据量

上代码

主体


namespace Memory.Db
{/// <summary>/// 内存数据库/// 支持多线程/// 支持多表/// 不支持大量数据/// 建议每个表数据量不要超过1w,或者数据文件大小保持在5M以内/// 数据都在内存里面,所以读取速度会相当快/// 适合项目///     1.小型项目///     2.数据量小 不想使用数据库,安装配置麻烦/// </summary>public class CacheDB:ISingleton{/// <summary>/// 雪花id类/// </summary>readonly SnowflakeId _sid;public CacheDB(SnowflakeId sid){_sid = sid;}//数据库private static ConcurrentDictionary<string, ConcurrentDictionary<long, dynamic>> _db = new();//数据存放路径private string _fielpath = "wwwroot/cachedb/";//锁对象private object lockobj = new object();/// <summary>/// 新增或修改/// </summary>/// <typeparam name="T"></typeparam>/// <param name="item"></param>/// <returns></returns>/// <exception cref="Exception"></exception>public T AddOrUpdate<T>(T item) where T : CacheDBEntityBase, new(){//取得表var table = GetTable<T>();//判断是否新增if (item.Id == 0){//新增item.Id = _sid.GenerateId();item.CreatedTime = DateTime.Now;}else{//修改if (!table.ContainsKey(item.Id)) throw new Exception("数据不存在");var old = table[item.Id];item.CreatedTime = old.CreatedTime;//将原来的创建时间值取过来,防止被空值覆盖item.UpdateTime = DateTime.Now;}///新增或修改table.AddOrUpdate(item.Id, item, (a, b) => item);//保存快照SaveToFile<T>();return item;}/// <summary>/// 删除/// </summary>/// <typeparam name="T"></typeparam>/// <param name="item"></param>/// <exception cref="Exception"></exception>public void Delete<T>(T item) where T : CacheDBEntityBase, new(){//取得表var table = GetTable<T>();//按id删除if (item.Id == 0) throw new Exception("未提供Id");if (table.ContainsKey(item.Id)){table.Remove(item.Id, out _);//保存快照SaveToFile<T>();}}/// <summary>/// 返回列表/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>public List<T> GetList<T>() where T : CacheDBEntityBase, new(){var table = GetTable<T>();//这里先序列化成json,再序列化为指定类型,不然会出现值为空的情况var json = table.ToJson();var data = json.ToEntity<Dictionary<long, T>>();return data.Select(x => x.Value).ToList();}/// <summary>/// 按id查询单条/// </summary>/// <typeparam name="T"></typeparam>/// <param name="id"></param>/// <returns></returns>public T Find<T>(long id) where T : CacheDBEntityBase, new(){var table = GetTable<T>();var mod= table[id] as T;return mod;}/// <summary>/// 取得表/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>public ConcurrentDictionary<long, dynamic> GetTable<T>() where T: CacheDBEntityBase,new(){//获取表名var _table = typeof(T).Name;ConcurrentDictionary<long, dynamic> data;//判断表是否已经存在于缓存if (!_db.ContainsKey(_table)){//保存路径var _path = $"{_fielpath}{_table}.json";if (File.Exists(_path)){//如果文件存在,从文件读取数据到缓存var json = File.ReadAllText(_path);_db[_table] = json.ToEntity<ConcurrentDictionary<long, dynamic>>();}else{//如果文件不存在,创建新的表_db[_table] = new ConcurrentDictionary<long, dynamic>();}}data = _db[_table];//返回表return data;}/// <summary>/// 快照/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>private async Task SaveToFile<T>(){lock (lockobj){var _table = typeof(T).Name;var json = _db[_table].ToJson();var _path = $"{_fielpath}{_table}.json";Directory.CreateDirectory(_fielpath);File.WriteAllText(_path, json);}}}
}

基类

public class CacheDBEntityBase{/// <summary>/// 主键/// </summary>public long Id { get; set; }/// <summary>/// 创建时间/// </summary>public DateTime CreatedTime { get; set; }/// <summary>/// 修改时间/// </summary>public DateTime? UpdateTime { get; set; }}

测试类

    public class aa: CacheDBEntityBase{public string name { get; set; }public string name2 { get; set; }public string name3 { get; set; }public string name4 { get; set; }public string name5{ get; set; }}public class bb : CacheDBEntityBase{public string name { get; set; }}

上面代码中的部分内容说明
ToJson 方法将实体转为json字符串
ToEntity 方法将json字符串转为指定的类型
SnowflakeId 雪花id类 用来生成id
上面代码中没有这些内容的实现,请自行实现替代

相关文章:

自己实现的一个缓存数据库(搞着玩) .net Core/6/8/9

自己实现的一个缓存数据库&#xff08;搞着玩&#xff09; 想法来源特点说明 上代码主体基类测试类 注 想法来源 做过一个小型项目&#xff0c;客户要求易移植&#xff0c;不能使用收费的数据库&#xff0c;最好是一个包搞定&#xff0c;尝试过用sqlite&#xff0c;在部分linux…...

在Qt中,slots 关键字有什么用?

有下面的Qt代码&#xff1a; #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr…...

如何查看linux机器有几个cpu

在 Linux 机器上&#xff0c;你可以使用以下几种方法来查看 CPU 的数量&#xff08;物理 CPU 和逻辑 CPU&#xff09;&#xff1a; 方法 1&#xff1a;使用 lscpu 命令 lscpu输出示例&#xff1a; CPU(s): 8 Thread(s) per core: 2 Core(s) per socket: 4 Soc…...

Swoole如何处理内存泄漏

Swoole处理内存泄漏的方式主要包括以下几个方面&#xff1a; 一、内存管理机制 Swoole的内存管理机制与普通PHP-CLI程序一致&#xff0c;但它在事件回调函数返回后会自动回收所有局部对象和变量&#xff0c;不需要手动unset。如果变量是一个资源类型&#xff0c;那么对应的资…...

Llama最新开源大模型Llama3.1

Meta公司于2024年7月23日发布了最新的开源大模型Llama 3.1&#xff0c;这是其在大语言模型领域的重要进展。以下是关于Llama 3.1的详细介绍&#xff1a; 参数规模与训练数据 Llama 3.1拥有4050亿&#xff08;405B&#xff09;参数&#xff0c;是目前开源领域中参数规模最大的…...

Pixflow - CL-DJI Drone LUTs 120个大疆Drone无人机相机航拍电影级镜头LUT调色预设

120组电影质感DJI大疆无人机航拍视频LOG&Rec 709还原颜色分级调色LUTs预设包Pixflow – CL-DJI Drone LUTs 使用基于城市外观和 DJI 无人机镜头的最佳 Drone Luts 颜色预设来提升您的视频。 120 个出色的颜色分级 LUTS&#xff0c;您可以将其与任何无人机视频素材一起使用…...

了解AI绘图,Stable Diffusion的使用

AI绘图对GPU算力要求较高。 个人电脑配置可参考&#xff1a; CPU&#xff1a;14600kf 盒装 显卡&#xff1a;RTX 4080金属大师 OC&#xff0c;16G显存 主板&#xff1a;z790吹雪d4 内存&#xff1a;芝奇皇家戟4000c18,162G 硬盘&#xff1a;宏基gm7000 1T 散热&#xff1a;追风…...

idea整合deepseek实现AI辅助编程

1.File->Settings 2.安装插件codegpt 3.注册deepseek开发者账号&#xff0c;DeepSeek开放平台 4.按下图指示创建API KEY 5.回到idea配置api信息&#xff0c;File->Settings->Tools->CodeGPT->Providers->Custom OpenAI API key填写deepseek的api key Chat…...

llama_index

目录 安装 llama_index 搜索引擎 用 DeepSeek API 替换本地 Ollama 模型 源代码&#xff1a; 安装 pip install llama_index llama_index 搜索引擎 llama_index框架构建搜索引擎_llamaindex使用正则表达式拆分文档-CSDN博客 用 DeepSeek API 替换本地 Ollama 模型 https…...

Spring Boot统一异常拦截实践指南

Spring Boot统一异常拦截实践指南 一、为什么需要统一异常处理 在Web应用开发中&#xff0c;异常处理是保证系统健壮性和用户体验的重要环节。传统开发模式中常见的痛点包括&#xff1a; 异常处理逻辑分散在各个Controller中错误响应格式不统一敏感异常信息直接暴露给客户端…...

Games104——游戏引擎Gameplay玩法系统:基础AI

这里写目录标题 寻路/导航系统NavigationWalkable AreaWaypoint NetworkGridNavigation Mesh&#xff08;寻路网格&#xff09;Sparse Voxel Octree Path FindingDijkstra Algorithm迪杰斯特拉算法A Star&#xff08;A*算法&#xff09; Path Smoothing Steering系统Crowd Simu…...

stm32生成hex文件详解

1.产生的map文件干啥的&#xff1f; 2.组成情况&#xff1f;&#xff1f;&#xff1f; 废话少说&#xff0c;直接上代码具体内容况&#xff1a; Component: ARM Compiler 5.06 update 7 (build 960) Tool: armlink [4d3601]Section Cross Referencesstartup_stm32f103xe.o(S…...

【Windows 开发NVIDIA相关组件】CUDA、cuDNN、TensorRT

目录 1. 安装 CUDA Toolkit 2. 安装 cuDNN 3. 安装 Zlib 4. 安装 TensorRT 5. 安装 TensorRT Python 包[c++项目不需要] 6. 安装 ONNX GraphSurgeon 包[c++项目不需要] 1. 安装 CUDA Toolkit 从 CUDA ToolkitArchive 下载对应版本的离线安装包,以 11.7 版本为例。 打开安…...

AI大模型(二)基于Deepseek搭建本地可视化交互UI

AI大模型&#xff08;二&#xff09;基于Deepseek搭建本地可视化交互UI DeepSeek开源大模型在榜单上以黑马之姿横扫多项评测&#xff0c;其社区热度指数暴涨、一跃成为近期内影响力最高的话题&#xff0c;这个来自中国团队的模型向世界证明&#xff1a;让每个普通人都能拥有媲…...

各种协议设计

这些设计问题背后的核心本质可以总结为以下几个关键原则&#xff0c;我将结合不同领域为您系统讲解&#xff1a; 一、核心设计原则&#xff08;本质层面&#xff09; 抽象与分层 本质&#xff1a;将复杂系统分解为不同层次的抽象&#xff08;物理层/逻辑层/业务层&#xff09…...

DockerFile详细学习

目录 1.DockerFile介绍 2.DockerFile常用指令 3.指令详细讲解 4.实例 构建Node-Exporter 构建Alertmanager 构建Mariadb 1.DockerFile介绍 什么是 Dockerfile&#xff1f; Dockerfile 是一个文本文件&#xff0c;包含了构建 Docker 镜像的所有指令。 Dockerfile 是一…...

Windows Docker笔记-简介摘录

Docker是一个开源的容器化平台&#xff0c;可以帮助开发人员将应用程序与其依赖项打包在一个独立的容器中&#xff0c;然后在任何安装的Docker的环境中快速、可靠地运行。 几个基本概念和优势&#xff1a; 1. 容器 容器是一个轻量级、独立的运行环境&#xff0c;包含了应用程…...

TeamSpeak开黑频道加入 —— 点歌机器人 (细致讲解100%学会)

文章目录 前言&#xff1a;搭建Ubuntu云服务器选择服务器:打开防火墙&#xff08;前置工作&#xff09;:下载Xshell 连接: 创建机器人工作路径创建新用户teamspeak:升级新用户teamspeak的访问权限:切换为teamspeak用户并为机器人创建文件夹: 下载机器人本体安装依赖库:下载TS3…...

2025简约的打赏系统PHP网站源码

源码介绍 2025简约的打赏系统PHP网站源码 源码上传服务器&#xff0c;访问域名/install.php安装 支持自定义金额打赏 集成支付宝当面付 后台管理系统 订单记录查询 效果预览 源码获取 2025简约的打赏系统PHP网站源码...

网络安全 | 零信任架构:重构安全防线的未来趋势

网络安全 | 零信任架构&#xff1a;重构安全防线的未来趋势 一、前言二、零信任架构的核心概念与原理2.1 核心概念2.2 原理 三、零信任架构的关键技术组件3.1 身份管理与认证系统3.2 授权与访问控制系统3.3 网络与安全监测系统3.4 加密与数据保护技术 四、零信任架构与传统安全…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...