Redis总结(二)C#中如何使用redis

王朝学院·作者佚名  2016-08-28
窄屏简体版  字體: 小  |  中  |  大  |  超大  

上一篇讲述了安装redis《Redis总结(一)Redis安装》,同时也大致介绍了redis的优势和应用场景。本篇着重讲解.NET中如何使用redis和C#。

Redis官网提供了很多开源的C#客户端。例如,Nhiredis ,ServiceStack.Redis ,StackExchange.Redis等。其中ServiceStack.Redis应该算是比较流行的。它提供了一整套从Redis数据结构都强类型对象转换的机制并将对象json序列化。所以这里只介绍ServiceStack.Redis,它也是目前我们产品中所使用的客户端。

ServiceStack.Redis地址:https://github.com/ServiceStack/ServiceStack.Redis

1. 建立一个控制台应用程序,并引用以下ServiceStack.Redis相关的四个类库。或者通过Nuget进行安装Redis常用组件ServiceStack.Redis。 下载示例代码。

[flash=500,400]http://s1.knowsky.com/20160211/tstmwpwtp2p59.png[/flash]

2. 创建一个Redis操作的公用类RedisCacheHelper,

using System;

using System.Collections.Generic;

using System.Configuration;

using System.Linq;

using System.Text;

using System.Web;

using ServiceStack.Common.Extensions;

using ServiceStack.Redis;

using ServiceStack.Logging;

namespace Weiz.Redis.RedisTest

{

public class RedisCacheHelper

{PRivate static readonly PooledRedisClientManager pool = null;

private static readonly string[] redisHosts = null;

public static int RedisMaxReadPool = int.Parse(ConfigurationManager.AppSettings["redis_max_read_pool"]);

public static int RedisMaxWritePool = int.Parse(ConfigurationManager.AppSettings["redis_max_write_pool"]);

static RedisCacheHelper()

{

var redisHostStr = ConfigurationManager.AppSettings["redis_server_session"];

if (!string.IsNullOrEmpty(redisHostStr))

{

redisHosts = redisHostStr.Split(',');

if (redisHosts.Length > 0)

{

pool = new PooledRedisClientManager(redisHosts, redisHosts,

new RedisClientManagerConfig()

{

MaxWritePoolSize = RedisMaxWritePool,

MaxReadPoolSize = RedisMaxReadPool,

AutoStart = true

});

}

}

}

public static void Add<T>(string key, T value, DateTime expiry)

{

if (value == null)

{

return;

}

if (expiry <= DateTime.Now)

{

Remove(key);

return;

}

try

{

if (pool != null)

{

using (var r = pool.GetClient())

{

if (r != null)

{

r.SendTimeout = 1000;

r.Set(key, value, expiry - DateTime.Now);

}

}

}

}

catch (Exception ex)

{

string msg = string.Format("{0}:{1}发生异常!{2}", "cache", "存储", key);

}

}

public static void Add<T>(string key, T value, TimeSpan slidingExpiration)

{

if (value == null)

{

return;

}

if (slidingExpiration.TotalSeconds <= 0)

{

Remove(key);

return;

}

try

{

if (pool != null)

{

using (var r = pool.GetClient())

{

if (r != null)

{

r.SendTimeout = 1000;

r.Set(key, value, slidingExpiration);

}

}

}

}

catch (Exception ex)

{

string msg = string.Format("{0}:{1}发生异常!{2}", "cache", "存储", key);

}

}

public static T Get<T>(string key)

{

if (string.IsNullOrEmpty(key))

{

return default(T);

}

T obj = default(T);

try

{

if (pool != null)

{

using (var r = pool.GetClient())

{

if (r != null)

{

r.SendTimeout = 1000;

obj = r.Get<T>(key);

}

}

}

}

catch (Exception ex)

{

string msg = string.Format("{0}:{1}发生异常!{2}", "cache", "获取", key);

}

return obj;

}

public static void Remove(string key)

{

try

{

if (pool != null)

{

using (var r = pool.GetClient())

{

if (r != null)

{

r.SendTimeout = 1000;

r.Remove(key);

}

}

}

}

catch (Exception ex)

{

string msg = string.Format("{0}:{1}发生异常!{2}", "cache", "删除", key);

}

}

public static bool Exists(string key)

{

try

{

if (pool != null)

{

using (var r = pool.GetClient())

{

if (r != null)

{

r.SendTimeout = 1000;

return r.ContainsKey(key);

}

}

}

}

catch (Exception ex)

{

string msg = string.Format("{0}:{1}发生异常!{2}", "cache", "是否存在", key);

}

return false;

}

}

}

说明:RedisCacheHelper 使用的是客户端链接池模式,这样的存取效率应该是最高的。同时也更方便的支持读写分离,均衡负载。

3. 配置文件

<!-- redis Start -->

<add key="SessionExpireMinutes" value="180" />

<add key="redis_server_session" value="127.0.0.1:6379" />

<add key="redis_max_read_pool" value="3" />

<add key="redis_max_write_pool" value="1" />

<!--redis end-->

4. 测试程序调用

class Program

{

static void Main(string[] args)

{

Console.WriteLine("Redis写入缓存:zhong");

RedisCacheHelper.Add("zhong", "zhongzhongzhong", DateTime.Now.AddDays(1));

Console.WriteLine("Redis获取缓存:zhong");

string str3 = RedisCacheHelper.Get<string>("zhong");

Console.WriteLine(str3);

Console.WriteLine("Redis获取缓存:nihao");

string str = RedisCacheHelper.Get<string>("nihao");

Console.WriteLine(str);

Console.WriteLine("Redis获取缓存:wei");

string str1 = RedisCacheHelper.Get<string>("wei");

Console.WriteLine(str1);

Console.ReadKey();

}

}

5. 输出结果

[flash=500,400]http://s1.knowsky.com/20160211/resyvt5uazf59.png[/flash]

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航