在说StackExchange.Redis 的时候说了,因为我们的项目一直.net4.0不升级,没有办法,我说的不算,哈哈,又查了StackExchange.Redis在.net4.0使用麻烦,所以选了NServiceKit.Redis。结构也不说了,直接上代码了。

ICache.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ClassLibrary2
{
public interface ICache
{
object Get(string key);
T GetT<T>(string key) where T : class;
object GetWithDelete(string key);
T GetWithDelete<T>(string key) where T : class;
bool Set(string key, object value);
bool Set(string key, object value, DateTime expireDate);
bool SetT<T>(string key, T value) where T : class;
bool SetT<T>(string key, T value, DateTime expire) where T : class;
bool Remove(string key);
}
}

Redis.cs

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using NServiceKit.Redis;
using NServiceKit.Redis.Support; namespace ClassLibrary2
{
public class Redis : ICache, IDisposable
{
/// <summary>
/// redis客户端连接池信息
/// </summary>
private PooledRedisClientManager prcm; public Redis()
{
CreateManager(); }
/// <summary>
/// 创建链接池管理对象
/// </summary>
private void CreateManager()
{
try
{
// ip1:端口1,ip2:端口2
var serverlist = ConfigurationManager.AppSettings["RedisServer"].Split(',');
prcm = new PooledRedisClientManager(serverlist, serverlist,
new RedisClientManagerConfig
{
MaxWritePoolSize = ,
MaxReadPoolSize = ,
AutoStart = true
});
// prcm.Start();
}
catch (Exception e)
{
#if DEBUG
throw;
#endif
}
}
/// <summary>
/// 客户端缓存操作对象
/// </summary>
public IRedisClient GetClient()
{
if (prcm == null)
CreateManager(); return prcm.GetClient();
}
/// <summary>
/// 删除
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public bool Remove(string key)
{
using (var client = prcm.GetClient())
{
return client.Remove(key);
}
}
/// <summary>
/// 获取
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public object Get(string key)
{
using (var client = prcm.GetClient())
{
var bytes = client.Get<byte[]>(key);
var obj = new ObjectSerializer().Deserialize(bytes);
return obj;
}
}
/// <summary>
/// 获取
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public T GetT<T>(string key) where T : class
{
//return Get(key) as T;
using (var client = prcm.GetClient())
{
return client.Get<T>(key);
}
}
/// <summary>
/// 获取到值到内存中,在删除
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public object GetWithDelete(string key)
{
var result = Get(key);
if (result != null)
Remove(key);
return result;
}
/// <summary>
/// 获取到值到内存中,在删除
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public T GetWithDelete<T>(string key) where T : class
{
var result = GetT<T>(key);
if (result != null)
Remove(key);
return result;
}
/// <summary>
/// 写
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public bool Set(string key, object value)
{
using (var client = prcm.GetClient())
{
if (client.ContainsKey(key))
{
return client.Set<byte[]>(key, new ObjectSerializer().Serialize(value));
}
else
{
return client.Add<byte[]>(key, new ObjectSerializer().Serialize(value));
}
} }
/// <summary>
/// 写
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="expireTime"></param>
/// <returns></returns>
public bool Set(string key, object value, DateTime expireTime)
{
using (var client = prcm.GetClient())
{
if (client.ContainsKey(key))
{
return client.Set<byte[]>(key, new ObjectSerializer().Serialize(value), expireTime);
}
else
{
return client.Add<byte[]>(key, new ObjectSerializer().Serialize(value), expireTime);
} }
}
/// <summary>
/// 写
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="expire"></param>
/// <returns></returns>
public bool SetT<T>(string key, T value, DateTime expire) where T : class
{
try
{
using (var client = prcm.GetClient())
{
return client.Set<T>(key, value, expire);
}
}
catch
{
return false;
}
}
/// <summary>
/// 写
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public bool SetT<T>(string key, T value) where T : class
{
try
{
using (var client = prcm.GetClient())
{
return client.Set<T>(key, value);
}
}
catch
{
return false;
}
} public void Dispose()
{
Close();
} public void Close()
{
var client = prcm.GetClient();
prcm.Dispose();
} }
}

Cache.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ClassLibrary2
{
public static class Cache
{
private static object cacheLocker = new object();//缓存锁对象
private static ICache cache = null;//缓存接口 static Cache()
{
Load();
} /// <summary>
/// 加载缓存
/// </summary>
/// <exception cref=""></exception>
private static void Load()
{
try
{
cache = new Redis();
}
catch (Exception ex)
{
//Log.Error(ex.Message);
}
} public static ICache GetCache()
{
return cache;
} /// <summary>
/// 获得指定键的缓存值
/// </summary>
/// <param name="key">缓存键</param>
/// <returns>缓存值</returns>
public static object Get(string key)
{
if (string.IsNullOrWhiteSpace(key))
return null;
return cache.Get(key);
} /// <summary>
/// 获得指定键的缓存值
/// </summary>
/// <param name="key">缓存键</param>
/// <returns>缓存值</returns>
public static T GetT<T>(string key) where T : class
{
return cache.GetT<T>(key);
} /// <summary>
/// 将指定键的对象添加到缓存中
/// </summary>
/// <param name="key">缓存键</param>
/// <param name="data">缓存值</param>
public static void Insert(string key, object data)
{
if (string.IsNullOrWhiteSpace(key) || data == null)
return;
//lock (cacheLocker)
{
cache.Set(key, data);
}
}
/// <summary>
/// 将指定键的对象添加到缓存中
/// </summary>
/// <param name="key">缓存键</param>
/// <param name="data">缓存值</param>
public static void InsertT<T>(string key, T data) where T : class
{
if (string.IsNullOrWhiteSpace(key) || data == null)
return;
//lock (cacheLocker)
{
cache.SetT<T>(key, data);
}
}
/// <summary>
/// 将指定键的对象添加到缓存中,并指定过期时间
/// </summary>
/// <param name="key">缓存键</param>
/// <param name="data">缓存值</param>
/// <param name="cacheTime">缓存过期时间(分钟)</param>
public static void Insert(string key, object data, int cacheTime)
{
if (!string.IsNullOrWhiteSpace(key) && data != null)
{
//lock (cacheLocker)
{
cache.Set(key, data, DateTime.Now.AddMinutes(cacheTime));
}
}
} /// <summary>
/// 将指定键的对象添加到缓存中,并指定过期时间
/// </summary>
/// <param name="key">缓存键</param>
/// <param name="data">缓存值</param>
/// <param name="cacheTime">缓存过期时间(分钟)</param>
public static void InsertT<T>(string key, T data, int cacheTime) where T : class
{
if (!string.IsNullOrWhiteSpace(key) && data != null)
{
//lock (cacheLocker)
{
cache.SetT<T>(key, data, DateTime.Now.AddMinutes(cacheTime));
}
}
} /// <summary>
/// 将指定键的对象添加到缓存中,并指定过期时间
/// </summary>
/// <param name="key">缓存键</param>
/// <param name="data">缓存值</param>
/// <param name="cacheTime">缓存过期时间</param>
public static void Insert(string key, object data, DateTime cacheTime)
{
if (!string.IsNullOrWhiteSpace(key) && data != null)
{
//lock (cacheLocker)
{
cache.Set(key, data, cacheTime);
}
}
} /// <summary>
/// 将指定键的对象添加到缓存中,并指定过期时间
/// </summary>
/// <param name="key">缓存键</param>
/// <param name="data">缓存值</param>
/// <param name="cacheTime">缓存过期时间</param>
public static void InsertT<T>(string key, T data, DateTime cacheTime) where T : class
{
if (!string.IsNullOrWhiteSpace(key) && data != null)
{
//lock (cacheLocker)
{
cache.SetT<T>(key, data, cacheTime);
}
}
} /// <summary>
/// 从缓存中移除指定键的缓存值
/// </summary>
/// <param name="key">缓存键</param>
public static void Remove(string key)
{
if (string.IsNullOrWhiteSpace(key))
return;
lock (cacheLocker)
{
cache.Remove(key);
}
}
}
}

下载代码

c#使用 NServiceKit.Redis 封装 RedisHelper的更多相关文章

  1. c#使用 StackExchange.Redis 封装 RedisHelper

    公司一直在用.net自带的缓存,大家都知道.net自带缓存的缺点,就不多说了,不知道的可以查一查,领导最近在说分布式缓存,我们选的是redis,领导让我不忙的时候封装一下,搜索了两天,选了选第三方的插 ...

  2. [C#] 使用 StackExchange.Redis 封装属于自己的 RedisHelper

    使用 StackExchange.Redis 封装属于自己的 RedisHelper 目录 核心类 ConnectionMultiplexer 字符串(String) 哈希(Hash) 列表(List ...

  3. [C#] 使用 StackExchange.Redis 封装属于自己的 Helper

    使用 StackExchange.Redis 封装属于自己的 Helper 目录 核心类 ConnectionMultiplexer 字符串(String) 哈希(Hash) 列表(List) 有序集 ...

  4. 使用 StackExchange.Redis 封装属于自己的 RedisHelper

    目录 核心类 ConnectionMultiplexer 字符串(String) 哈希(Hash) 列表(List) 有序集合(sorted set) Key 操作 发布订阅 其他 简介 目前 .NE ...

  5. StackExchange.Redis 封装

    博主最近开始玩Redis啊~~ 看了很多Redis的文章,感觉有点云里雾里的,之前看到是ServiceStack.Redis,看了一些大佬封装的Helper类,还是懵懵的QAQ 没办法啊只能硬着**上 ...

  6. 功能比较全的StackExchange.Redis封装帮助类(.Net/C#)

    Redis官网https://redis.io/ 以下内容未全部验证,如有问题请指出 //static NewtonsoftSerializer serializer = new Newtonsoft ...

  7. PHP 操作redis 封装的类 转的

    <?php/** * Redis 操作,支持 Master/Slave 的负载集群 * * @author jackluo */class RedisCluster{           // ...

  8. Redis封装之List

    /// <summary> /// Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销, /// Redis内部的很多实现,包括发 ...

  9. Redis封装之String

    RedisBase类 /// <summary> /// RedisBase类,是redis操作的基类,继承自IDisposable接口,主要用于释放内存 /// </summary ...

随机推荐

  1. ORK

    小试OKR一季度之后有感分享,你要不要试试ORK?   封面 OKR已经在国内热火朝天有一阵子了,为了适当的赶时髦,从年初开始团队内部小范围使用ORK模式以便测试团队会有什么化学反应.这篇文章打算写写 ...

  2. 洛谷 题解 P1133 【教主的花园】

    $n<=10^5 $ O(n)算法 状态 dp[i][j][k]表示在第i个位置,种j*10的高度的树,且这棵树是否比相邻两棵树高 转移 dp[i][1][0]=max(dp[i-1][2][1 ...

  3. Linux下文件搜索、查找、查看命令

    Linux下文件搜索.查找.查看命令 1.最强大的搜索命令:find 查找各种文件的命令 2.在文件资料中查找文件:locate 3.搜索命令所在的目录及别名信息:which 4.搜索命令所在的目录及 ...

  4. HTTP报文学习

    HTTP报文用于HTTP协议的信息交互,分为请求报文和响应报文.报文由首部和主体两部分组成,中间使用空行(CR+LF)分隔 1. 报文结构 报文由首部.空行和实体组成: 报文中首先是请求行或者状态行, ...

  5. C++中如何设计一个类只能在堆或者栈上创建对象,面试题

    设计一个类,该类只能在堆上创建对象 将类的构造函数私有,拷贝构造声明成私有.防止别人调用拷贝在栈上生成对象. 提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建 注意 在堆和栈上创建对象都会调 ...

  6. LC 94. Binary Tree Inorder Traversal

    问题描述 Given a binary tree, return the inorder traversal of its nodes' values. (左 - 根 - 右) Example: In ...

  7. lxml and 代理ip

    pip install lxml 导包From lxml import etree 1. 注意这个是本地html就直接使用etree.parse即可 2. html_etree=etree.parse ...

  8. python学习-7 条件语句 while循环 + 练习题

    1.死循环 while 1 == 1: print('ok') 结果是一直循环 2.循环 count = 0 while count < 10: print(count) count = cou ...

  9. PB各对象常用事件

    1.window中的事件 事件名                  触发的时机 01.Activate            在窗口激活之前触发 02.Clicked             当用户用 ...

  10. DeepMind提出新型超参数最优化方法:性能超越手动调参和贝叶斯优化

    DeepMind提出新型超参数最优化方法:性能超越手动调参和贝叶斯优化 2017年11月29日 06:40:37 机器之心V 阅读数 2183   版权声明:本文为博主原创文章,遵循CC 4.0 BY ...