关于sqlsugar二级缓存
二级缓存
1、优点
(1)、维护方便:SqlSugar的 二级缓存 支持单表和多表的 CRUD 自动缓存更新 ,减少了复杂的缓存KEY维护操作
(2)、使用方便:可以直接在Queryable.WithCache直接缓存当前对象
(3)、外部集成: 通过实现ICacheService接口,来调用外部缓存方法,想用什么实现什么
2、原理
二级缓存是将结果集进行缓存,当SQL和参数没发生变化的时候从缓存里面读取数据,减少数据库的读取操作
注意:Sql语句一直在变的就不适合缓存,比如 ID=?这种SQL都在变化,并且?的数量巨大这种情况就不要使用缓存了,缓存适合加
在Sql和参数的值相对固定查询语句上面,数量不多可以一次性全部查出来,下次直接内存操作
验证: 一个正常的系统同时存在的缓存Key应该在 1000个以下,如果超过这个数量说明很多地方缓存用的不当
3、使用
3.1 实现接口 ICacheService
代码:接口实现
/// <summary>
/// SqlSugar二级缓存(必须是内存缓存)
/// </summary>
public class SqlSugarCache : ICacheService
{
private static readonly ICache _cache = Cache.Default;
public void Add<V>(string key, V value)
{
_cache.Set(key, value);
}
public void Add<V>(string key, V value, int cacheDurationInSeconds)
{
_cache.Set(key, value, cacheDurationInSeconds);
}
public bool ContainsKey<V>(string key)
{
return _cache.ContainsKey(key);
}
public V Get<V>(string key)
{
return _cache.Get<V>(key);
}
public IEnumerable<string> GetAllKey<V>()
{
return _cache.Keys;
}
public V GetOrCreate<V>(string cacheKey, Func<V> create, int cacheDurationInSeconds = int.MaxValue)
{
if (!_cache.TryGetValue<V>(cacheKey, out V value))
{
value = create();
_cache.Set(cacheKey, value, cacheDurationInSeconds);
}
return value;
}
public void Remove<V>(string key)
{
_cache.Remove(key);
}
}
3.2 创建使用二级缓存,配合租户数据过滤使用
实现
//二级缓存 : SqlSugar二级缓存(必须是内存缓存)
db.CurrentConnectionConfig.ConfigureExternalServices = new ConfigureExternalServices()
{
//AppSettingsConstVars.RedisUseCache
//判断是否开启redis设置二级缓存方式
//DataInfoCacheService = AppSettingsConstVars.RedisUseCache ? (ICacheService)new SqlSugarRedisCache000() : new SqlSugarMemoryCache()
DataInfoCacheService = new SqlSugarCache(),
};
//... ... ...
#region 实体配置过滤器
/// <summary>
/// 配置租户过滤器
/// </summary>
private static void SetTenantEntityFilter(SqlSugarClient db)
{
//炒鸡管理员工 直接略过
var isSuperAdmin = App.User?.Claims?.Where(p => p.Type == ClaimTypes.Role)?.Any(p => p.Value == "superadmin") ?? false ;
if (isSuperAdmin) return;
var tenantId = App.User?.FindFirst(GlobalConstVars.TenantId)?.Value;
if (string.IsNullOrWhiteSpace(tenantId)) return;
// 配置租户缓存
var cacheKey = $"db:{211314}:TenantId:{tenantId}";
var tableFilterItemList = db.DataCache.Get<List<TableFilterItem<object>>>(cacheKey);//sqlsugar 二级缓存
if (tableFilterItemList == null)
{
// 获取租户实体数据表
var entityTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass
&& (u.BaseType == typeof(EntityTenantNew) || u.BaseType == typeof(EntityTenantId)));
if (!entityTypes.Any()) return;
var tableFilterItems = new List<TableFilterItem<object>>();
foreach (var entityType in entityTypes)
{
var lambda = DynamicExpressionParser.ParseLambda(new[] {
Expression.Parameter(entityType, "u") }, typeof(bool), $"{nameof(EntityTenantNew.tenantId)} == @0", long.Parse(tenantId));
var tableFilterItem = new TableFilterItem<object>(entityType, lambda);
tableFilterItems.Add(tableFilterItem);
db.QueryFilter.Add(tableFilterItem);
}
db.DataCache.Add(cacheKey, tableFilterItems);
}
else
{
tableFilterItemList.ForEach(u =>
{
db.QueryFilter.Add(u);
});
}
}
#endregion
关于sqlsugar二级缓存的更多相关文章
- 探索ASP.NET MVC5系列之~~~5.缓存篇(页面缓存+二级缓存)
其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...
- [原创]关于mybatis中一级缓存和二级缓存的简单介绍
关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...
- Hibernate+EhCache配置二级缓存
步骤: 第一步:加入ehcache.jar 第二步: 在src目录下新建一个文件,名为:ehcache.xml 第三步:在hibernate配置文件的<session-factory>下配 ...
- MyBatis 延迟加载,一级缓存,二级缓存设置
什么是延迟加载 resultMap中的association和collection标签具有延迟加载的功能. 延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息.使用关联信息时再去加载关联信息 ...
- EF 二级缓存 EFSecondLevelCache
EFSecondLevelCache ======= Entity Framework .x Second Level Caching Library. 二级缓存是一个查询缓存.EF命令的结果将存储在 ...
- MVC实用架构设计(三)——EF-Code First(5):二级缓存
前言 今天我们来谈谈EF的缓存问题. 缓存对于一个系统来说至关重要,但是是EF到版本6了仍然没有见到有支持查询结果缓存机制的迹象.EF4开始会把查询语句编译成存储过程缓存在Sql Server中,据说 ...
- hibernate笔记--缓存机制之 二级缓存(sessionFactory)和查询缓存
二级缓存(sessionFactory): Hibernate的二级缓存由SessionFactory对象管理,是应用级别的缓存.它可以缓存整个应用的持久化对象,所以又称为“SessionFactor ...
- Hibernate ——二级缓存
一.Hibernate 二级缓存 1.Hibernate 二级缓存是 SessionFactory 级别的缓存. 2.二级缓存分为两类: (1)Hibernate内置二级缓存 (2)外置缓存,可配置的 ...
- hibernate缓存(一级缓存、二级缓存)
一.一级缓存(Session缓存) 意义:提高hibernate查询效率. 缺点:可能会因并发,产生数据不一致. 基于session的缓存,利用hibernate执行查询 ...
- HIbernate二级缓存
一.定义: 二级缓存是进程或集群范围内的缓存,可以被所有的Session共享,是可配置的插件 二.二级缓存原理图 解析:每次从二级缓存中取出的对象,都是一个新的对象. 三.配置步骤如下: 同理:以员工 ...
随机推荐
- SpringCloud————>了解什么是微服务技术
SpringCloud是Spring为微服务架构思想做的一个一站式实现.从某种程度是可以简单的理解为,微服务是一个概念.一个项目开发的架构思想.SpringCloud是微服务架构的一种java实现. ...
- 高并发环境下3种方式优化Tomcat性能
摘要:Tomcat作为最常用的Java Web服务器,随着并发量越来越高,Tomcat的性能会急剧下降,那有没有什么方法来优化Tomcat在高并发环境下的性能呢? 本文分享自华为云社区<[高并发 ...
- 使用 NineData 高效编写 SQL
SQL 是 Structured Query Language 的缩写,中文翻译为"结构化查询语言".它是关系型数据库的标准语言,所有的关系型数据库管理系统(RDBMS),比如 M ...
- vulnhub靶场之CEREAL: 1
准备: 攻击机:虚拟机kali.本机win10. 靶机:Cereal: 1,下载地址:https://download.vulnhub.com/cereal/Cereal.ova,下载后直接vbox打 ...
- 12月23日内容总结——csrf跨站请求伪造、校验策略、相关装饰器,auth认证模块及相关操作,拓展auth_user表
目录 一.csrf跨站请求伪造 概念引入 概念讲解 二.csrf校验策略 概念讲解 form表单操作csrf策略 ajax请求csrf策略 三.csrf相关装饰器 四.auth认证模块 五.auth认 ...
- Python第三方库arrow
Python第三方库arrow https://pypi.org/project/arrow/ 简介 处理时间日期的一个第三方库 Arrow is a Python library that offe ...
- Java堆外缓存(一个很有意思的应用)
我们在开发过程中会遇到这样的场景:就是一个服务的各项 JVM 的配置都比较合理的情况下,它的 GC 情况还是不容乐观.分析之后发现有 2 个对象特别巨大,占了总存活堆内存的 90%以上.其中第 1 大 ...
- 【一句话】:first-child 伪类解释
关键词 不起作用 选不到 失败 解释 input:first-child 要求既是input元素,而且是兄弟节点中的第一个 如果要找第一个input元素,那么用input:first-of-type ...
- ColorFolder文件管理工具使用教程
ColorFolder ColorFolder Mac中文版是Mac上的一款文件夹图标修改工具,可以帮助您一键改变文件夹的颜色.帮助你更好的保持良好排序和分类,让你的文件显得更有条理,并有效提高文件管 ...
- Adobe GENP2019~2022 for Win 一键激活
Adobe GENP2019~2022 for Win 一键激活 一.简介 GenP是一个由国外团队开发的Adobe Win全系列软件激活工具,专门在Win系统上激活所有Adobe软件的2019和20 ...