代码如下(示例):
using Newtonsoft.Json;
using ServiceStack.Redis;
using ServiceStack.Redis.Generic;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
namespace utils
{
public class RedisHelper : IDisposable
{
public static string RedisServer = System.Configuration.ConfigurationManager.AppSettings["RedisServer"];
public static string RedisPwd = System.Configuration.ConfigurationManager.AppSettings["RedisPwd"];
public static int RedisPort = int.Parse(System.Configuration.ConfigurationManager.AppSettings["RedisPort"]);
public RedisClient Redis = new RedisClient(RedisServer, RedisPort, RedisPwd);
//缓存池
private PooledRedisClientManager prcm = new PooledRedisClientManager();
//默认缓存过期时间单位秒
public int secondsTimeOut = 30 * 60;//默认30分钟
//public int secondsTimeOut = -1;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="OpenPooledRedis">是否开启缓冲池</param>
public RedisHelper(bool OpenPooledRedis = false)
{
if (OpenPooledRedis)
{
prcm = CreateManager(new[] { "" + RedisPwd + "@" + RedisServer + ":" + RedisPort + "" }, new[] { "" + RedisPwd + "@" + RedisServer + ":" + RedisPort + "" });
Redis = prcm.GetClient() as RedisClient;
}
}
/// <summary>
/// 消息生成者(添加队列消息)
/// </summary>
/// <param name="listId"></param>
/// <param name="valuestr"></param>
public void EnqueueItemOnList(string listId, string valuestr)
{
Redis.EnqueueItemOnList(listId, valuestr);
}
/// <summary>
/// 消费者(读取队列消息)
/// </summary>
/// <param name="listId"></param>
/// <returns></returns>
public string DequeueItemFromList(string listId)
{
//阻塞模式读取
//string value = Redis.BlockingDequeueItemFromList(listId, new TimeSpan(1));
///非阻塞模式读取
string value = Redis.DequeueItemFromList(listId);
return value;
}
#region Key/Value存储
/// <summary>
/// 判断键 是否存在
/// </summary>
/// <param name="listId"></param>
/// <returns></returns>
public bool Exists(string listId)
{
var returnval = false;
var exist = Redis.Exists(listId);
if (exist == 1)
{
returnval = true;
}
return returnval;
}
/// <summary>
/// 设置缓存
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key">缓存建</param>
/// <param name="t">缓存值</param>
/// <param name="timeout">过期时间,单位秒,-1:不过期,0:默认过期时间</param>
/// <returns></returns>
//public bool Set<T>(string key, T t, int timeout = 0)
//{
// if (timeout >= 0)
// {
// if (timeout > 0)
// {
// secondsTimeOut = timeout;
// }
// Redis.Expire(key, secondsTimeOut);
// }
// return Redis.Add(key, t);
//}
public bool Set<T>(string key, T t, int timeout = 0)
{
bool res = false;
if (Redis.Exists(key) == 1)
{
res = Redis.Set(key, t);
}
else
{
res = Redis.Add(key, t);
}
if (timeout >= 0)
{
if (timeout > 0)
{
secondsTimeOut = timeout;
}
Redis.Expire(key, secondsTimeOut);
}
return res;
}
/// <summary>
/// 判断key 是否存在
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public bool IsExists(string key)
{
return Redis.Exists(key) == 1;
}
public long Getexptimes(string key)
{
long getexptime = Redis.PTtl("key");
return getexptime;
}
/// <summary>
/// 获取
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public T Get<T>(string key)
{
return Redis.Get<T>(key);
}
/// <summary>
/// 获取
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public string Get(string key)
{
byte[] byte_val = Redis.Get(key);
string val = System.Text.Encoding.Default.GetString(byte_val);
return val;
}
public bool Set(string key, string val, int timeout = 0)
{
bool res = false;
if (Redis.Exists(key) == 1)
{
res = Redis.Set(key, val);
}
else
{
res = Redis.Add(key, val);
}
if (timeout >= 0)
{
if (timeout > 0)
{
secondsTimeOut = timeout;
}
Redis.Expire(key, secondsTimeOut);
}
return res;
}
/// <summary>
/// 删除
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public bool Remove(string key)
{
return Redis.Remove(key);
}
/// <summary>
/// 删除指定目录下的key
/// </summary>
/// <param name="pattern"></param>
public void RemoveByPattern(string pattern)
{
byte[][] list = Redis.Keys(pattern);
List<string> tempList = new List<string>();
foreach (var item in list)
{
tempList.Add(item.GetValue(0).ToString());
}
if (tempList.Count > 0)
{
Redis.Del(tempList.ToArray());
}
}
public bool Add<T>(string key, T t, int timeout)
{
var res=Redis.Add(key, t);
if (timeout > 0&&res)
{
secondsTimeOut = timeout;
Redis.Expire(key, secondsTimeOut);
}
//var sss= Redis.PExpire(key, secondsTimeOut);
return res;
}
public bool Expires(string key, int secondsTimeOut)
{
return Redis.Expire(key, secondsTimeOut);
}
public bool Add<T>(string key, T t, TimeSpan timeout)
{
//if (timeout >= 0)
//{
// if (timeout > 0)
// {
// secondsTimeOut = timeout;
// }
// Redis.Expire(key, secondsTimeOut);
//}
return Redis.Add(key, t, timeout);
}
#endregion
#region 重命名
public void RenameKey(string fromName, string toName)
{
Redis.RenameKey(fromName, toName);
}
#endregion
#region 链表操作
/// <summary>
/// 添加单个实体到队列
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="listId"></param>
/// <param name="Item"></param>
/// <param name="timeout"></param>
public void AddEntityToEnqueue<T>(string listId, T Item, int timeout = -1)
{
AddEntityToList<T>(listId, Item, timeout);
//IRedisTypedClient<T> iredisClient = Redis.As<T>();
//if (timeout >= 0)
//{
// if (timeout > 0)
// {
// secondsTimeOut = timeout;
// }
// Redis.Expire(listId, secondsTimeOut);
//}
//IRedisList<T> redisList = iredisClient.Lists[listId];
iredisClient.EnqueueItemOnList(redisList, Item);
//redisList.Enqueue(Item);
//iredisClient.Save();
}
public void AddEntityToEnqueues<T>(string listId, T Item, int timeout = -1)
{
IRedisTypedClient<T> iredisClient = Redis.As<T>();
if (timeout >= 0)
{
if (timeout > 0)
{
secondsTimeOut = timeout;
}
Redis.Expire(listId, secondsTimeOut);
}
IRedisList<T> redisList = iredisClient.Lists[listId];
//iredisClient.EnqueueItemOnList(redisList, Item);
redisList.Enqueue(Item);
iredisClient.Save();
}
/// <summary>
/// 从队列中取出
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="listId"></param>
/// <param name="Item"></param>
/// <param name="timeout"></param>
public T GetEntityFromDequeue<T>(string listId, Func<T, object> orderByLambada = null, Func<T, object> ThenByLambada = null, Func<T, object> WhereByLambada = null)
{
IRedisTypedClient<T> iredisClient = Redis.As<T>();
IRedisList<T> redisList = iredisClient.Lists[listId];
if (orderByLambada != null)
{
return redisList.OrderBy(orderByLambada).ThenBy(ThenByLambada).First();
//return redisList.First();
}
/*return redisList.Dequeue();*/
return redisList.BlockingDequeue(null);//阻塞出列
}
public List<T> GetEntityFromDequeueList<T>(string listId, Func<T, object> orderByLambada = null, Func<T, object> ThenByLambada = null)
{
IRedisTypedClient<T> iredisClient = Redis.As<T>();
IRedisList<T> redisList = iredisClient.Lists[listId];
if (orderByLambada != null)
{
return redisList.OrderBy(orderByLambada).ThenBy(ThenByLambada).ToList();
//return redisList.First();
}
return null;//阻塞出列
}
/// <summary>
/// 根据IEnumerable数据添加链表
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="listId"></param>
/// <param name="values"></param>
/// <param name="timeout"></param>
public void AddList<T>(string listId, IEnumerable<T> values, int timeout = 0)
{
// Redis.Expire(listId, 60);
IRedisTypedClient<T> iredisClient = Redis.As<T>();
if (timeout >= 0)
{
if (timeout > 0)
{
secondsTimeOut = timeout;
}
Redis.Expire(listId, secondsTimeOut);
}
IRedisList<T> redisList = iredisClient.Lists[listId];
redisList.AddRange(values);
iredisClient.Save();
}
/// <summary>
/// 添加单个实体到链表中
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="listId"></param>
/// <param name="Item"></param>
/// <param name="timeout"></param>
public void AddEntityToList<T>(string listId, T Item, int timeout = 0)
{
IRedisTypedClient<T> iredisClient = Redis.As<T>();
if (timeout >= 0)
{
if (timeout > 0)
{
secondsTimeOut = timeout;
}
Redis.Expire(listId, secondsTimeOut);
}
IRedisList<T> redisList = iredisClient.Lists[listId];
redisList.Add(Item);
iredisClient.Save();
}
/// <summary>
/// 获取链表
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="listId"></param>
/// <returns></returns>
public IEnumerable<T> GetList<T>(string listId)
{
IRedisTypedClient<T> iredisClient = Redis.As<T>();
return iredisClient.Lists[listId];
}
public IEnumerable<T> GetList<T>(string listId, int pageIndex, int pageSize)
{
IRedisTypedClient<T> iredisClient = Redis.As<T>();
return iredisClient.GetRangeFromList(iredisClient.Lists[listId], (pageIndex - 1) * pageSize, (pageIndex - 1) * pageSize + pageSize - 1);
//return iredisClient.Lists[listId].Skip((pageIndex - 1) * pageSize).Take(pageSize);
}
public IEnumerable<T> GetAllItemsFromList<T>(string listId)
{
IRedisTypedClient<T> iredisClient = Redis.As<T>();
return iredisClient.GetAllItemsFromList(iredisClient.Lists[listId]);
//return iredisClient.Lists[listId].Skip((pageIndex - 1) * pageSize).Take(pageSize);
}
/// <summary>
/// 根据lambada表达式获取链表
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="listId"></param>
/// <param name="func"></param>
public IEnumerable<T> GetListByLambada<T>(string listId, Func<T, bool> func)
{
IRedisTypedClient<T> iredisClient = Redis.As<T>();
IRedisList<T> redisList = iredisClient.Lists[listId];
return redisList.Where(func).ToList();
}
/// <summary>
/// 根据lambada表达式获取链表中一条记录
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="listId"></param>
/// <param name="func"></param>
public T GetTByLambada<T>(string listId, Func<T, object> orderByLambada, Func<T, bool> func)
{
IRedisTypedClient<T> iredisClient = Redis.As<T>();
IRedisList<T> redisList = iredisClient.Lists[listId];
return redisList.Where(func).OrderByDescending(orderByLambada).First();
}
public T GetTByLambada<T>(string listId, Func<T, bool> func)
{
IRedisTypedClient<T> iredisClient = Redis.As<T>();
IRedisList<T> redisList = iredisClient.Lists[listId];
return redisList.Where(func).First();
}
/// <summary>
/// 根据条件获取记录总数
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="listId"></param>
/// <param name="func"></param>
/// <returns></returns>
public int GetCountByLambada<T>(string listId, Func<T, bool> func)
{
IRedisTypedClient<T> iredisClient = Redis.As<T>();
IRedisList<T> redisList = iredisClient.Lists[listId];
return redisList.Where(func).Count();
}
public int GetCount<T>(string listId)
{
IRedisTypedClient<T> iredisClient = Redis.As<T>();
IRedisList<T> redisList = iredisClient.Lists[listId];
return redisList.Count();
}
public List<T> GetLists<T>(string listId)
{
IRedisTypedClient<T> iredisClient = Redis.As<T>();
IRedisList<T> redisList = iredisClient.Lists[listId];
return redisList.ToList();
}
/// <summary>
/// 在链表中删除单个实体
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="listId"></param>
/// <param name="t"></param>
public void RemoveEntityFromList<T>(string listId, T t)
{
IRedisTypedClient<T> iredisClient = Redis.As<T>();
IRedisList<T> redisList = iredisClient.Lists[listId];
redisList.RemoveValue(t);
iredisClient.Save();
}
public bool RemoveEntityFromLists<T>(string listId, T t)
{
IRedisTypedClient<T> iredisClient = Redis.As<T>();
IRedisList<T> redisList = iredisClient.Lists[listId];
//return iredisClient.Sets[listId].Remove(t);
return iredisClient.RemoveItemFromList(redisList, t) > 0;
}
/// <summary>
/// 根据lambada表达式删除符合条件的实体
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="listId"></param>
/// <param name="func"></param>
public void RemoveEntityFromList<T>(string listId, Func<T, bool> func)
{
IRedisTypedClient<T> iredisClient = Redis.As<T>();
IRedisList<T> redisList = iredisClient.Lists[listId];
T value = redisList.Where(func).FirstOrDefault();
long count = redisList.RemoveValue(value);
//redisList.Remove(value);
iredisClient.Save();
}
#endregion
#region 清空Redis所有数据库中的所有key
public void Flushall()
{
Redis.FlushAll();
}
#endregion
//释放资源
public void Dispose()
{
if (Redis != null)
{
Redis.Dispose();
Redis = null;
}
GC.Collect();
}
/// <summary>
/// 缓冲池
/// </summary>
/// <param name="readWriteHosts"></param>
/// <param name="readOnlyHosts"></param>
/// <returns></returns>
public static PooledRedisClientManager CreateManager(
string[] readWriteHosts, string[] readOnlyHosts)
{
return new PooledRedisClientManager(readWriteHosts, readOnlyHosts,
new RedisClientManagerConfig
{
MaxWritePoolSize = readWriteHosts.Length * 5,
MaxReadPoolSize = readOnlyHosts.Length * 5,
AutoStart = true,
});
// { RedisClientFactory = (IRedisClientFactory)RedisCacheClientFactory.Instance.CreateRedisClient("127.0.0.1", 6379) };
}
}
}