[NewLife.XCode]对象字典缓存(百万军中取敌首级)
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode。
整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含多年开发经验于其中,代表作有百亿级大数据实时计算项目。
开源地址:https://github.com/NewLifeX/X(求star, 770+)
单对象缓存
前文提到了以sql为key的数据层缓存,以及整表缓存的实体列表缓存,各自有其优缺点,适用于不同场合。
当单表数据较大(10万+)时,两者就无能为力了。天空一道巨响,对象字典缓存隆重登场!
对象字典缓存:以主键为key,缓存实体对象,以满足应用层的高频单点查询需求!
例程跑起来:



先给学生表加了100万行,再随机生成1024个编号,然后查询1000万次。速度200万qps,命中率99.99%。
缓存本质
Student.FindByID内使用了单对象缓存:Meta.SingleCache[id];
单对象缓存本质就是并行字典,因此使用方式上只需要直接索引器查找即可。
在Meta.SingleCache内查找id时,如果已存在,则直接返回,否则执行委托Student.FindByKey查找对象后缓存起来。
非XCode用户,也可以根据该思想设计自己的缓存。
单对象缓存也有过期时间,默认10秒,过期后异步更新(老规矩,为了性能)。
单对象缓存还会根据LRU定期清理缓存,此时采用最后访问时间而不是过期时间。
对象缓存还有最大缓存数限制,默认10000个,超过时删除最久未访问缓存数据。


因此,单对象缓存特别适用于单行特点很突出且修改不多的数据,如用户表、产品表等。
即使目标表有千万级数据,单对象字典缓存仍然可以轻松的取敌首级!^_^
从键查询
前面实例展示了根据ID查找缓存对象,实际应用场景,还可能会根据名称进行查找,总不能另外搞一个对象缓存吧?
来自深圳的海洋饼干,很有创意的解决了这个问题,发明了从键缓存!

如上,Meta.SingleCache.GetItemWithSlaveKey(name) 实现了根据 name 查询用户。
在此之前,需要手工配置查询方法,因为XCode已经无法猜测得知。

使用从键缓存后,等于有两个入口(FindKey/FindSlaveKey)查询数据库,得到一个实体对象后,分别加入主键字典和从键字典,用于两个维度索引查询。
因此,从键缓存需要配置根据从键查数据库的方法FindSlaveKeyMethod,同时还需要配置实体对象获取从键值的方法GetSlaveKey,因为主键查库后加入从键缓存时,需要从对象内得到从键值。

过期策略
所有缓存都必须有过期策略。单对象字典缓存的过期策略有以下:
- 初始化。首次访问缓存时,无需阻塞,并行查询。
- 定时过期。缓存过期后,开异步线程更新并同时返回旧数据,确保应用层性能。设置文件的 SingleCacheExpire, 默认10秒
- 添删改过期。对实体类的添删改操作完成后,都会直接修改缓存对应项。
显然,初始化加载以后,将来访问的永远是定时更新的缓存数据,应用层可以得到非常好的性能!
由于缓存的添删改过期跟实体操作绑定在一起,因此,越过实体类直接DAL执行更新操作,或者其它服务器修改数据,此时无法影响实体缓存,导致数据更新不及时。
早期版本XCode缓存默认过期时间60秒,随着数据库性能提升,默认值修改为10秒,可根据实际场景设置。
系列教程
NewLife.XCode教程系列[2019版]
- 增删改查入门。快速展现用法,代码配置连接字符串
- 数据模型文件。建立表格字段和索引,名字以及数据类型规范,推荐字段(时间,用户,IP)
- 实体类详解。数据类业务类,泛型基类,接口
- 功能设置。连接字符串,调试开关,SQL日志,慢日志,参数化,执行超时。代码与配置文件设置,连接字符串局部设置
- 反向工程。自动建立数据库数据表
- 数据初始化。InitData写入初始化数据
- 高级增删改。重载拦截,自增字段,Valid验证,实体模型(时间,用户,IP)
- 脏数据。如何产生,怎么利用
- 增量累加。高并发统计
- 事务处理。单表和多表,不同连接,多种写法
- 扩展属性。多表关联,Map映射
- 高级查询。复杂条件,分页,自定义扩展FieldItem,查总记录数,查汇总统计
- 数据层缓存。Sql缓存,更新机制
- 实体缓存。全表整理缓存,更新机制
- 对象缓存。字典缓存,适用用户等数据较多场景。
- 百亿级性能。字段精炼,索引完备,合理查询,充分利用缓存
- 实体工厂。元数据,通用处理程序
- 角色权限。Membership
- 导入导出。Xml,Json,二进制,网络或文件
- 分表分库。常见拆分逻辑
- 高级统计。聚合统计,分组统计
- 批量写入。批量插入,批量Upsert,异步保存
- 实体队列。写入级缓存,提升性能。
- 备份同步。备份数据,恢复数据,同步数据
- 数据服务。提供RPC接口服务,远程执行查询,例如SQLite网络版
- 大数据分析。ETL抽取,调度计算处理,结果持久化
[NewLife.XCode]对象字典缓存(百万军中取敌首级)的更多相关文章
- [NewLife.XCode]实体列表缓存(最土的方法实现百万级性能)
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...
- [NewLife.XCode]数据层缓存(网站性能翻10倍)
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...
- [NewLife.XCode]高级查询(化繁为简、分页提升性能)
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...
- 【原创】Newlife.XCode的常见功能使用(一)查询与数据初始化
本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html Newlife XCode组件相关文章目录:http://www ...
- [NewLife.XCode]高级增删改
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示 ...
- [NewLife.XCode]实体类详解
NewLife.XCode是一个有10多年历史的开源数据中间件,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含 ...
- [NewLife.XCode]功能设置
NewLife.XCode是一个有10多年历史的开源数据中间件,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含 ...
- [NewLife.XCode]脏数据
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示 ...
- [NewLife.XCode]分表分库(百亿级大数据存储)
NewLife.XCode是一个有15年历史的开源数据中间件,支持netcore/net45/net40,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量 ...
随机推荐
- 【C语言编程练习】5.7填数字游戏求解
之前的东西就不上传了,大致就跟现在的一样 1. 题目要求 计算 ABCD * E DCBA 这个算式中每个字母代表什么数字? 2. 题目分析 如果是我们人去做这道题会怎么办,一定是这样想把,一个四位 ...
- UI分层中使用PageFactory
基于原PO设计模式,需要改变原有的从文件中读取文件,更改为PageFactory模式.做出如下改动: 1 2 public MsysPage(DriverBase driver) { super(dr ...
- [POJ1193][NOI1999]内存分配(链表+模拟)
题意 时 刻 T 内存占用情况 进程事件 0 1 2 3 4 5 6 7 8 9 进程A申请空间(M=3, P=10)<成功> 1 A 2 A B 进程B申请空间(M=4, P=3)< ...
- 左倾堆C++实现
#include <iostream> #include <vector> #include <queue> using namespace std; templa ...
- js 原生转json 可以v8中运行
// load("D:/jsontest.js"); function test1(vvv) { print(vvv); } //把json str 转 json obj func ...
- jdk12+tomcat9 配置
jdk12 没有了jre的配置 直接配置path就可以了 tomcat常规配置,只是启动的时候麻烦一点 需要重新写入jdk jre jvm 到server.bat文件 参考文章: https: ...
- 按模板批量修改Excel文件内容
Sub 按模板修改Excel文件() Dim MoBanWorkBook As Workbook Set MoBanWorkBook = Application.ActiveWorkbook Dim ...
- History Api使用演示
h5新增的一个特性即在history对象上 新增了pushState 和 replaceState 接口 配合在window对象上新增的popState事件使用 为什么要用它:因为通过historya ...
- 最基础的Eureka服务和注册搭建
Eureka服务端 打开IDEA,新建项目 选择"next",写上组织名(Group)和项目名(Artifact) 选择如下选项,然后一直下一步,创建好项目. 删除不必要的文件 添 ...
- FTP出现PORT模式成功, 请更新你的站点配置文件
最近用FTP连接站点,经常出现连接不上或者连接失败,提示以PASV模式连接失败,正在使用PORT模式连接,最后才能连接成功,连接时间也是相当长,又慢又不稳定. 工具/原料 FlashFXP等F ...