详解C#中Helper类的使用
作者:CoolDog 发布时间:2021-10-05 07:37:28
标签:C#,Helper类
使用背景
项目中用户频繁访问数据库会导致程序的卡顿,甚至堵塞。使用缓存可以有效的降低用户访问数据库的频次,有效的减少并发的压力。保护后端真实的服务器。
对于开发人员需要方便调用,所以本文提供了helper类对缓存有了封装。分了三个Cache,SystemCache,RedisCache(默认缓存,系统缓存,Redis缓存)。话不多说,开撸!
使用方法
1.引用CSRedisCore
可以看到,csredis支持.net40/.net45/.netstandard平台,还是比较友好的。
2.增加helper类代码
CacheHelper.cs
/// <summary>
/// 缓存帮助类
/// </summary>
public class CacheHelper
{
/// <summary>
/// 静态构造函数,初始化缓存类型
/// </summary>
static CacheHelper()
{
SystemCache = new SystemCache();
if(true)//项目全局变量类,可自行定义
// if (GlobalSwitch.OpenRedisCache)
{
try
{
RedisCache = new RedisCache(GlobalSwitch.RedisConfig);
}
catch
{
}
}
switch (GlobalSwitch.CacheType)
{
case CacheType.SystemCache:Cache = SystemCache;break;
case CacheType.RedisCache:Cache = RedisCache;break;
default:throw new Exception("请指定缓存类型!");
}
}
/// <summary>
/// 默认缓存
/// </summary>
public static ICache Cache { get; }
/// <summary>
/// 系统缓存
/// </summary>
public static ICache SystemCache { get; }
/// <summary>
/// Redis缓存
/// </summary>
public static ICache RedisCache { get; }
}
ICache.cs
/// <summary>
/// 缓存操作接口类
/// </summary>
public interface ICache
{
#region 设置缓存
/// <summary>
/// 设置缓存
/// </summary>
/// <param name="key">主键</param>
/// <param name="value">值</param>
void SetCache(string key, object value);
/// <summary>
/// 设置缓存
/// 注:默认过期类型为绝对过期
/// </summary>
/// <param name="key">主键</param>
/// <param name="value">值</param>
/// <param name="timeout">过期时间间隔</param>
void SetCache(string key, object value, TimeSpan timeout);
/// <summary>
/// 设置缓存
/// 注:默认过期类型为绝对过期
/// </summary>
/// <param name="key">主键</param>
/// <param name="value">值</param>
/// <param name="timeout">过期时间间隔</param>
/// <param name="expireType">过期类型</param>
void SetCache(string key, object value, TimeSpan timeout, ExpireType expireType);
/// <summary>
/// 设置键失效时间
/// </summary>
/// <param name="key">键值</param>
/// <param name="expire">从现在起时间间隔</param>
void SetKeyExpire(string key, TimeSpan expire);
#endregion
#region 获取缓存
/// <summary>
/// 获取缓存
/// </summary>
/// <param name="key">主键</param>
object GetCache(string key);
/// <summary>
/// 获取缓存
/// </summary>
/// <param name="key">主键</param>
/// <typeparam name="T">数据类型</typeparam>
T GetCache<T>(string key) where T : class;
/// <summary>
/// 是否存在键值
/// </summary>
/// <param name="key">主键</param>
/// <returns></returns>
bool ContainsKey(string key);
#endregion
#region 删除缓存
/// <summary>
/// 清除缓存
/// </summary>
/// <param name="key">主键</param>
void RemoveCache(string key);
#endregion
}
#region 类型定义
/// <summary>
/// 值信息
/// </summary>
public struct ValueInfoEntry
{
public string Value { get; set; }
public string TypeName { get; set; }
public TimeSpan? ExpireTime { get; set; }
public ExpireType? ExpireType { get; set; }
}
/// <summary>
/// 过期类型
/// </summary>
public enum ExpireType
{
/// <summary>
/// 绝对过期
/// 注:即自创建一段时间后就过期
/// </summary>
Absolute,
/// <summary>
/// 相对过期
/// 注:即该键未被访问后一段时间后过期,若此键一直被访问则过期时间自动延长
/// </summary>
Relative,
}
#endregion
RedisCache.cs
/// <summary>
/// Redis缓存
/// </summary>
public class RedisCache : ICache
{
/// <summary>
/// 构造函数
/// 注意:请以单例使用
/// </summary>
/// <param name="config">配置字符串</param>
public RedisCache(string config)
{
_redisCLient = new CSRedisClient(config);
}
private CSRedisClient _redisCLient { get; }
public bool ContainsKey(string key)
{
return _redisCLient.Exists(key);
}
public object GetCache(string key)
{
object value = null;
var redisValue = _redisCLient.Get(key);
if (redisValue.IsNullOrEmpty())
return null;
ValueInfoEntry valueEntry = redisValue.ToString().ToObject<ValueInfoEntry>();
if (valueEntry.TypeName == typeof(string).AssemblyQualifiedName)
value = valueEntry.Value;
else
value = valueEntry.Value.ToObject(Type.GetType(valueEntry.TypeName));
if (valueEntry.ExpireTime != null && valueEntry.ExpireType == ExpireType.Relative)
SetKeyExpire(key, valueEntry.ExpireTime.Value);
return value;
}
public T GetCache<T>(string key) where T : class
{
return (T)GetCache(key);
}
public void SetKeyExpire(string key, TimeSpan expire)
{
_redisCLient.Expire(key, expire);
}
public void RemoveCache(string key)
{
_redisCLient.Del(key);
}
public void SetCache(string key, object value)
{
_SetCache(key, value, null, null);
}
public void SetCache(string key, object value, TimeSpan timeout)
{
_SetCache(key, value, timeout, ExpireType.Absolute);
}
public void SetCache(string key, object value, TimeSpan timeout, ExpireType expireType)
{
_SetCache(key, value, timeout, expireType);
}
private void _SetCache(string key, object value, TimeSpan? timeout, ExpireType? expireType)
{
string jsonStr = string.Empty;
if (value is string)
jsonStr = value as string;
else
jsonStr = value.ToJson();
ValueInfoEntry entry = new ValueInfoEntry
{
Value = jsonStr,
TypeName = value.GetType().AssemblyQualifiedName,
ExpireTime = timeout,
ExpireType = expireType
};
string theValue = entry.ToJson();
if (timeout == null)
_redisCLient.Set(key, theValue);
else
_redisCLient.Set(key, theValue, (int)timeout.Value.TotalSeconds);
}
}
SystemCache.cs
/// <summary>
/// 系统缓存帮助类
/// </summary>
public class SystemCache : ICache
{
public object GetCache(string key)
{
return HttpRuntime.Cache[key];
}
public T GetCache<T>(string key) where T : class
{
return (T)HttpRuntime.Cache[key];
}
public bool ContainsKey(string key)
{
return GetCache(key) != null;
}
public void RemoveCache(string key)
{
HttpRuntime.Cache.Remove(key);
}
public void SetKeyExpire(string key, TimeSpan expire)
{
object value = GetCache(key);
SetCache(key, value, expire);
}
public void SetCache(string key, object value)
{
_SetCache(key, value, null, null);
}
public void SetCache(string key, object value, TimeSpan timeout)
{
_SetCache(key, value, timeout, ExpireType.Absolute);
}
public void SetCache(string key, object value, TimeSpan timeout, ExpireType expireType)
{
_SetCache(key, value, timeout, expireType);
}
private void _SetCache(string key, object value, TimeSpan? timeout, ExpireType? expireType)
{
if (timeout == null)
HttpRuntime.Cache[key] = value;
else
{
if (expireType == ExpireType.Absolute)
{
DateTime endTime = DateTime.Now.AddTicks(timeout.Value.Ticks);
HttpRuntime.Cache.Insert(key, value, null, endTime, Cache.NoSlidingExpiration);
}
else
{
HttpRuntime.Cache.Insert(key, value, null, Cache.NoAbsoluteExpiration, timeout.Value);
}
}
}
}
3.使用
4.说明
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
它是基于高性能的Key-Value、并提供多种语言的 API的非关系型数据库。不过与传统数据库不同的是 redis 的数据是存在内存中的,所以存写速度非常快。
它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)
来源:https://www.cnblogs.com/BFMC/p/16145525.html


猜你喜欢
- mybatis-plus作为mybatis的增强工具,简化了开发中的数据库操作。一旦遇到left join或right join的左右连接,
- 问题描述我在接受 mq 消息的时候,需要做一个重试次数限制,如果超过 maxNum 就发邮件告警,不再重试。所以我需要对 consumer
- 1.首先,需要指定获取的文件夹,以及获取文件的文件名;文件夹:strLocalPath = System.Windows.Forms.App
- 防止程序运行多个实例的方法有多种,如:通过使用互斥量和进程名等.而我想要实现的是:在程序运行多个实例时激活的是第一个实例,使其获得焦点,并在
- MyEclipse *的下载,找到MyEclipse的各种历史版本下载页面:http://www.myeclipsecn.com/简单说下,
- 旧的设计方案开发api的时候,需要先定义好接口的数据响应结果.如下是一个很简单直接的Controller实现方法及响应结果定义.@RestC
- 题目一链表题——链表合并根据给定的两个升序链表合并为一个新的升序链表具体题目如下解法/** * Definition for singly-
- 前面博客我们在讲解数组中,知道数组作为数据存储结构有一定的缺陷。在无序数组中,搜索性能差,在有序数组中,插入效率又很低,而且这两种数组的删除
- 在 Spring 中,有以下三种方式来创建数据源:通过 JNDI 获取应用服务器中的数据源;在 Spring 容器中配置数据源;通过代码来创
- 前言大家在初学java的时候,大部分的代码都是在控制台上运行的.可能大家辛辛苦苦写了几十行代码,最终就只是在控制台输出一个字符,这个时候,心
- 前言在使用Webview进行滑动操作时,从屏幕可见区域外向内滑动时,会出现webview区域闪烁的问题(反之也是),本文将提供一种解决方案。
- 一、分布式锁介绍分布式锁主要用于在分布式环境中保护跨进程、跨主机、跨网络的共享资源实现互斥访问,以达到保证数据的一致性。二、架构介绍&nbs
- 本文为大家分享了Android使用线程获取网络图片的具体代码,供大家参考,具体内容如下AndroidManifest.xml &n
- 前言Springboot应用在启动的时候分为两步:首先生成 SpringApplication 对象 ,运行 SpringApplicati
- 一、熔断器简介微服务架构特点就是多服务,多数据源,支撑系统应用。这样导致微服务之间存在依赖关系。如果其中一个服务故障,可能导致系统宕机,这就
- 一、代理是Java常用的设计模式,代理类通过调用被代理类的相关方法,并对相关方法进行增强。加入一些非业务性代码,比如事务、日志、报警发邮件等
- 1 什么是条件变量condition_variable是一个类,常和mutex搭配使用。condition_variable类是一个同步原语
- 本文实例为大家分享了C++实现企业职工工资管理系统的具体代码,供大家参考,具体内容如下课程设计目的和要求工资管理要和人事管理相联系,生成企业
- 还记得警匪片上,匪徒们是怎么配合实施犯罪的吗?一个团伙在进行盗窃的时候,总有一两个人在门口把风——如果有什么风吹草动,则会立即通知里面的同伙
- 1.创建项目修改依赖版本2.创建配置文件package com.huanmingjie.elasticsearch.config;impor