飞星
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 

108 righe
3.9 KiB

  1. using System;
  2. using System.Collections.Concurrent;
  3. using Microsoft.Extensions.Configuration;
  4. using StackExchange.Redis;
  5. namespace Permission.Redis
  6. {
  7. public class RedisClient : IDisposable
  8. {
  9. private IConfiguration _config;
  10. private ConcurrentDictionary<string, ConnectionMultiplexer> _connections;
  11. public RedisClient(IConfiguration config)
  12. {
  13. _config = config;
  14. _connections = new ConcurrentDictionary<string, ConnectionMultiplexer>();
  15. }
  16. /// <summary>
  17. /// 获取ConnectionMultiplexer
  18. /// </summary>
  19. /// <param name="redisConfig">RedisConfig配置文件</param>
  20. /// <returns></returns>
  21. private ConnectionMultiplexer GetConnect(IConfigurationSection redisConfig)
  22. {
  23. var redisInstanceName = redisConfig["InstanceName"];
  24. var connStr = redisConfig["Connection"];
  25. return _connections.GetOrAdd(redisInstanceName, p => ConnectionMultiplexer.Connect(connStr));
  26. }
  27. /// <summary>
  28. /// 检查入参数
  29. /// </summary>
  30. /// <param name="configName">RedisConfig配置文件中的 Redis_Default/Redis_6 名称</param>
  31. /// <returns></returns>
  32. private IConfigurationSection CheckeConfig(string configName)
  33. {
  34. IConfigurationSection redisConfig = _config.GetSection("RedisConfig").GetSection(configName);
  35. if (redisConfig == null)
  36. {
  37. throw new ArgumentNullException($"{configName}找不到对应的RedisConfig配置!");
  38. }
  39. var redisInstanceName = redisConfig["InstanceName"];
  40. var connStr = redisConfig["Connection"];
  41. if (string.IsNullOrEmpty(redisInstanceName))
  42. {
  43. throw new ArgumentNullException($"{configName}找不到对应的InstanceName");
  44. }
  45. if (string.IsNullOrEmpty(connStr))
  46. {
  47. throw new ArgumentNullException($"{configName}找不到对应的Connection");
  48. }
  49. return redisConfig;
  50. }
  51. /// <summary>
  52. /// 获取数据库
  53. /// </summary>
  54. /// <param name="configName"></param>
  55. /// <param name="db">默认为0:优先代码的db配置,其次config中的配置</param>
  56. /// <returns></returns>
  57. public IDatabase GetDatabase(string configName = null, int? db = null)
  58. {
  59. int defaultDb = 0;
  60. IConfigurationSection redisConfig = CheckeConfig(configName);
  61. if (db.HasValue)
  62. {
  63. defaultDb = db.Value;
  64. }
  65. else
  66. {
  67. var strDefalutDatabase = redisConfig["DefaultDatabase"];
  68. if (!string.IsNullOrEmpty(strDefalutDatabase) && Int32.TryParse(strDefalutDatabase, out var intDefaultDatabase))
  69. {
  70. defaultDb = intDefaultDatabase;
  71. }
  72. }
  73. return GetConnect(redisConfig).GetDatabase(defaultDb);
  74. }
  75. public IServer GetServer(string configName = null, int endPointsIndex = 0)
  76. {
  77. IConfigurationSection redisConfig = CheckeConfig(configName);
  78. var connStr = redisConfig["Connection"];
  79. var confOption = ConfigurationOptions.Parse((string)connStr);
  80. return GetConnect(redisConfig).GetServer(confOption.EndPoints[endPointsIndex]);
  81. }
  82. public ISubscriber GetSubscriber(string configName = null)
  83. {
  84. IConfigurationSection redisConfig = CheckeConfig(configName);
  85. return GetConnect(redisConfig).GetSubscriber();
  86. }
  87. public void Dispose()
  88. {
  89. if (_connections != null && _connections.Count > 0)
  90. {
  91. foreach (var item in _connections.Values)
  92. {
  93. item.Close();
  94. }
  95. }
  96. }
  97. }
  98. }