SqlSugar本地缓存查询实现方式
有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本地缓存查询实现方式的更多相关文章
- iOS五种本地缓存数据方式
iOS五种本地缓存数据方式 iOS本地缓存数据方式有五种:前言 1.直接写文件方式:可以存储的对象有NSString.NSArray.NSDictionary.NSData.NSNumber,数据 ...
- 本地缓存,Redis缓存,数据库DB查询(结合代码分析)
问题背景 为什么要使用缓存?本地缓存/Redis缓存/数据库查询优先级? 一.为什么要使用缓存 原因:CPU的速度远远高于磁盘IO的速度问题:很多信息存在数据库当中的,每次查询数据库就是一次IO操作所 ...
- Hibernate的四种查询方式(主键查询,HQL查询,Criteria查询,本地sql查询)和修改和添加
Hibernate的添加,修改,查询(三种查询方式)的方法: 案例演示: 1:第一步,导包,老生常谈了都是,省略: 2:第二步,创建数据库和数据表,表结构如下所示: 3:第三步创建实体类User.ja ...
- 微信小程序之本地缓存(十)
[未经作者本人同意,请勿以任何形式转载] 目前,微信给每个小程序提供了10M的本地缓存空间(哎哟妈呀好大) 有了本地缓存,你的小程序可以做到: 离线应用(已测试在无网络的情况下,可以操作缓存数据) 流 ...
- Java学习之ConcurrentHashMap实现一个本地缓存
ConcurrentHashMap融合了Hashtable和HashMap二者的优势. Hashtable是做了线程同步,HashMap未考虑同步.所以HashMap在单线程下效率较高,Hashtab ...
- 第七章 企业项目开发--本地缓存guava cache
1.在实际项目开发中,会使用到很多缓存技术,而且数据库的设计一般也会依赖于有缓存的情况下设计. 常用的缓存分两种:本地缓存和分布式缓存. 常用的本地缓存是guava cache,本章主要介绍guava ...
- RxJava(十)switchIfEmpty操作符实现Android检查本地缓存逻辑判断
欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52585912 本文出自:[余志强的博客] switchIfEmpty ...
- 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式
一. 背景 说起EF的增删改操作,相信很多人都会说,有两种方式:① 通过方法操作 和 ② 通过状态控制. 相信你在使用EF进行删除或修改操作的时候,可能会遇到以下错误:“ The object c ...
- redis订阅发布消息操作本地缓存
Redis 本地缓存+远程缓存方案 使用纯java的ehcache作为本地缓存 Reids 作为远程分布式缓存 解决redis缓存压力过大,提高缓存速度,以及缓存性能. Redis和ehcache缓存 ...
- 使用Guava cache构建本地缓存
前言 最近在一个项目中需要用到本地缓存,在网上调研后,发现谷歌的Guva提供的cache模块非常的不错.简单易上手的api:灵活强大的功能,再加上谷歌这块金字招牌,让我毫不犹豫的选择了它.仅以此博客记 ...
随机推荐
- Optional避免频繁判空的神器
1. 创建Optional //创建空的 Optional Optional<Object> optional = Optional.empty(); //创建非空的 Optional 如 ...
- vue中实际代码模拟JS中promise调接口的运行流程
假设我们有一个需要调用接口的场景,我们可以使用Vue中的axios库来发送请求.以下是一个简单的例子: // 引入axios库import axios from 'axios' // 定义一个函数,用 ...
- [[SCOI2008]城堡] 解题报告
[SCOI2008]城堡 最大值最小,显然二分答案,但考虑二分后如何 check. \(n\) 个点 \(n\) 条边,显然这是一个基环树森林.对于基环树,常用的套路是拆环为链,枚举删去哪条边.但这题 ...
- ☆常用的Sql语句汇总(DDL/DML)
常用的sql语句汇总 1.获取所有表名.表信息 里面有表注释 数据库种类 sql 备注 mysql -- 获取所有表名.视图名show tables-- 获取 dev_test_data数据库 所有表 ...
- 2022-09-15:Range模块是跟踪数字范围的模块。 设计一个数据结构来跟踪表示为 半开区间 的范围并查询它们。 半开区间 [left, right) 表示所有 left <= x < righ
2022-09-15:Range模块是跟踪数字范围的模块. 设计一个数据结构来跟踪表示为 半开区间 的范围并查询它们. 半开区间 [left, right) 表示所有 left <= x < ...
- 2022-04-15:给定一个非负数组arr,学生依次坐在0~N-1位置,每个值表示学生的安静值, 如果在i位置安置插班生,那么i位置的安静值变成0,同时任何同学都会被影响到而减少安静值, 同学安静值
2022-04-15:给定一个非负数组arr,学生依次坐在0~N-1位置,每个值表示学生的安静值, 如果在i位置安置插班生,那么i位置的安静值变成0,同时任何同学都会被影响到而减少安静值, 同学安静值 ...
- 2022-01-05:有四种诗的韵律分别为: AABB、ABAB、ABBA、AAAA。 比如 : 1 1 3 3就属于AABB型的韵律、
2022-01-05:有四种诗的韵律分别为: AABB.ABAB.ABBA.AAAA. 比如 : 1 1 3 3就属于AABB型的韵律.6 6 6 6就属于AAAA型的韵律等等, 一个数组arr,当然 ...
- (偶尔更新)【Linux】Linux常见不常用命令收集
本文时间 2023-05-20 作者:sugerqube漆瓷 cd,vi,clear这些属于常见常用命令本文不再赘述. 安装命令 yum install vim举例安装vim rpm -ivh a.r ...
- 机器学习数据顺序随机打乱:Python实现
本文介绍基于Python语言,实现机器学习.深度学习等模型训练时,数据集打乱的具体操作. 1 为什么要打乱数据集 在机器学习中,如果不进行数据集的打乱,则可能导致模型在训练过程中出现具有&qu ...
- 2015年蓝桥杯C/C++大学B组省赛真题(加法变乘法)
题目描述: 我们都知道:1+2+3+ ... + 49 = 1225 现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 比如: 1+2+3+...+10*11+12+...+27*28+2 ...