[NewLife.XCode]数据层缓存(网站性能翻10倍)
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode。
整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含多年开发经验于其中,代表作有百亿级大数据实时计算项目。
开源地址:https://github.com/NewLifeX/X (求star, 760+)
缓存是一把尖刀,合理使用可大大提升吞吐率!
历史背景
2006年,某某省电网门户卒!
经查,首页某个sql先后执行了8次,正好对应页面上8大块新闻列表。
实在忍无可忍,于是在底层用Hashtable做了一层sql/DataSet缓存,当时.NET1.1好像还没有泛型字典。
于是世界清静了,效果还不错,特别对于访问量很大的门户网站。
XCode的数据层缓存设计于2003年,那时候只做网站和普通MIS系统,数据库性能还很差……
数据层缓存:以查询sql为key,把查询结果缓存起来,提升系统性能!
数据层缓存
经过16年的发展,XCode里面数据层缓存曾经一度被干掉,若干年后又请回来,现在是这个样子:
数据层DAL内,所有查询类方法 Query/Select/SelectCount 都先走一趟缓存(默认配置关闭);
所有添删改操作类方法 Execute 都清空本DAL连接的所有缓存;
** 多年前,查询方法指定要用到的表名,添删改方法指定会影响到的表名,做到部分表缓存过期。现在数据库性能大有提升,为了“简约”设计理念,简化了缓存设计。
缓存设置
数据层缓存只有一个缓存时间的设置DataCacheExpire,位于配置文件 config/xcode.config 中,默认0秒表示不启用。
设置缓存时间的方式有多种:
- 修改配置文件 config/xcode.config 中的DataCacheExpire
- 魔方,魔方设置页面,修改数据中间件页的“数据层缓存”
- 直接修改DAL类的Expire属性
- 连接字符串中配置DataCache参数,如 DataCache=60
前面两者的本质相同,也是最常见用法。
连接字符串配置提供了个性化,针对部分连接需要打开数据层缓存,或者不同连接采用不能缓存时间的场景。
总结
2016年起,XCode采取了“简约”且稍微“保守”的理念,于是数据层缓存默认配置0秒,大部分场景推荐使用10~60秒。
各种网站,推荐过期时间60秒起,经实际线上项目压测,吞吐率可轻易从300rps提升到10000rps以上,命中率99.99%。
每一个应用系统,总会有那么一些表或数据很少改变,非常适合使用数据层缓存,建议在实践中获得最优缓存时间!
系列教程
NewLife.XCode教程系列[2019版]
- 增删改查入门。快速展现用法,代码配置连接字符串
- 数据模型文件。建立表格字段和索引,名字以及数据类型规范,推荐字段(时间,用户,IP)
- 实体类详解。数据类业务类,泛型基类,接口
- 功能设置。连接字符串,调试开关,SQL日志,慢日志,参数化,执行超时。代码与配置文件设置,连接字符串局部设置
- 反向工程。自动建立数据库数据表
- 数据初始化。InitData写入初始化数据
- 高级增删改。重载拦截,自增字段,Valid验证,实体模型(时间,用户,IP)
- 脏数据。如何产生,怎么利用
- 增量累加。高并发统计
- 事务处理。单表和多表,不同连接,多种写法
- 扩展属性。多表关联,Map映射
- 高级查询。复杂条件,分页,自定义扩展FieldItem,查总记录数,查汇总统计
- 数据层缓存。Sql缓存,更新机制
- 实体缓存。全表整理缓存,更新机制
- 对象缓存。字典缓存,适用用户等数据较多场景。
- 百亿级性能。字段精炼,索引完备,合理查询,充分利用缓存
- 实体工厂。元数据,通用处理程序
- 角色权限。Membership
- 导入导出。Xml,Json,二进制,网络或文件
- 分表分库。常见拆分逻辑
- 高级统计。聚合统计,分组统计
- 批量写入。批量插入,批量Upsert,异步保存
- 实体队列。写入级缓存,提升性能。
- 备份同步。备份数据,恢复数据,同步数据
- 数据服务。提供RPC接口服务,远程执行查询,例如SQLite网络版
- 大数据分析。ETL抽取,调度计算处理,结果持久化