|
由于要做一个同一个页面上多种图表数据的下载,考虑到Azure上面的session很不稳定(可用Redis provider存储session,较稳定),故决定改为Azure支持的Redis,顺便也学习一下这种新的存储方式。
关于Redis的介绍这里不赘述了,他可存储多种类型的数据,不过还是相当基本的那些数据类型。
开始的设计是,利用Redis的Hashs存储每一个数据表的行列信息。在写了一系列代码后,发现这样的话执行速度上会有很大的影响。
后来经同事提醒,可以将table转换为json再进行Redis的String类型的存储。
在Azure门户上进行相应的Redis的配置。
然后先建立一个RedisClient类
1 public class RedisClient
2 {
3 private static readonly ILogger _logger = LoggerFactory.GetLogger(LoggerSourceName);
4 private const string LoggerSourceName = "RedisClient";
5
6 private static readonly Lazy<ConnectionMultiplexer> LazyConnection = new Lazy<ConnectionMultiplexer>(() =>
7 {
8 _logger.Info(LoggerSourceName, "Begin to create Redis connection");
9
10 //read connection information from storage/configuration-redis/Redis.config
11 CloudStorageAccount storageAccount = CloudStorageAccount.Parse(Config.CloudStorageAccount);
12 CloudBlobContainer container = storageAccount.CreateCloudBlobClient().GetContainerReference("configuration-redis");
13 if (!container.Exists())
14 throw new ConfigurationErrorsException("fail to get redis connection string");
15 CloudBlockBlob blob = container.GetBlockBlobReference("Redis.config");
16 if (!blob.Exists())
17 throw new ConfigurationErrorsException("fail to get redis connection string");
18 string redisConnectionString;
19 using (var ms = new MemoryStream())
20 {
21 blob.DownloadToStream(ms);
22 ms.Position = 0;
23 using (var sr = new StreamReader(ms))
24 {
25 redisConnectionString = sr.ReadToEnd();
26 }
27 }
28
29
30 ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(redisConnectionString);
31 redis.ConfigurationChanged += redis_ConfigurationChanged;
32 redis.ConfigurationChangedBroadcast += redis_ConfigurationChangedBroadcast;
33 redis.ConnectionFailed += redis_ConnectionFailed;
34 redis.ConnectionRestored += redis_ConnectionRestored;
35 return redis;
36 });
37
38
39 private static IDatabase _db;
40
41 public static ConnectionMultiplexer Connection
42 {
43 get { return LazyConnection.Value; }
44 }
45
46 public static IDatabase Db
47 {
48 get { return _db ?? (_db = Connection.GetDatabase()); }
49 }
50
51
52 private static void redis_ConnectionRestored(object sender, ConnectionFailedEventArgs e)
53 {
54 _logger.Info(LoggerSourceName, "Redis ConnectionRestored");
55 }
56
57 private static void redis_ConnectionFailed(object sender, ConnectionFailedEventArgs e)
58 {
59 _logger.Info(LoggerSourceName, "Redis ConnectionFailed");
60 }
61
62 private static void redis_ConfigurationChangedBroadcast(object sender, EndPointEventArgs e)
63 {
64 _logger.Info(LoggerSourceName, "Redis ConfigurationChangedBroadcast");
65 }
66
67 private static void redis_ConfigurationChanged(object sender, EndPointEventArgs e)
68 {
69 _logger.Info(LoggerSourceName, "Redis ConfigurationChanged");
70 }
71 }
然后就是简单的写入啦。
public static void SetRedisTable(string key, DataTable dt)
{
if (dt != null && !string.IsNullOrEmpty(key))
{
string value = JsonHelper.ToJson(dt);
RedisClient.Db.StringSetAsync(key, value);
}
}
还有读取。
public static DataTable GetRedisTable(string key)
{
DataTable dt = new DataTable();
if (!string.IsNullOrEmpty(key))
{
string s = RedisClient.Db.StringGet(key).ToString();
if (!string.IsNullOrEmpty(s))
dt = JsonHelper.JsonToDataTable(s);
}
return dt;
}
以上很简单
另有一段代码还不知道干嘛用,先记录下来。
1 public static class StackExchangeExtesion
2 {
3 public static T Get<T>(this IDatabase cache, string key)
4 {
5 var cachedValue = cache.StringGet(key);
6 if (String.IsNullOrEmpty(cachedValue))
7 return default(T);
8 return JsonConvert.DeserializeObject<T>(cachedValue);
9 }
10
11 public static object Get(this IDatabase cache, string key)
12 {
13 var cachedValue = cache.StringGet(key);
14 if (String.IsNullOrEmpty(cachedValue))
15 return null;
16 return JsonConvert.DeserializeObject<object>(cachedValue);
17 }
18
19 public static void Set(this IDatabase cache, string key, object value, TimeSpan? expiry = null, When when = When.Always, CommandFlags flags = CommandFlags.None)
20 {
21 cache.StringSet(key, JsonConvert.SerializeObject(value), expiry, when, flags);
22 }
23
24 public static void ListPush(this IDatabase cache, string key, object value)
25 {
26 cache.ListRightPush(key, JsonConvert.SerializeObject(value));
27 }
28
29 public static RedisValue[] ListRange(this IDatabase cache, string key, long start, long stop)
30 {
31 if (start >= cache.ListLength(key))
32 return new RedisValue[0];
33
34 return cache.ListRange(key, start, stop);
35 }
36 } |
|
|