有C#的国产ORM SqlSugar 好久了,实在话还不错,不过毕竟是早期产物不能过分要求规范化,有些项目查询语句需要用到缓存,官方是redis,我写了个本地缓存借助ConcurrentBag,因为有的项目禁止过分依赖三方组件,以下是我实现的方法,可供大家参考:

using SqlSugar;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq; namespace Common
{
/// <summary>
/// SqlSugar本地缓存实现
/// </summary>
public class SqlSugarLocalCache : ICacheService
{
public static ConcurrentBag<Tuple<string, object, DateTime>> CacheList = new ConcurrentBag<Tuple<string, object, DateTime>>(); private readonly DateTime now; /// <summary>
/// 最大缓存天数
/// </summary>
public int MaxCacheDays { get; set; } = 3; public SqlSugarLocalCache()
{
now = DateTime.Now;
} public void Add<V>(string key, V value)
{
ExpiredMonitoring(); if (MaxCacheDays == 0) MaxCacheDays = 3;
CacheList.Add(new Tuple<string, object, DateTime>(key, value, now.AddDays(MaxCacheDays)));
} public void Add<V>(string key, V value, int cacheDurationInSeconds)
{
ExpiredMonitoring();
if (MaxCacheDays > 0)
{
int s = GetDaysSeconds(MaxCacheDays);
if (s < cacheDurationInSeconds) cacheDurationInSeconds = s;
}
CacheList.Add(new Tuple<string, object, DateTime>(key, value, now.AddSeconds(cacheDurationInSeconds)));
} public bool ContainsKey<V>(string key)
{
ExpiredMonitoring();
return CacheList.Any(m => m.Item1 == key);
} public V Get<V>(string key)
{
ExpiredMonitoring();
return (V)CacheList.Where(m => m.Item1 == key).FirstOrDefault()?.Item2;
} public IEnumerable<string> GetAllKey<V>()
{
ExpiredMonitoring();
return CacheList.Where(m => m.Item1.StartsWith("SqlSugarDataCache.")).Select(m => m.Item1);
} public V GetOrCreate<V>(string cacheKey, Func<V> create, int cacheDurationInSeconds = int.MaxValue)
{
ExpiredMonitoring(); if (MaxCacheDays > 0)
{
int s = GetDaysSeconds(MaxCacheDays);
if (s < cacheDurationInSeconds) cacheDurationInSeconds = s;
} V result; if (ContainsKey<V>(cacheKey))
{
result = Get<V>(cacheKey);
result = result == null ? create() : result;
}
else
{
result = create();
Add(cacheKey, result, cacheDurationInSeconds);
} return result;
} public void Remove<V>(string key)
{
ExpiredMonitoring();
if (ContainsKey<V>(key))
{
var result = CacheList.Where(m => m.Item1 == key).FirstOrDefault();
CacheList.TryTake(out result);
}
} /// <summary>
/// 过期监听
/// </summary>
private void ExpiredMonitoring()
{
var expList = CacheList.Where(m => m.Item3 < now).ToList();
int l = expList.Count;
for (int i = 0; i < l; i++)
{
var item = expList[i];
CacheList.TryTake(out item);
}
} /// <summary>
/// 获取指定天数秒数
/// </summary>
/// <param name="days">指定天数</param>
/// <returns></returns>
private static int GetDaysSeconds(int days)
{
return 60 * 60 * 24 * days;
}
}
}

  

  

SqlSugar本地缓存查询实现方式的更多相关文章

  1. iOS五种本地缓存数据方式

    iOS五种本地缓存数据方式   iOS本地缓存数据方式有五种:前言 1.直接写文件方式:可以存储的对象有NSString.NSArray.NSDictionary.NSData.NSNumber,数据 ...

  2. 本地缓存,Redis缓存,数据库DB查询(结合代码分析)

    问题背景 为什么要使用缓存?本地缓存/Redis缓存/数据库查询优先级? 一.为什么要使用缓存 原因:CPU的速度远远高于磁盘IO的速度问题:很多信息存在数据库当中的,每次查询数据库就是一次IO操作所 ...

  3. Hibernate的四种查询方式(主键查询,HQL查询,Criteria查询,本地sql查询)和修改和添加

    Hibernate的添加,修改,查询(三种查询方式)的方法: 案例演示: 1:第一步,导包,老生常谈了都是,省略: 2:第二步,创建数据库和数据表,表结构如下所示: 3:第三步创建实体类User.ja ...

  4. 微信小程序之本地缓存(十)

    [未经作者本人同意,请勿以任何形式转载] 目前,微信给每个小程序提供了10M的本地缓存空间(哎哟妈呀好大) 有了本地缓存,你的小程序可以做到: 离线应用(已测试在无网络的情况下,可以操作缓存数据) 流 ...

  5. Java学习之ConcurrentHashMap实现一个本地缓存

    ConcurrentHashMap融合了Hashtable和HashMap二者的优势. Hashtable是做了线程同步,HashMap未考虑同步.所以HashMap在单线程下效率较高,Hashtab ...

  6. 第七章 企业项目开发--本地缓存guava cache

    1.在实际项目开发中,会使用到很多缓存技术,而且数据库的设计一般也会依赖于有缓存的情况下设计. 常用的缓存分两种:本地缓存和分布式缓存. 常用的本地缓存是guava cache,本章主要介绍guava ...

  7. RxJava(十)switchIfEmpty操作符实现Android检查本地缓存逻辑判断

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52585912 本文出自:[余志强的博客] switchIfEmpty ...

  8. 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式

    一. 背景 说起EF的增删改操作,相信很多人都会说,有两种方式:① 通过方法操作  和  ② 通过状态控制. 相信你在使用EF进行删除或修改操作的时候,可能会遇到以下错误:“ The object c ...

  9. redis订阅发布消息操作本地缓存

    Redis 本地缓存+远程缓存方案 使用纯java的ehcache作为本地缓存 Reids 作为远程分布式缓存 解决redis缓存压力过大,提高缓存速度,以及缓存性能. Redis和ehcache缓存 ...

  10. 使用Guava cache构建本地缓存

    前言 最近在一个项目中需要用到本地缓存,在网上调研后,发现谷歌的Guva提供的cache模块非常的不错.简单易上手的api:灵活强大的功能,再加上谷歌这块金字招牌,让我毫不犹豫的选择了它.仅以此博客记 ...

随机推荐

  1. 安装scss版本号(不报错)

    npm install sass-loader@8.0.2 node-sass@4.14.1

  2. 2022-11-03:给定一个数组arr,和一个正数k 如果arr[i] == 0,表示i这里既可以是左括号也可以是右括号, 而且可以涂上1~k每一种颜色 如果arr[i] != 0,表示i这里已经确

    2022-11-03:给定一个数组arr,和一个正数k 如果arr[i] == 0,表示i这里既可以是左括号也可以是右括号, 而且可以涂上1~k每一种颜色 如果arr[i] != 0,表示i这里已经确 ...

  3. 2020-10-09:假如我能拿到别人的URL,然后篡改数据(金额)发送给系统,如何避免这种事情的发生?

    福哥答案2020-10-09:#福大大架构师每日一题# [此答案来自知乎:](https://www.zhihu.com/question/424764253) 这种敏感url一般都有安全机制的:1. ...

  4. 2021-03-29:无序数组arr,子数组-1和1的数量一样多,请问最长子数组的长度是多少?

    2021-03-29:无序数组arr,子数组-1和1的数量一样多,请问最长子数组的长度是多少? 福大大 答案2021-03-29: [1, -1, 2, 3, -4, -1, 9]变成[1, -1, ...

  5. 2022-02-11:单词缩写。 给定一个由n个不重复非空字符串组成的数组,你需要按照以下规则为每个单词生成最小的缩写。 初始缩写由起始字母+省略字母的数量+结尾字母组成。 若存在冲突,亦即多于一个单

    2022-02-11:单词缩写. 给定一个由n个不重复非空字符串组成的数组,你需要按照以下规则为每个单词生成最小的缩写. 初始缩写由起始字母+省略字母的数量+结尾字母组成. 若存在冲突,亦即多于一个单 ...

  6. Casdoor 开始

    Casdoor 是一个基于 OAuth 2.0 / OIDC 的中心化的单点登录(SSO)身份验证平台,简单来说,就是 Casdoor 可以帮你解决用户管理的难题,你无需开发用户登录.注册等与用户鉴权 ...

  7. pywin32和wmi的安装和测试

    E:\pyAPP\Madking\MadKingClient>python bin\NedStark.py collect_dataE:\pyAPP\Madking\MadKingClientT ...

  8. drf——全局处理异常、接口文档、jwt介绍、based64编码与解码

    全局异常处理原理 # 对于前端来讲,后端即便报错,也要返回统一的格式,前端便于处理 {code:999,msg:'系统异常,请联系系统管理员'} # 只要三大认证,视图类的方法出了异常,都会执行一个函 ...

  9. JQuery的认识和安装

    jQuery 是一个 JavaScript 函数库. jQuery 是一个轻量级的"写的少,做的多"的 JavaScript 库. jQuery 库包含以下功能: HTML 元素选 ...

  10. 魔力屏障 (magic) 题解

    魔力屏障 (magic) [问题描述] 小 Z 生活在神奇的魔法大陆上.今天他的魔法老师给了它这样一个法阵作为它 的期末考试题目: 法阵由从左至右 n 道魔力屏障组成,每道屏障有一个临界值 a,如果它 ...