mormot当作内存数据库(缓存)使用
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当作内存数据库(缓存)使用的更多相关文章
- 用redis当作LRU缓存
原文地址:https://redis.io/topics/lru-cache Redis可以用来作缓存,他可以很方便的淘汰(删除)旧数据添加新数据,类似memcached.LRU只是其中的一种置换算法 ...
- Redis 详解 (一) StackExchange.Redis Client
这期我们来看StackExchange.Redis,这是redis 的.net客户端之一.Redis是一个开源的内存数据存储,可以用来做数据库,缓存或者消息代理服务.目前有不少人在使用ServiceS ...
- StackExchange.Redis Client
StackExchange.Redis Client 这期我们来看StackExchange.Redis,这是redis 的.net客户端之一.Redis是一个开源的内存数据存储,可以用来做数据库,缓 ...
- Spring Data Redis 让 NoSQL 快如闪电 (1)
[编者按]本文作者为 Xinyu Liu,详细介绍了 Redis 的特性,并辅之以丰富的用例.在本文的第一部分,将重点概述 Redis 的方方面面.文章系国内 ITOM 管理平台 OneAPM 编译呈 ...
- 前端学HTTP之重定向和负载均衡
前面的话 HTTP并不是独自运行在网上的.很多协议都会在HTTP报文的传输过程中对其数据进行管理.HTTP只关心旅程的端点(发送者和接收者),但在包含有镜像服务器.Web代理和缓存的网络世界中,HTT ...
- redis该如何分区-译文(原创)
写在最前,最近一直在研究redis的使用,包括redis应用场景.性能优化.可行性.这是看到redis官网中一个链接,主要是讲解redis数据分区的,既然是官方推荐的,那我就翻译一下,与大家共享. P ...
- PHPExcel中文开发手册翻译版(2)
2016年8月18日12:45:14 请注意这个是粗翻译版,仅供参考,不是精校版 精校版后面才会更新 PHPExcel开发者文档 1.目录 2. 4先决条件 2.1.软件要求4 2.2.安装说明4 2 ...
- 控制器层(Controllers)
本章译者:@freewind 业务逻辑代码通常位于模型(model)层.客户端(比如浏览器)无法直接调用其中的代码,所以模型对象提供的功能,必须作为资源以URI方式暴露给外部. 客户端使用HTTP协议 ...
- Linux内存管理原理
本文以32位机器为准,串讲一些内存管理的知识点. 1. 虚拟地址.物理地址.逻辑地址.线性地址 虚拟地址又叫线性地址.linux没有采用分段机制,所以逻辑地址和虚拟地址(线性地址)(在用户态,内核态逻 ...
随机推荐
- sql 修改列名及表名 sp_rename
因需求变更要改表的列名,平常都是跑到Enterprise manager中选取服务器->数据库->表,然后修改表,这样太麻烦了,查了一下,可以用script搞定, 代码如下: EXEC s ...
- 动态页面技术JSP/EL/JSTL
本节内容: jsp脚本和注释 jsp运行原理 jsp指令(3个) jsp内置/隐式对象(9个) jsp标签(动作) EL技术 JSTL技术 JavaEE的开发模式 动态页面技术:就是在html中嵌入j ...
- oplog扩容
Oplog的扩容: 背景:一个由3个节点组成的复制集. 主节点:A 从节点:B,C 需求:Oplog扩容,尽量少的影响业务. 思路:先由从节点开始,一台一台的从复制集中剥离,修改,再回归复制集,最后操 ...
- 【LOJ】#2024. 「JLOI / SHOI2016」侦查守卫
题解 童年的回忆! 想当初,这是我考的第一次省选,我当时初二,我什么都不会,然后看着这个东西,是不是能用我一个月前才会的求lca,光这个lca我就调了一个多小时= =,然后整场五个小时,我觉得其他题不 ...
- Mysql安装(绿色版安装)
一:下载 1.官网 https://dev.mysql.com/ 2.下载 3.下载 二:安装 1.将官网上下载的包进行解压 2.以管理员的身份运行DOS安装 进入mysql的bin目录 运行mysq ...
- printf的定义
1. printf的宏定义 #define XXX_ERROR 0#define XXX_WARNING 1#define XXX_INFO 2#define XXX_DEBUG 3#define X ...
- Music in Car CF 746F
题目:http://codeforces.com/problemset/problem/746/F 先感叹一下题目之长! 一些测试样例在后面给出. 题目大意: Sasha 去工作的路上喜欢听歌,途中经 ...
- 总结html
1.初识html W3C : 万维网联盟!(World Wide Web Consortium ) 创建于1994年,是web技术领域最权威最具有影响力的标准机构! W3C规定 ...
- mysql store procedure 存储过程
参考资料: 1.http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html 2.https://dev.mysql.com/doc/refman/5.7/ ...
- SQL语句之 知识补充
SQL语句之 知识补充 一.存储过程 运用SQL语句,写出一个像函数的模块,这就是存储过程. 需求: 编写存储过程,查询所有员工 -- 创建存储过程(必须要指定结束符号) -- 定义结束符号 DELI ...