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没有采用分段机制,所以逻辑地址和虚拟地址(线性地址)(在用户态,内核态逻 ...
随机推荐
- es6遍历数组forof
- MySQL学习笔记:生成时间维度表
# ---- 对应时间戳怎么生成的? ---- /*TIME_CD TIME_CD1000000 000005000001 000005000002 000005000003 000005000004 ...
- js交互
Js和native交互的方法与问题 实现JS和Native交互有两种方式: 第一种:shouldOverrideUrlLoading(WebView view, String url) 通过给WebV ...
- matlab设定mex接驳的C/C++编译器
使用C/C++编写核心算法,使用matlab调用算法.做上层封装,通常是提升效率并提供易用性的一个不错的选择. mex需要设定接驳的C/C++编译器,官方文档在这里:https://ww2.mathw ...
- wordpress后台进去空白怎么办?
最近博客换成了用wordpress程序搭建,内容和版面也重新设计.经常使用FTP工具,更改模板或者其他程序文件.由于对wordpress不太了解,竟然出现了wordpress后台进去空白的问题,而前台 ...
- HTML5练习2
1.邮箱注册网页 主要代码: <!doctype html> <html> <meta charset="utf-8"> <title&g ...
- hdu 5120(求两个圆环相交的面积 2014北京现场赛 I题)
两个圆环的内外径相同 给出内外径 和 两个圆心 求两个圆环相交的面积 画下图可以知道 就是两个大圆交-2*小圆与大圆交+2小圆交 Sample Input22 30 00 02 30 05 0 Sam ...
- 【LOJ】 #2033. 「SDOI2016」生成魔咒
题解 就是字符集较大需要离散化和建边表的后缀自动机水题 每次会加入i个新的串,其中重复的就是i的父亲节点所在节点的长度,减掉即可 代码 #include <iostream> #inclu ...
- ubuntu 安装 eslint
1. 安装 npm install -g eslint 安装结束后记住 /usr/local/bin/eslint -> /usr/local/lib/node_modules/eslint/b ...
- CentOS 配置自启动Redis
第一步: 在/etc/init.d/目录下建立一个名字为 redis 的启动脚本 cd /etc/init.d touch redis 然后在这个脚本中添加如下脚本 <注意修改自己的PIDFI ...