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。 下载示例代码。
2. 创建一个Redis操作的公用类RedisCacheHelper,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 |
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. 配置文件
1 2 3 4 5 6 |
<!-- 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. 测试程序调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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. 输出结果
Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有