c# Redis缓存的使用和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)
结语:
这里提供了helper类,主要是为了封装缓存,使用起来更加方便。具体可以在其基础上进行扩展。
c# Redis缓存的使用和helper类;的更多相关文章
- SpringBoot使用@Cacheable实现最简单的Redis缓存
前言 之前我们使用过RedisTemplate来实现redis缓存,然后使用工具类来实现操作redis的存储.这样的方式好处是很自由,但是还不是最简单的处理方式.对于一些简单的应用来说,其实redis ...
- 封装php redis缓存操作类
封装php redis缓存操作类,集成了连接redis并判断连接是否成功,redis数据库选择,检测redis键是否存在,获取值,写入值,设置生存时间和删除清空操作. php redis类代码: &l ...
- 商品类目和商品大广告的Redis缓存
(dubbo)主要的实现类: 商品类目的Redis缓存 com.bjsxt.ego.portal.service.impl.PortalItemCatServiceImpl package com.b ...
- Redis 缓存失效和回收机制续
二.Redis Key失效机制 Redis的Key失效机制,主要借助借助EXPIRE命令: EXPIRE key 30 上面的命令即为key设置30秒的过期时间,超过这个时间,我们应该就访问不到这个值 ...
- 缓存工厂之Redis缓存
这几天没有按照计划分享技术博文,主要是去医院了,这里一想到在医院经历的种种,我真的有话要说:医院里的医务人员曾经被吹捧为美丽+和蔼+可亲的天使,在经受5天左右相互接触后不得不让感慨:遇见的有些人员在挂 ...
- Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager
Redis缓存服务器是一款key/value数据库,读110000次/s,写81000次/s,因为是内存操作所以速度飞快,常见用法是存用户token.短信验证码等 官网显示Redis本身并没有Wind ...
- ssm+redis 如何更简洁的利用自定义注解+AOP实现redis缓存
基于 ssm + maven + redis 使用自定义注解 利用aop基于AspectJ方式 实现redis缓存 如何能更简洁的利用aop实现redis缓存,话不多说,上demo 需求: 数据查询时 ...
- spring aop搭建redis缓存
SpringAOP与Redis搭建缓存 近期项目查询数据库太慢,持久层也没有开启二级缓存,现希望采用Redis作为缓存.为了不改写原来代码,在此采用AOP+Redis实现. 目前由于项目需要,只需要做 ...
- Django1.9开发博客(13)- redis缓存
Redis 是一个高性能的key-value数据库.redis的出现, 很大程度补偿了memcached这类keyvalue存储的不足,在部分场合可以对关系数据库起到很好的补充作用. 它提供了Pyth ...
- Windows环境下使用Redis缓存工具的图文详细方法
一.简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有序集合). ...
随机推荐
- 房屋设计H51图纸
- easyx的使用 鼠标交互(3.1)
本文学习于B站,进行借鉴学习记录: 视频链接:鼠标操作(新版)_哔哩哔哩_bilibili 初始化调用文件头不再使用#include<graphics.h>,选择调用#include< ...
- Power Outage
由于Covid-19的原因一直是work from home, 在几天前家里的电表有问题需要人来维修,在这期间会停电大概半小时操作,虽然是wfh,但是还是要保障工作的正常进行,保守估计可以顺利渡过. ...
- 力扣238(java)-除自身以外数组的乘积(中等)
题目: 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 . 题目数据 保证 数组 nums之中任意元素的全 ...
- ECharts海量数据渲染解决卡顿的4种方式
场景 周五进行需求评审的时候: 出现了一个图表,本身一个图表本没有什么稀奇的: 可是产品经理在图表的上的备注,让我觉得这个事情并不简单: 那个图表的时间跨度可以是月,年,而且时间间隔很短: 这让我意识 ...
- 龙蜥开源Plugsched:首次实现 Linux kernel 调度器热升级 | 龙蜥技术
简介:对于plugsched而言,无论是 bugfix,还是性能优化,甚至是特性的增.删.改,都可胜任. 文/龙蜥社区内核开发人员 陈善佩.吴一昊.邓二伟 Plugsched 是 Linux 内 ...
- 兑现 Service Mesh 的新价值:精确控制“爆炸半径”
简介:本文分享了阿里云内部所沉淀的全链路流量打标与路由的能力,做出服务网格技术新体验的同时,很好地兑现了服务网格的新价值. 作者:至简 软件是以持续迭代的方式去不断演进的.某种程度上,我们并不担心软 ...
- [GPT] Linux 如何查看 crontab 的运行记录
要查看crontab的运行记录,可以使用以下命令: $ grep CRON /var/log/syslog 或者 $ tail /var/log/syslog 这将在 /var/log/syslo ...
- 从右边开始寻找整数的第k位
从右边开始寻找整数的第k位 Implement match_k, which takes in an integer k and returns a function that takes in a ...
- dotnet C# 如何正确获取藏文的字数
在咱国内有很多有趣的文字,其中藏文属于有趣的文字里面特别有趣的一项,特别是对于做文本库的同学,大概都知道什么叫合写字吧.合写字的含义就是多个字符一起组成一个字.但是多个字符在内存中,本身就是多个字符对 ...