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(有序集合). ...
随机推荐
- echarts使用与踩坑
0.踩坑点 1.当图表不显示在页面(display:none)执行resize可能会导致图表样式混乱 1. 官网示例 import * as echarts from 'echarts'; // 基于 ...
- 基于 Flutter 的 Web 渲染引擎「北海」正式开源!
简介: 阿里巴巴历时 3 年自研开发的 Web 渲染引擎北海(英文名:Kraken)正式开源,致力打造易扩展,跨平台,高性能的渲染引擎,并已在优酷.大麦.天猫等业务场景中使用. 作者 | 染陌来源 | ...
- WPF 设置 IncludePackageReferencesDuringMarkupCompilation 属性导致分析器不工作
本文记录在 WPF 项目里面设置 IncludePackageReferencesDuringMarkupCompilation 属性为 False 导致了项目所安装的分析器不能符合预期工作 设置 I ...
- 2018-8-10-WPF-如何画出1像素的线
title author date CreateTime categories WPF 如何画出1像素的线 lindexi 2018-08-10 19:16:53 +0800 2018-2-13 17 ...
- 2019-8-31-NuGet-如何设置图标
title author date CreateTime categories NuGet 如何设置图标 lindexi 2019-08-31 16:55:58 +0800 2019-4-27 17: ...
- SAP Adobe Form 教程六 FormCalc和JavaScript的实践
前文: SAP Adobe Form 教程一 简单示例 SAP Adobe Form 教程二 表 SAP Adobe Form 教程三 日期,时间,floating field SAP Adobe F ...
- 错误记录——mysql5.7连接失败,服务无法启动
起因: 上周安装完mysql后,成功新建了数据库,一切都是正常的,于是就先搁置一旁.今天周一过来,却突然发现无法连接mysql了. 过程: 第一反应是服务没有启动,毕竟重启了电脑,说不定是服务没有自动 ...
- homebrew的安装和使用
目录 背景 安装xcode 安装homebrew 有关报错解决 卸载脚本 homebrew软件搜索 brew 常用命令 brew redis安装 PhpWebStudy安装 安装php 背景 最近用b ...
- shell 去掉逗号_shell替换和去掉换行符
用shell处理文件的时候我们常常需要去掉或者加上换行符,name问题就来了怎么才能快速的替换呢? 我们有这样一个文件[root@hxy working]# cat 1 GD200A16C013493 ...
- linux基础命令及bash shell特性
linux基础命令及bash shell特性 目录 linux基础命令及bash shell特性 1.linux基础命令 1.1 查看内核版本和linux发行版本 1.2 查看服务器硬件信息 1.3 ...