二级缓存

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二级缓存的更多相关文章

  1. 探索ASP.NET MVC5系列之~~~5.缓存篇(页面缓存+二级缓存)

    其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...

  2. [原创]关于mybatis中一级缓存和二级缓存的简单介绍

    关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...

  3. Hibernate+EhCache配置二级缓存

    步骤: 第一步:加入ehcache.jar 第二步: 在src目录下新建一个文件,名为:ehcache.xml 第三步:在hibernate配置文件的<session-factory>下配 ...

  4. MyBatis 延迟加载,一级缓存,二级缓存设置

    什么是延迟加载 resultMap中的association和collection标签具有延迟加载的功能. 延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息.使用关联信息时再去加载关联信息 ...

  5. EF 二级缓存 EFSecondLevelCache

    EFSecondLevelCache ======= Entity Framework .x Second Level Caching Library. 二级缓存是一个查询缓存.EF命令的结果将存储在 ...

  6. MVC实用架构设计(三)——EF-Code First(5):二级缓存

    前言 今天我们来谈谈EF的缓存问题. 缓存对于一个系统来说至关重要,但是是EF到版本6了仍然没有见到有支持查询结果缓存机制的迹象.EF4开始会把查询语句编译成存储过程缓存在Sql Server中,据说 ...

  7. hibernate笔记--缓存机制之 二级缓存(sessionFactory)和查询缓存

    二级缓存(sessionFactory): Hibernate的二级缓存由SessionFactory对象管理,是应用级别的缓存.它可以缓存整个应用的持久化对象,所以又称为“SessionFactor ...

  8. Hibernate ——二级缓存

    一.Hibernate 二级缓存 1.Hibernate 二级缓存是 SessionFactory 级别的缓存. 2.二级缓存分为两类: (1)Hibernate内置二级缓存 (2)外置缓存,可配置的 ...

  9. hibernate缓存(一级缓存、二级缓存)

    一.一级缓存(Session缓存)      意义:提高hibernate查询效率.      缺点:可能会因并发,产生数据不一致.      基于session的缓存,利用hibernate执行查询 ...

  10. HIbernate二级缓存

    一.定义: 二级缓存是进程或集群范围内的缓存,可以被所有的Session共享,是可配置的插件 二.二级缓存原理图 解析:每次从二级缓存中取出的对象,都是一个新的对象. 三.配置步骤如下: 同理:以员工 ...

随机推荐

  1. npm 环境搭建---全局安装angular cli ---升级本地angular版本---搭建ng-alain

    1.环境搭建 node -v # 查看 Node.js 当前版本 npm -v # 查看 Npm 当前版本 2.设定淘宝提供 Npm 源镜像 # 设置淘宝源 npm config set regist ...

  2. 设置多个系统---vue-el-admin

    1. 修改\src\settings.js const ppp= { title: 'XXXX System', titleZH: 'XXXX系統', flag: 'ppp' } const syst ...

  3. vue3 | isRef、unref、toRef、toRefs

    isRef 检查某个值是否是ref.是返回true,否则返回false. const num = ref(10); const num1 = 20; const num2 = reactive({ d ...

  4. 在 Asp.Net Core 中什么是认证和授权

    认证(Authentication) 和 授权(Authorization)在 Asp.Net core 充当了两个不同的职责.有的老伙计在理解的时候还存在误解.本文我们将会通过一些简单的例子来说明这 ...

  5. Mybatis Plus整合PageHelper分页的实现示例

    1.依赖引入 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pag ...

  6. MySQL-SQL语句查询关键字

    1.SQL语句查询关键字 1.select:指定需要查找的字段信息,eg:select *,select name.同时select也支持对字段做处理,eg:select char_length(na ...

  7. 使用 LoRA 进行 Stable Diffusion 的高效参数微调

    LoRA: Low-Rank Adaptation of Large Language Models 是微软研究员引入的一项新技术,主要用于处理大模型微调的问题.目前超过数十亿以上参数的具有强能力的大 ...

  8. idea debug---启动超级慢,提示”Method breakpoints may dramatically slow down debugging“的解决办法

    https://blog.csdn.net/hanqing456/article/details/111878982 1.问题项目正常启动的时候没问题,debug模式就卡住了,很久不动.我推测是哪个断 ...

  9. Ceph RGW误删index对象恢复

    版本 [root@control1 ~]# ceph -v ceph version 14.2.22 (ca74598065096e6fcbd8433c8779a2be0c889351) nautil ...

  10. 分布式机器学习:异步SGD和Hogwild!算法(Pytorch)

    1 导引 我们在博客<分布式机器学习:同步并行SGD算法的实现与复杂度分析(PySpark)>和博客<分布式机器学习:模型平均MA与弹性平均EASGD(PySpark) >中介 ...