前段时间用Redis优化了公司的一个c#项目模块,刚上线时表现还是不错的,但后来发现不太对劲。高峰期时CPU占比很高,于是想找优化方案。
RedisClient RedisClient = new RedisClient("127.0.0.1", 6379);以上是我一开始采用的链接方式,这种方式会在高峰期时频繁创建和释放链接,对CPU的消耗很大。于是经过一番搜寻,改用了连接池的方式。使用PooledRedisClientManager连接缓冲池中获取连接,使用完毕后还给连接池。
namespace Web
{
/// <summary>
/// Redis客户端管理类
/// </summary>
public static class RedisManager
{
private static PooledRedisClientManager clientManager;
/// <summary>
/// 初始化信息
/// </summary>
private static void initInfo() {
string host = string.Format("{0}:{1}", "127.0.0.1", "6379"); //这里的IP和端口号大多数人写在配置文件里,我这里因为小功能模块,自己用就直接写在代码里了
initInfo(new string[] { host},new string[] { host});
}
/// <summary>
/// 初始化Redis客户端管理
/// </summary>
/// <param name="readWriteHosts"></param>
/// <param name="readOnlyHosts"></param>
private static void initInfo(string[] readWriteHosts, string[] readOnlyHosts)
{
clientManager = new PooledRedisClientManager(readWriteHosts, readOnlyHosts, new RedisClientManagerConfig
{
MaxWritePoolSize = 200, //写链接池链接数
MaxReadPoolSize = 50, //读链接池链接数
AutoStart = true
});
}
public static IRedisClient getRedisClient() {
if (clientManager == null) {
initInfo();
}
return clientManager.GetClient();
}
}
}下面是调用方法,当然你也可以使用using
namespace Web
{
public class RedisHelper
{
public static string getList(string DeviceName,int num) {
try {
RedisClient redisClient = (RedisClient)RedisManager.getRedisClient();
redisClient.ChangeDb(num);
string res = redisClient.GetValue(DeviceName) ?? "[]";
redisClient.Dispose();
return res;
} catch {
return "[]";
//return e.Message;
}
}
public static int setList(string DeviceName, string list, int num) {
try {
RedisClient redisClient = (RedisClient)RedisManager.getRedisClient();
redisClient.ChangeDb(num);
redisClient.SetEntry(DeviceName,list);
redisClient.Dispose();
} catch {
return 0;
}
return 1;
}
}
}