-
Notifications
You must be signed in to change notification settings - Fork 182
/
Copy pathRedisOutputCacheProvider.cs
135 lines (119 loc) · 3.82 KB
/
RedisOutputCacheProvider.cs
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
//
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
//
using System;
using System.Threading.Tasks;
using System.Web.Caching;
namespace Microsoft.Web.Redis
{
public class RedisOutputCacheProvider : OutputCacheProviderAsync
{
internal static ProviderConfiguration configuration;
internal static object configurationCreationLock = new object();
internal IOutputCacheConnection cache;
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
{
if (config == null)
{
throw new ArgumentNullException("config");
}
if (name == null || name.Length == 0)
{
name = "MyCacheStore";
}
if (String.IsNullOrEmpty(config["description"]))
{
config.Remove("description");
config.Add("description", "Redis as a session data store");
}
base.Initialize(name, config);
// If configuration exists then use it otherwise read from config file and create one
if (configuration == null)
{
lock (configurationCreationLock)
{
if (configuration == null)
{
configuration = ProviderConfiguration.ProviderConfigurationForOutputCache(config);
}
}
}
}
public override object Get(string key)
{
try
{
GetAccessToCacheStore();
return cache.Get(key);
}
catch(Exception e)
{
LogUtility.LogError("Error in Get: " + e.Message);
}
return null;
}
public override async Task<object> GetAsync(string key)
{
return await Task.FromResult(Get(key));
}
public override object Add(string key, object entry, DateTime utcExpiry)
{
try
{
GetAccessToCacheStore();
return cache.Add(key, entry, utcExpiry);
}
catch (Exception e)
{
LogUtility.LogError("Error in Add: " + e.Message);
}
return null;
}
public override async Task<object> AddAsync(string key, object entry, DateTime utcExpiry)
{
return await Task.FromResult(Add(key, entry, utcExpiry));
}
public override void Set(string key, object entry, DateTime utcExpiry)
{
try
{
GetAccessToCacheStore();
cache.Set(key, entry, utcExpiry);
}
catch (Exception e)
{
LogUtility.LogError("Error in Set: " + e.Message);
}
}
public override async Task SetAsync(string key, object entry, DateTime utcExpiry)
{
Set(key, entry, utcExpiry);
await Task.FromResult(0);
}
public override void Remove(string key)
{
try
{
GetAccessToCacheStore();
cache.Remove(key);
}
catch (Exception e)
{
LogUtility.LogError("Error in Remove: " + e.Message);
}
}
public override async Task RemoveAsync(string key)
{
Remove(key);
await Task.FromResult(0);
}
private void GetAccessToCacheStore()
{
if (cache == null)
{
cache = new RedisOutputCacheConnectionWrapper(configuration);
}
}
}
}