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
{
///
/// redis获取连接配置字符串
///
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 pools = new Dictionary();
///
/// 缓冲池
///
///
///
///
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];
}
///
/// 构造函数
///
/// 是否开启缓冲池
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存储
///
/// 设置缓存
///
///
/// 缓存建
/// 缓存值
/// 过期时间,单位秒,-1:不过期,0:默认过期时间
///
public bool Set(string key, T t, int timeout = 0, int db = 0)
{
Redis = (RedisClient)ChooseRedisInstance(db).GetClient();
var values=Redis.Add(key, t);
if (timeout >= 0)
{
if (timeout > 0)
{
secondsTimeOut = timeout;
}
Redis.Expire(key, secondsTimeOut);
}
Redis.Dispose();
return values;
}
///
/// 设置失效时间
///
///
///
///
public bool KeyExpire(string key, int expiry)
{
return Redis.Expire(key, expiry);
}
///
/// 获取
///
///
///
///
public T Get(string key, int db = 0)
{
Redis = (RedisClient)ChooseRedisInstance(db).GetClient();
var values = Redis.Get(key);
Redis.Dispose();
return values;
}
///
/// 删除
///
///
///
public bool Remove(string key, int db = 0)
{
Redis = (RedisClient)ChooseRedisInstance(db).GetClient();
Redis.Dispose();
return Redis.Remove(key);
}
//public static bool Add(string key, T t, int timeout)
//{
// var values = Redis.Add(key, t);
// if (timeout >= 0)
// {
// if (timeout > 0)
// {
// secondsTimeOut = timeout;
// }
// Redis.Expire(key, secondsTimeOut);
// }
// return values;
//}
#endregion
#region 链表操作
///
/// 根据IEnumerable数据添加链表
///
///
///
///
///
public void AddList(string listId, IEnumerable values, int timeout = 0)
{
Redis.Expire(listId, 60);
IRedisTypedClient iredisClient = Redis.As();
if (timeout >= 0)
{
if (timeout > 0)
{
secondsTimeOut = timeout;
}
Redis.Expire(listId, secondsTimeOut);
}
var redisList = iredisClient.Lists[listId];
redisList.AddRange(values);
iredisClient.Save();
Redis.Dispose();
}
///
/// 添加单个实体到链表中
///
///
///
///
///
public void AddEntityToList(string listId, T Item, int timeout = 0, int db = 0)
{
Redis = (RedisClient)ChooseRedisInstance(db).GetClient();
IRedisTypedClient iredisClient = Redis.As();
if (timeout >= 0)
{
if (timeout > 0)
{
secondsTimeOut = timeout;
}
Redis.Expire(listId, secondsTimeOut);
}
var redisList = iredisClient.Lists[listId];
redisList.Add(Item);
iredisClient.Save();
Redis.Dispose();
}
///
/// 获取链表
///
///
///
///
public IEnumerable GetList(string listId, int db = 0)
{
Redis = (RedisClient)ChooseRedisInstance(db).GetClient();
IRedisTypedClient iredisClient = Redis.As();
Redis.Dispose();
return iredisClient.Lists[listId];
}
///
/// 在链表中删除单个实体
///
///
///
///
public void RemoveEntityFromList(string listId, T t, int db = 0)
{
Redis = (RedisClient)ChooseRedisInstance(db).GetClient();
IRedisTypedClient iredisClient = Redis.As();
var redisList = iredisClient.Lists[listId];
redisList.RemoveValue(t);
iredisClient.Save();
Redis.Dispose();
}
///
/// 根据lambada表达式删除符合条件的实体
///
///
///
///
public void RemoveEntityFromList(string listId, Func func)
{
//using (IRedisTypedClient iredisClient = Redis.As())
//{
// 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 iredisClient = Redis.As();
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> s2 = Redis.GetClientsInfo();
List s3 = Redis.GetAllKeys();
string s4 = Redis.GetHostString();
long s5 = Redis.Db;
}
#endregion
//释放资源
public void Dispose()
{
if (Redis != null)
{
Redis.Dispose();
Redis = null;
}
GC.Collect();
}
}
}