You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

143 lines
5.0 KiB

  1. using StackExchange.Redis;
  2. using System;
  3. using System.Collections.Concurrent;
  4. using System.Configuration;
  5. namespace Learun.Cache.Redis
  6. {
  7. /// <summary>
  8. /// 版 本 Learun-ADMS V7.0.3 力软敏捷开发框架
  9. /// Copyright (c) 2013-2018 上海力软信息技术有限公司
  10. /// 创建人:力软-框架开发组
  11. /// 日 期:2018.11.05
  12. /// 描 述:redis 链接类
  13. /// </summary>
  14. public static class RedisConnectionHelp
  15. {
  16. //系统自定义Key前缀
  17. public static readonly string SysCustomKey = ConfigurationManager.AppSettings["RedisPrev"] ?? "";
  18. //"127.0.0.1:6379,allowadmin=true
  19. private static readonly string RedisConnectionString = ConfigurationManager.AppSettings["RedisExchangeHosts"] ?? "127.0.0.1:6379,allowadmin=true";
  20. private static readonly object Locker = new object();
  21. private static ConnectionMultiplexer _instance;
  22. private static readonly ConcurrentDictionary<string, ConnectionMultiplexer> ConnectionCache = new ConcurrentDictionary<string, ConnectionMultiplexer>();
  23. /// <summary>
  24. /// 单例获取
  25. /// </summary>
  26. public static ConnectionMultiplexer Instance
  27. {
  28. get
  29. {
  30. if (_instance == null)
  31. {
  32. lock (Locker)
  33. {
  34. if (_instance == null || !_instance.IsConnected)
  35. {
  36. _instance = GetManager();
  37. }
  38. }
  39. }
  40. return _instance;
  41. }
  42. }
  43. /// <summary>
  44. /// 缓存获取
  45. /// </summary>
  46. /// <param name="connectionString"></param>
  47. /// <returns></returns>
  48. public static ConnectionMultiplexer GetConnectionMultiplexer(string connectionString)
  49. {
  50. if (!ConnectionCache.ContainsKey(connectionString))
  51. {
  52. ConnectionCache[connectionString] = GetManager(connectionString);
  53. }
  54. return ConnectionCache[connectionString];
  55. }
  56. private static ConnectionMultiplexer GetManager(string connectionString = null)
  57. {
  58. connectionString = connectionString ?? RedisConnectionString;
  59. var connect = ConnectionMultiplexer.Connect(connectionString);
  60. //注册如下事件
  61. connect.ConnectionFailed += MuxerConnectionFailed;
  62. connect.ConnectionRestored += MuxerConnectionRestored;
  63. connect.ErrorMessage += MuxerErrorMessage;
  64. connect.ConfigurationChanged += MuxerConfigurationChanged;
  65. connect.HashSlotMoved += MuxerHashSlotMoved;
  66. connect.InternalError += MuxerInternalError;
  67. return connect;
  68. }
  69. #region 事件
  70. /// <summary>
  71. /// 配置更改时
  72. /// </summary>
  73. /// <param name="sender"></param>
  74. /// <param name="e"></param>
  75. private static void MuxerConfigurationChanged(object sender, EndPointEventArgs e)
  76. {
  77. Console.WriteLine("Configuration changed: " + e.EndPoint);
  78. }
  79. /// <summary>
  80. /// 发生错误时
  81. /// </summary>
  82. /// <param name="sender"></param>
  83. /// <param name="e"></param>
  84. private static void MuxerErrorMessage(object sender, RedisErrorEventArgs e)
  85. {
  86. Console.WriteLine("ErrorMessage: " + e.Message);
  87. }
  88. /// <summary>
  89. /// 重新建立连接之前的错误
  90. /// </summary>
  91. /// <param name="sender"></param>
  92. /// <param name="e"></param>
  93. private static void MuxerConnectionRestored(object sender, ConnectionFailedEventArgs e)
  94. {
  95. Console.WriteLine("ConnectionRestored: " + e.EndPoint);
  96. }
  97. /// <summary>
  98. /// 连接失败 , 如果重新连接成功你将不会收到这个通知
  99. /// </summary>
  100. /// <param name="sender"></param>
  101. /// <param name="e"></param>
  102. private static void MuxerConnectionFailed(object sender, ConnectionFailedEventArgs e)
  103. {
  104. Console.WriteLine("重新连接:Endpoint failed: " + e.EndPoint + ", " + e.FailureType + (e.Exception == null ? "" : (", " + e.Exception.Message)));
  105. }
  106. /// <summary>
  107. /// 更改集群
  108. /// </summary>
  109. /// <param name="sender"></param>
  110. /// <param name="e"></param>
  111. private static void MuxerHashSlotMoved(object sender, HashSlotMovedEventArgs e)
  112. {
  113. Console.WriteLine("HashSlotMoved:NewEndPoint" + e.NewEndPoint + ", OldEndPoint" + e.OldEndPoint);
  114. }
  115. /// <summary>
  116. /// redis类库错误
  117. /// </summary>
  118. /// <param name="sender"></param>
  119. /// <param name="e"></param>
  120. private static void MuxerInternalError(object sender, InternalErrorEventArgs e)
  121. {
  122. Console.WriteLine("InternalError:Message" + e.Exception.Message);
  123. }
  124. #endregion 事件
  125. }
  126. }