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(有序集合). ...
随机推荐
- docker搭建kafka集群实践
前言 本文主要介绍了如何通过docker搭建一个可以用于生产环境的kafka集群. kafka集群使用了3个节点,依赖zookeeper进行协调,所以会同时搭建一套3节点的zookeeper集群. 准 ...
- js中this对象的理解
一.定义 函数的 this 关键字在 JavaScript 中的表现略有不同,此外,在严格模式和非严格模式之间也会有一些差别 在绝大多数情况下,函数的调用方式决定了 this 的值(运行时绑定) th ...
- 力扣191(java)-位1的个数(简单)
题目: 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量). 提示: 请注意,在某些语言(如 Java)中,没有无符号整数类型. ...
- 阿里云AHAS Chaos:应用及业务高可用提升工具平台之故障演练
简介: 阿里云AHAS Chaos:应用及业务高可用提升工具平台之故障演练 应用高可用服务AHAS及故障演练AHAS Chaos 应用高可用服务(Application High Availabili ...
- 一种命令行解析的新思路(Go 语言描述)
简介: 本文通过打破大家对命令行的固有印象,对命令行的概念解构后重新梳理,开发出一种功能强大但使用极为简单的命令行解析方法.这种方法支持任意多的子命令,支持可选和必选参数,对可选参数可提供默认值,支 ...
- [FE] iframe 相关选项 x-frame-options: 设置 meta 标签无效 & helmet
The X-Frame-Options HTTP 响应头是用来给浏览器 指示允许一个页面 可否在 <frame>, <iframe>, <embed> 或者 < ...
- dotnet C# 推荐一个适合新手入门阅读学习的控制台游戏项目
对于 C# 编程新手,学习语法和框架是必要的,但是如何将它们灵活地运用到实际项目中,是一个更高层次的挑战.如果只是死记硬背语法规则和框架用法,而没有足够的编程实践,很难提高编程水平和逻辑思维.这个时候 ...
- C# dotnet 的锁 SemaphoreSlim 和队列
本文主要是试验在顺序进入等待 SemaphoreSlim 的任务是否会按照顺序经过锁执行 我在一个有趣的WPF程序里面,需要限制任务同时执行的线程数量,不然用户就会说用我的程序会让电脑卡渣.而我的任务 ...
- 从零开始写 Docker(十二)---实现 mydocker stop 停止容器
本文为从零开始写 Docker 系列第十二篇,实现类似 docker stop 的功能,使得我们能够停止指定容器. 完整代码见:https://github.com/lixd/mydocker 欢迎 ...
- ESP32 多线程入门实验
一.线程创建函数 函数 void xTaskCreate ( pdTASK_CODE pvTaskCode, const portCHAR * const pcNane, unsigned portS ...