二级缓存

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

最新文章

  1. Unicode简介
  2. 自定义RatingBar的一个问题(只显示显示一个星星)
  3. Linux文件系统应用---系统数据备份和迁移(用户角度)
  4. 浅入ARP
  5. MFC浅析(7) CWnd类虚函数的调用时机、缺省实现
  6. Http,Https (SSL)的Url绝对路径,相对路径解决方案Security Switch 4.2 英文帮助文档 分类: ASP.NET 2014-10-28 10:50 147人阅读 评论(1) 收藏
  7. 离线安装maven,重新打开eclipse报错处理方法
  8. java练习-滚动文字
  9. jquery 实现横向滑动自动切换源码(同时显示多张图片)
  10. STM32基础问题分析——PWM配置
  11. http 400错误【原】
  12. Chrome浏览器自动填充&lt;input&gt;标签的密码
  13. MySQL数据库 命令行 学习笔记(一)
  14. 移动端rem计算
  15. Oracle-归档日志详解(运行模式、分类)
  16. SQL Server Collation解惑
  17. 【BZOJ1077】天平(差分约束)
  18. shell常用编程格式
  19. Java_单例模式
  20. 使用gdb和gdbserver调试Android C/C++程序

热门文章

  1. 【学习笔记】Tarjan 图论算法
  2. Flutter 3.7 新特性:介绍后台isolate通道
  3. 【Android】Android 源码方式使用 opencv 库文件
  4. 文盘Rust -- rust 连接云上数仓 starwift
  5. Feign远程调用 (介绍与使用)
  6. Asp.Net Core中利用过滤器控制Nginx的缓存时间
  7. 使用Addressables.LoadAssetAsync&lt;Asset&gt;(target)加载unity资源,不止是gameobject
  8. Class path contains multiple SLF4J bindings解决
  9. Windows环境下FTP Server在局域网内的搭建
  10. 【Raspberry Pi / 树莓派】小小工控机担起大大责任