关于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共享,是可配置的插件 二.二级缓存原理图 解析:每次从二级缓存中取出的对象,都是一个新的对象. 三.配置步骤如下: 同理:以员工 ...
随机推荐
- 腾讯出品小程序自动化测试框架【Minium】系列(四)API详解(上)
写在前面 不知道是不是因为之前出过书的原因,在写教程之类的文章,会潜意识有自带目录和章节的感觉在里面,有点说不出的感觉吧. 上篇文章我们介绍了关于元素定位的使用方法,这篇文章将为大家分享关于Miniu ...
- c++代码实现中时间复杂度的不断优化
先来介绍一下时间复杂度: 同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率.算法分析的目的在于选择合适算法和改进算法. 计算机科学中,算法的时间复杂度是一个函数,它定量描述了该 ...
- Java入门与进阶P-4.5+P-4.6
逻辑类型 关系运算的结果是要给逻辑值,true或false.这个值可以保存在一个对应的逻辑类型变量中,这样的变量类型是boolean 布尔是为了纪念George Boole对逻辑计算得到贡献 bool ...
- spring注入静态变量有几种方法?不看的都掉坑里了!
springboot中经常会用到properties文件中的配置,一般使用@Value注入,但是针对Utils工具类,需要注入一个静态变量有几种方法?为什么有的同学注入的值为null? 代码示例 如果 ...
- 对线面试官:浅聊一下 Java 虚拟机栈?
对于 JVM(Java 虚拟机)来说,它有两个非常重要的区域,一个是栈(Java 虚拟机栈),另一个是堆.堆是 JVM 的存储单位,所有的对象和数组都是存储在此区域的:而栈是 JVM 的运行单位,它主 ...
- 嵌入式Linux—文件IO
文件IO 在 Linux 系统中,一切都是" 文件":普通文件.驱动程序.网络通信等等.所有的操作,都是通过"文件 IO"来进行的.所以,很有必要掌握文件操作的 ...
- @RestControllerAdvice全局异常统一处理
spring项目中,我们通常规定了返回的格式(成功-失败-异常),特别是异常怎么处理方便呢? 1.自定义状态码实体 package com.ruoyi.common.constant; /** * 返 ...
- cannot load "mso.dll" vs2008 web开发问题
已成功解决办法: ①将VS 2008安装包WCUWebDesignerCoreWebDesignerCore.exe提取并重新安装: ②将C:Program Files/Common Files/Mi ...
- The Missing Semester - 第二讲 学习笔记
第二讲 Shell 工具和脚本 课程视频地址: https://www.bilibili.com/video/BV1Vv411v7FR 本机学习使用平台:虚拟机ubuntu18.04.6 主题一:Sh ...
- docker-compose部署rocketmq
docker-compose安装: 1.从github上下载docker-compose二进制文件安装 Ubuntu下载docker-compose文件 sudo curl -L https://gi ...