mormot当作内存数据库(缓存)使用

mormot的TSQLRestStorageInMemory可以作为内存数据库来使用。

上图是在笔者4代I5笔记本上做的测试,增加10万记录,耗时:562毫秒。

增加的数据如下图所示(默认是JSON,当然也可以存为二进制格式的):

下面附上测试代码:

/// <author>cxg 2018-9-17</author>
/// mormot 数据缓存 unit Unit1; interface uses
SynCommons, SynDB, mORMot, mORMotDB, SynDBSQLite3, SynSQLite3Static, Winapi.Windows,
Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ToolWin, Vcl.ComCtrls; type
/// <summary>
/// 缓存的记录
/// </summary>
TPerson = class(TSQLRecord)
private
FNo: integer;
FName: string;
published
property No: Integer read FNo write FNo;
property Name: string read FName write FName;
end; type
TForm1 = class(TForm)
Label1: TLabel;
edtId: TEdit;
Label2: TLabel;
edtName: TEdit;
ToolBar1: TToolBar;
btnAdd: TToolButton;
btnAdds: TToolButton;
btnUpdate: TToolButton;
btnFind: TToolButton;
btnDelete: TToolButton;
btnDeleteAll: TToolButton;
mmo1: TMemo;
procedure btnAddClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btnFindClick(Sender: TObject);
procedure btnAddsClick(Sender: TObject);
procedure btnUpdateClick(Sender: TObject);
procedure btnDeleteAllClick(Sender: TObject);
procedure btnDeleteClick(Sender: TObject);
private
{ Private declarations }
FMemDB: TSQLRestStorageInMemory;
FModel: TSQLModel;
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.dfm} procedure TForm1.btnAddClick(Sender: TObject);
var
LPerson: TPerson;
begin
try
LPerson := TPerson.Create;
LPerson.No := StrToInt(edtId.Text);
LPerson.Name := edtName.Text;
if FMemDB.Add(LPerson, True) = 0 then
begin
ShowMessage('增加失败');
end
else
begin
edtId.Clear;
edtName.Clear;
edtId.SetFocus;
end;
finally
LPerson.Free;
end;
end; procedure TForm1.btnAddsClick(Sender: TObject);
var
a, b, c: Cardinal;
i: Integer;
LPerson: TPerson;
begin
a := GetTickCount;
try
LPerson := TPerson.Create; for i := 0 to 100000 do
begin
LPerson.no:= i;
LPerson.Name := RandomGUID.ToString;
if FMemDB.Add(LPerson, True) = 0 then
begin
mmo1.Lines.Add('失败: ' + i.ToString);
end;
end;
b := GetTickCount;
c := b - a;
mmo1.Lines.Add('耗时: ' + c.ToString + ' 毫秒');
finally
LPerson.Free;
end;
end; procedure TForm1.btnDeleteAllClick(Sender: TObject);
begin
FMemDB.DropValues;
end; procedure TForm1.btnDeleteClick(Sender: TObject);
var
LNo: string;
begin
LNo := '';
if FMemDB.Delete(TPerson, LNo) then
begin
mmo1.Lines.Add('删除成功');
end else
begin
mmo1.Lines.Add('删除失败');
end; end; procedure TForm1.btnFindClick(Sender: TObject);
var
LPerson: TPerson;
begin
LPerson := TPerson.Create(FMemDB, 'Id=?', [edtId.Text]);
if LPerson <> nil then
begin
edtId.Text := LPerson.no.ToString;
edtName.Text := LPerson.Name;
end;
end; procedure TForm1.btnUpdateClick(Sender: TObject);
var
LPerson: TPerson;
begin
LPerson := TPerson.Create;
LPerson.no := StrToInt(edtId.Text);
LPerson.Name := edtName.Text; if FMemDB.Update(LPerson) then
begin
mmo1.Lines.Add('更新成功: ' + LPerson.no.ToString);
end
else
begin
mmo1.Lines.Add('更新失败: ' + LPerson.no.ToString);
end;
LPerson.Free;
end; procedure TForm1.FormCreate(Sender: TObject);
begin
FModel := TSQLModel.Create([TPerson]);
FMemDB := TSQLRestStorageInMemory.Create(TPerson, nil, 'test.db');
end; procedure TForm1.FormDestroy(Sender: TObject);
begin
FModel.Free;
FMemDB.Free;
end; end.

  

mormot当作内存数据库(缓存)使用的更多相关文章

  1. 用redis当作LRU缓存

    原文地址:https://redis.io/topics/lru-cache Redis可以用来作缓存,他可以很方便的淘汰(删除)旧数据添加新数据,类似memcached.LRU只是其中的一种置换算法 ...

  2. Redis 详解 (一) StackExchange.Redis Client

    这期我们来看StackExchange.Redis,这是redis 的.net客户端之一.Redis是一个开源的内存数据存储,可以用来做数据库,缓存或者消息代理服务.目前有不少人在使用ServiceS ...

  3. StackExchange.Redis Client

    StackExchange.Redis Client 这期我们来看StackExchange.Redis,这是redis 的.net客户端之一.Redis是一个开源的内存数据存储,可以用来做数据库,缓 ...

  4. Spring Data Redis 让 NoSQL 快如闪电 (1)

    [编者按]本文作者为 Xinyu Liu,详细介绍了 Redis 的特性,并辅之以丰富的用例.在本文的第一部分,将重点概述 Redis 的方方面面.文章系国内 ITOM 管理平台 OneAPM 编译呈 ...

  5. 前端学HTTP之重定向和负载均衡

    前面的话 HTTP并不是独自运行在网上的.很多协议都会在HTTP报文的传输过程中对其数据进行管理.HTTP只关心旅程的端点(发送者和接收者),但在包含有镜像服务器.Web代理和缓存的网络世界中,HTT ...

  6. redis该如何分区-译文(原创)

    写在最前,最近一直在研究redis的使用,包括redis应用场景.性能优化.可行性.这是看到redis官网中一个链接,主要是讲解redis数据分区的,既然是官方推荐的,那我就翻译一下,与大家共享. P ...

  7. PHPExcel中文开发手册翻译版(2)

    2016年8月18日12:45:14 请注意这个是粗翻译版,仅供参考,不是精校版 精校版后面才会更新 PHPExcel开发者文档 1.目录 2. 4先决条件 2.1.软件要求4 2.2.安装说明4 2 ...

  8. 控制器层(Controllers)

    本章译者:@freewind 业务逻辑代码通常位于模型(model)层.客户端(比如浏览器)无法直接调用其中的代码,所以模型对象提供的功能,必须作为资源以URI方式暴露给外部. 客户端使用HTTP协议 ...

  9. Linux内存管理原理

    本文以32位机器为准,串讲一些内存管理的知识点. 1. 虚拟地址.物理地址.逻辑地址.线性地址 虚拟地址又叫线性地址.linux没有采用分段机制,所以逻辑地址和虚拟地址(线性地址)(在用户态,内核态逻 ...

随机推荐

  1. 一行代码实现Okhttp,Retrofit,Glide下载上传进度监听

    https://mp.weixin.qq.com/s/bopDUFMB7EiK-MhLc3KDXQ essyan 鸿洋 2017-06-29 本文作者 本文由jessyan投稿. jessyan的博客 ...

  2. CCF CSP 201503-3 节日

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201503-3 节日 问题描述 有一类节日的日期并不是固定的,而是以“a月的第b个星期c”的形 ...

  3. CCF CSP 201703-2 学生排队

    博客中的文章均为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-2 学生排队 问题描述 体育老师小明要将自己班上的学生按顺序排队.他首先让学生按学号从小到大的顺序排成一排, ...

  4. day7回顾

    静态方法: 与类无关,不能访问类里的任何属性和方法 类方法: 只能访问类变量 属性@property 把一个方法变成一个静态属性 反射 getattr(obj,str) setattr(obj,str ...

  5. LoadRuner常见错误

    LoadRuner常见错误 一.Step download timeout (120 seconds) 这是一个经常会遇到的问题,解决得办法走以下步骤: 1. 修改run time setting中的 ...

  6. hdoj1879 继续畅通工程(Prime || Kruskal)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1879 思路 这题和hdoj1102很像,图中的有一些路已经修好了,对于这些已经修好的路,我们令还需要修 ...

  7. Ionic实战五:ionic图表源码基于highcharts

    ionic图表demo基于Highcharts,highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表.HighCha ...

  8. My blog in AI ---神经网络,神经元(neural network,nervecell)

    尽管我们有很多经验丰富的软件开发人员,但是利用hard code的方法,要解决一些问题,我们的程序员还是优点捉襟见肘,这些问题包括,识别手写数字照片上的数字:分辨一张彩色照片上是否有一只猫咪:准确理解 ...

  9. firewalld启动问题

    问题 在查看或启动firewalld服务时,提示"Warning: firewalld.service changed on disk. Run 'systemctl daemon-relo ...

  10. 浅谈Comparable与Comparator的区别

    平时进行自定义排序一直使用实现Comparable接口,一段时间后操作的时候居然发现有了个Comparator接口 上网差了些资料,总结笔记一下. 基本原理就是比较,底层是二叉树 比如是3,6,5,1 ...