设为首页 收藏本站
查看: 1694|回复: 0

[经验分享] 一个技术汪的开源梦

[复制链接]

尚未签到

发表于 2017-12-20 22:39:36 | 显示全部楼层 |阅读模式
1 using System;  

  2 using System.Linq;  

  3 using System.Threading;  

  4 using StackExchange.Redis;  

  5 using Wlitsoft.Framework.Common.Core;  

  6 using Wlitsoft.Framework.Common.Extension;  

  7 using Wlitsoft.Framework.Common.Exception;  

  8  
  9 namespace Wlitsoft.Framework.Caching.Redis
  
10 {
  
11     /// <summary>
  
12     /// Redis 缓存。
  
13     /// </summary>

  
14     public>  
15     {
  
16         #region 私有属性
  
17
  
18         //redis 连接实例。
  
19         private volatile ConnectionMultiplexer _connection;
  
20
  
21         //redis 缓存数据库实例。

  
22         private>  
23
  
24         //连接实例锁。
  
25         private readonly SemaphoreSlim _connectionLock = new SemaphoreSlim(1, 1);
  
26
  
27         //Redis 配置。
  
28         internal static RedisCacheConfiguration RedisCacheConfiguration;
  
29
  
30         #endregion
  
31

  
32         #region>  
33
  
34         /// <summary>
  
35         /// 获取缓存。
  
36         /// </summary>
  
37         /// <typeparam name="T">缓存类型。</typeparam>
  
38         /// <param name="key">缓存键值。</param>
  
39         /// <returns>获取到的缓存。</returns>
  
40         public T Get<T>(string key)
  
41         {
  
42             #region 参数校验
  
43
  
44             if (string.IsNullOrEmpty(key))
  
45                 throw new StringNullOrEmptyException(nameof(key));
  
46
  
47             #endregion
  
48
  
49             this.Connect();
  
50             string result = this._database.StringGet(key);
  
51             if (string.IsNullOrEmpty(result))
  
52                 return default(T);
  
53             return result.ToJsonObject<T>();
  
54         }
  
55
  
56         /// <summary>
  
57         /// 设置缓存。
  
58         /// </summary>
  
59         /// <typeparam name="T">缓存类型。</typeparam>
  
60         /// <param name="key">缓存键值。</param>
  
61         /// <param name="value">要缓存的对象。</param>
  
62         public void Set<T>(string key, T value)
  
63         {
  
64             #region 参数校验
  
65
  
66             if (string.IsNullOrEmpty(key))
  
67                 throw new StringNullOrEmptyException(nameof(key));
  
68
  
69             if (value == null)
  
70                 throw new ObjectNullException(nameof(value));
  
71
  
72             #endregion
  
73
  
74             this.Connect();
  
75             this._database.StringSet(key, value.ToJsonString());
  
76         }
  
77
  
78         /// <summary>
  
79         /// 设置缓存。
  
80         /// </summary>
  
81         /// <typeparam name="T">缓存类型。</typeparam>
  
82         /// <param name="key">缓存键值。</param>
  
83         /// <param name="value">要缓存的对象。</param>
  
84         /// <param name="expiredTime">过期时间。</param>
  
85         public void Set<T>(string key, T value, TimeSpan expiredTime)
  
86         {
  
87             #region 参数校验
  
88
  
89             if (string.IsNullOrEmpty(key))
  
90                 throw new StringNullOrEmptyException(nameof(key));
  
91
  
92             if (value == null)
  
93                 throw new ObjectNullException(nameof(value));
  
94
  
95             #endregion
  
96
  
97             this.Connect();
  
98             this._database.StringSet(key, value.ToJsonString(), expiredTime);
  
99         }
  
100
  
101         /// <summary>
  
102         /// 判断指定键值的缓存是否存在。
  
103         /// </summary>
  
104         /// <param name="key">缓存键值。</param>
  
105         /// <returns>一个布尔值,表示缓存是否存在。</returns>
  
106         public bool Exists(string key)
  
107         {
  
108             #region 参数校验
  
109
  
110             if (string.IsNullOrEmpty(key))
  
111                 throw new StringNullOrEmptyException(nameof(key));
  
112
  
113             #endregion
  
114
  
115             this.Connect();
  
116             return this._database.KeyExists(key);
  
117         }
  
118
  
119         /// <summary>
  
120         /// 移除指定键值的缓存。
  
121         /// </summary>
  
122         /// <param name="key">缓存键值。</param>
  
123         public bool Remove(string key)
  
124         {
  
125             #region 参数校验
  
126
  
127             if (string.IsNullOrEmpty(key))
  
128                 throw new StringNullOrEmptyException(nameof(key));
  
129
  
130             #endregion
  
131
  
132             this.Connect();
  
133             return this._database.KeyDelete(key);
  
134         }
  
135
  
136         /// <summary>
  
137         /// 获取 Hash 表中的缓存。
  
138         /// </summary>
  
139         /// <typeparam name="T">缓存类型。</typeparam>
  
140         /// <param name="key">缓存键值。</param>
  
141         /// <param name="hashField">要获取的 hash 字段。</param>
  
142         /// <returns>获取到的缓存。</returns>
  
143         public T GetHash<T>(string key, string hashField)
  
144         {
  
145             #region 参数校验
  
146
  
147             if (string.IsNullOrEmpty(key))
  
148                 throw new StringNullOrEmptyException(nameof(key));
  
149
  
150             if (string.IsNullOrEmpty(hashField))
  
151                 throw new StringNullOrEmptyException(nameof(hashField));
  
152
  
153             #endregion
  
154
  
155             this.Connect();
  
156             string value = this._database.HashGet(key, hashField);
  
157             if (string.IsNullOrEmpty(value))
  
158                 return default(T);
  
159             return value.ToJsonObject<T>();
  
160         }
  
161
  
162         /// <summary>
  
163         /// 设置 缓存到 Hash 表。
  
164         /// </summary>
  
165         /// <typeparam name="T">缓存类型。</typeparam>
  
166         /// <param name="key">缓存键值。</param>
  
167         /// <param name="hashField">要设置的 hash 字段。</param>
  
168         /// <param name="hashValue">要设置的 hash 值。</param>
  
169         public void SetHash<T>(string key, string hashField, T hashValue)
  
170         {
  
171             #region 参数校验
  
172
  
173             if (string.IsNullOrEmpty(key))
  
174                 throw new StringNullOrEmptyException(nameof(key));
  
175
  
176             if (string.IsNullOrEmpty(hashField))
  
177                 throw new StringNullOrEmptyException(nameof(hashField));
  
178
  
179             if (hashValue == null)
  
180                 throw new ObjectNullException(nameof(hashValue));
  
181
  
182             #endregion
  
183
  
184             this.Connect();
  
185             this._database.HashSet(key, hashField, hashValue.ToJsonString());
  
186         }
  
187
  
188         /// <summary>
  
189         /// 判断指定键值的 Hash 缓存是否存在。
  
190         /// </summary>
  
191         /// <param name="key">缓存键值。</param>
  
192         /// <param name="hashField">hash 字段。</param>
  
193         /// <returns>一个布尔值,表示缓存是否存在。</returns>
  
194         public bool ExistsHash(string key, string hashField)
  
195         {
  
196             #region 参数校验
  
197
  
198             if (string.IsNullOrEmpty(key))
  
199                 throw new StringNullOrEmptyException(nameof(key));
  
200
  
201             if (string.IsNullOrEmpty(hashField))
  
202                 throw new StringNullOrEmptyException(nameof(hashField));
  
203
  
204             #endregion
  
205
  
206             this.Connect();
  
207             return this._database.HashExists(key, hashField);
  
208         }
  
209
  
210         /// <summary>
  
211         /// 删除 hash 表中的指定字段的缓存。
  
212         /// </summary>
  
213         /// <param name="key">缓存键值。</param>
  
214         /// <param name="hashField">hash 字段。</param>
  
215         /// <returns>一个布尔值,表示缓存是否删除成功。</returns>
  
216         public bool DeleteHash(string key, string hashField)
  
217         {
  
218             #region 参数校验
  
219
  
220             if (string.IsNullOrEmpty(key))
  
221                 throw new StringNullOrEmptyException(nameof(key));
  
222
  
223             if (string.IsNullOrEmpty(hashField))
  
224                 throw new StringNullOrEmptyException(nameof(hashField));
  
225
  
226             #endregion
  
227
  
228             this.Connect();
  
229             return this._database.HashDelete(key, hashField);
  
230         }
  
231
  
232         #endregion
  
233
  
234         #region 私有方法
  
235
  
236         /// <summary>
  
237         /// 连接。
  
238         /// </summary>
  
239         private void Connect()
  
240         {
  
241             if (this._connection != null)
  
242                 return;
  
243
  
244             this._connectionLock.Wait();
  
245             try
  
246             {
  
247                 if (this._connection == null)
  
248                 {
  
249                     this._connection = ConnectionMultiplexer.Connect(this.GetConfigurationOptions());
  
250                     this._database = this._connection.GetDatabase();
  
251                 }
  
252             }
  
253             finally
  
254             {
  
255                 this._connectionLock.Release();
  
256             }
  
257         }
  
258
  
259         private ConfigurationOptions GetConfigurationOptions()
  
260         {
  
261             #region 校验
  
262
  
263             if (RedisCacheConfiguration == null)
  
264                 throw new ObjectNullException(nameof(RedisCacheConfiguration));
  
265
  
266             if (!RedisCacheConfiguration.HostAndPoints.Any())
  
267                 throw new Exception("RedisCahce 的 HostAndPoints 不能为空");
  
268
  
269             #endregion
  
270
  
271             ConfigurationOptions options = new ConfigurationOptions();
  
272
  
273             foreach (string item in RedisCacheConfiguration.HostAndPoints)
  
274                 options.EndPoints.Add(item);
  
275
  
276             options.ConnectRetry = RedisCacheConfiguration.ConnectRetry;
  
277             options.ConnectTimeout = RedisCacheConfiguration.ConnectTimeout;
  
278
  
279             return options;
  
280         }
  
281
  
282         #endregion
  
283
  
284         #region 析构函数
  
285
  
286         /// <summary>
  
287         /// 析构 <see cref="RedisCache"/> 类型的对象。
  
288         /// </summary>
  
289         ~RedisCache()
  
290         {
  
291             _connection?.Close();
  
292         }
  
293
  
294         #endregion
  
295     }
  
296 }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-426254-1-1.html 上篇帖子: 就publish/subscribe功能看redis集群模式下的队列技术(一) 下篇帖子: Redis之清除所有缓存
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表