using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using ServiceStack.Redis;
|
using ServiceStack.Text;
|
using ServiceStack.Redis.Generic;
|
using System.Configuration;
|
using StackExchange.Redis;
|
using Newtonsoft.Json;
|
|
namespace VueWebApi.Tools
|
{
|
public class RedisHelper
|
{
|
/// <summary>
|
/// redis获取连接配置字符串
|
/// </summary>
|
private static readonly string RedisIpConnString = ConfigurationManager.AppSettings["RedisConnIp"];
|
private static readonly string RedisPortConnString = ConfigurationManager.AppSettings["RedisConnPort"];
|
private static readonly string RedisKeyTimeCont = ConfigurationManager.AppSettings["RedisKeyTimeCont"];
|
|
|
private static RedisClient Redis = new RedisClient(RedisIpConnString,Convert.ToInt32(RedisPortConnString));
|
//缓存池
|
static PooledRedisClientManager prcm = new PooledRedisClientManager();
|
|
|
//默认缓存过期时间单位秒
|
public int secondsTimeOut =Convert.ToInt32(RedisKeyTimeCont);
|
private static readonly Dictionary<int, PooledRedisClientManager> pools = new Dictionary<int, PooledRedisClientManager>();
|
/// <summary>
|
/// 缓冲池
|
/// </summary>
|
/// <param name="readWriteHosts"></param>
|
/// <param name="readOnlyHosts"></param>
|
/// <returns></returns>
|
private static void CreateManager(string[] readWriteHosts, string[] readOnlyHosts)
|
{
|
for (int i = 0; i <= 15; i++)
|
{
|
PooledRedisClientManager prc = new PooledRedisClientManager(readWriteHosts, readOnlyHosts,
|
new RedisClientManagerConfig
|
{
|
MaxWritePoolSize = readWriteHosts.Length * 5,
|
MaxReadPoolSize = readOnlyHosts.Length * 5,
|
AutoStart = true,
|
}, i, 200, 10);// { RedisClientFactory = (IRedisClientFactory)RedisCacheClientFactory.Instance.CreateRedisClient("127.0.0.1", 6379) };
|
pools.Add(i, prc);
|
}
|
}
|
public static PooledRedisClientManager ChooseRedisInstance(int database)
|
{
|
if (database > 16) return pools[0];
|
return pools[database];
|
}
|
/// <summary>
|
/// 构造函数
|
/// </summary>
|
/// <param name="openPooledRedis">是否开启缓冲池</param>
|
static RedisHelper()
|
{
|
//CreateManager(new string[] { "127.0.0.1:6379" }, new string[] { "127.0.0.1:6379" });
|
CreateManager(new string[] { RedisIpConnString+":"+RedisPortConnString }, new string[] { RedisIpConnString + ":" + RedisPortConnString });
|
//Redis = prcm.GetClient() as RedisClient;
|
}
|
|
#region Key/Value存储
|
/// <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, int db = 0)
|
{
|
Redis = (RedisClient)ChooseRedisInstance(db).GetClient();
|
var values=Redis.Add<T>(key, t);
|
if (timeout >= 0)
|
{
|
if (timeout > 0)
|
{
|
secondsTimeOut = timeout;
|
}
|
Redis.Expire(key, secondsTimeOut);
|
}
|
Redis.Dispose();
|
return values;
|
}
|
|
/// <summary>
|
/// 设置失效时间
|
/// </summary>
|
/// <param name="key"></param>
|
/// <param name="expiry"></param>
|
/// <returns></returns>
|
public bool KeyExpire(string key, int expiry)
|
{
|
return Redis.Expire(key, expiry);
|
}
|
/// <summary>
|
/// 获取
|
/// </summary>
|
/// <typeparam name="T"></typeparam>
|
/// <param name="key"></param>
|
/// <returns></returns>
|
public T Get<T>(string key, int db = 0)
|
{
|
Redis = (RedisClient)ChooseRedisInstance(db).GetClient();
|
var values = Redis.Get<T>(key);
|
Redis.Dispose();
|
return values;
|
}
|
/// <summary>
|
/// 删除
|
/// </summary>
|
/// <param name="key"></param>
|
/// <returns></returns>
|
public bool Remove(string key, int db = 0)
|
{
|
Redis = (RedisClient)ChooseRedisInstance(db).GetClient();
|
Redis.Dispose();
|
return Redis.Remove(key);
|
}
|
|
|
//public static bool Add<T>(string key, T t, int timeout)
|
//{
|
// var values = Redis.Add<T>(key, t);
|
// if (timeout >= 0)
|
// {
|
// if (timeout > 0)
|
// {
|
// secondsTimeOut = timeout;
|
// }
|
// Redis.Expire(key, secondsTimeOut);
|
// }
|
// return values;
|
//}
|
#endregion
|
|
|
#region 链表操作
|
/// <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);
|
}
|
var redisList = iredisClient.Lists[listId];
|
redisList.AddRange(values);
|
iredisClient.Save();
|
Redis.Dispose();
|
}
|
/// <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, int db = 0)
|
{
|
Redis = (RedisClient)ChooseRedisInstance(db).GetClient();
|
IRedisTypedClient<T> iredisClient = Redis.As<T>();
|
if (timeout >= 0)
|
{
|
if (timeout > 0)
|
{
|
secondsTimeOut = timeout;
|
}
|
Redis.Expire(listId, secondsTimeOut);
|
}
|
var redisList = iredisClient.Lists[listId];
|
redisList.Add(Item);
|
iredisClient.Save();
|
Redis.Dispose();
|
}
|
/// <summary>
|
/// 获取链表
|
/// </summary>
|
/// <typeparam name="T"></typeparam>
|
/// <param name="listId"></param>
|
/// <returns></returns>
|
public IEnumerable<T> GetList<T>(string listId, int db = 0)
|
{
|
Redis = (RedisClient)ChooseRedisInstance(db).GetClient();
|
IRedisTypedClient<T> iredisClient = Redis.As<T>();
|
Redis.Dispose();
|
return iredisClient.Lists[listId];
|
}
|
/// <summary>
|
/// 在链表中删除单个实体
|
/// </summary>
|
/// <typeparam name="T"></typeparam>
|
/// <param name="listId"></param>
|
/// <param name="t"></param>
|
public void RemoveEntityFromList<T>(string listId, T t, int db = 0)
|
{
|
Redis = (RedisClient)ChooseRedisInstance(db).GetClient();
|
IRedisTypedClient<T> iredisClient = Redis.As<T>();
|
var redisList = iredisClient.Lists[listId];
|
redisList.RemoveValue(t);
|
iredisClient.Save();
|
Redis.Dispose();
|
}
|
/// <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)
|
{
|
//using (IRedisTypedClient<T> iredisClient = Redis.As<T>())
|
//{
|
// var redisList = iredisClient.Lists[listId];
|
// T value = redisList.Where(func).FirstOrDefault();
|
// redisList.RemoveValue(value);
|
// iredisClient.Save();
|
//}
|
|
|
// 使用using 报错:
|
// using 语句中使用的类型必须可隐式转换为“System.IDisposable”
|
// using会自动调用System.IDisposable下的Dispose方法来释放非托管资源,
|
// IRedisTypedClient没有继承System.IDisposable的接口,所以不能用
|
IRedisTypedClient<T> iredisClient = Redis.As<T>();
|
var redisList = iredisClient.Lists[listId];
|
T value = redisList.Where(func).FirstOrDefault();
|
redisList.RemoveValue(value);
|
iredisClient.Save();
|
Redis.Dispose();
|
|
}
|
public void test()
|
{
|
string s1 = Redis.GetClient();
|
List<Dictionary<string, string>> s2 = Redis.GetClientsInfo();
|
List<string> s3 = Redis.GetAllKeys();
|
string s4 = Redis.GetHostString();
|
long s5 = Redis.Db;
|
}
|
#endregion
|
//释放资源
|
public void Dispose()
|
{
|
if (Redis != null)
|
{
|
Redis.Dispose();
|
Redis = null;
|
}
|
GC.Collect();
|
}
|
}
|
}
|