在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

JFinal RedisSentinelPlugin

2016-7-29 15:47| 发布者: zhangjf| 查看: 575| 评论: 0

摘要: 详情见博客http://my.oschina.net/aixiaohua/blog/710734 package com.jfinal.plugin.redis;import java.util.HashSet;import java.util.Set;import org.apache.commons.pool2 ...
详情见博客http://my.oschina.net/aixiaohua/blog/710734
  1. package com.jfinal.plugin.redis;
  2. import java.util.HashSet;
  3. import java.util.Set;
  4. import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
  5. import redis.clients.jedis.HostAndPort;
  6. import redis.clients.jedis.JedisSentinelPool;
  7. import redis.clients.jedis.Protocol;
  8. import com.jfinal.kit.StrKit;
  9. import com.jfinal.plugin.IPlugin;
  10. import com.jfinal.plugin.redis.serializer.FstSerializer;
  11. import com.jfinal.plugin.redis.serializer.ISerializer;
  12. public class RedisSentinelPlugin implements IPlugin {
  13. private String cacheName;
  14. private String masterName = null;
  15. private int connectionTimeout = Protocol.DEFAULT_TIMEOUT;
  16. //下一jedis版本预留字段
  17. //private int soTimeout = Protocol.DEFAULT_TIMEOUT;
  18. private String password = null;
  19. private int database = Protocol.DEFAULT_DATABASE;
  20. //下一jedis版本预留字段
  21. //private String clientName = null;
  22. private Set<String> sentinels = new HashSet<String>();
  23. private ISerializer serializer;
  24. private IKeyNamingPolicy keyNamingPolicy;
  25. private GenericObjectPoolConfig poolConfig;
  26. public RedisSentinelPlugin(String cacheName, String masterName,
  27. Set<HostAndPort> sentinels, final GenericObjectPoolConfig poolConfig) {
  28. this(cacheName, masterName, sentinels, poolConfig,
  29. Protocol.DEFAULT_TIMEOUT, null, Protocol.DEFAULT_DATABASE);
  30. }
  31. public RedisSentinelPlugin(String cacheName, String masterName,
  32. Set<HostAndPort> sentinels) {
  33. this(cacheName, masterName, sentinels, new GenericObjectPoolConfig(),
  34. Protocol.DEFAULT_TIMEOUT, null, Protocol.DEFAULT_DATABASE);
  35. }
  36. public RedisSentinelPlugin(String cacheName, String masterName,
  37. Set<HostAndPort> sentinels, String password) {
  38. this(cacheName, masterName, sentinels, new GenericObjectPoolConfig(),
  39. Protocol.DEFAULT_TIMEOUT, password);
  40. }
  41. public RedisSentinelPlugin(String cacheName, String masterName,
  42. Set<HostAndPort> sentinels, final GenericObjectPoolConfig poolConfig,
  43. int timeout, final String password) {
  44. this(cacheName, masterName, sentinels, poolConfig, timeout, password,
  45. Protocol.DEFAULT_DATABASE);
  46. }
  47. public RedisSentinelPlugin(String cacheName, String masterName,
  48. Set<HostAndPort> sentinels, final GenericObjectPoolConfig poolConfig,
  49. final int timeout) {
  50. this(cacheName, masterName, sentinels, poolConfig, timeout, null,
  51. Protocol.DEFAULT_DATABASE);
  52. }
  53. public RedisSentinelPlugin(String cacheName, String masterName,
  54. Set<HostAndPort> sentinels, final GenericObjectPoolConfig poolConfig,
  55. final String password) {
  56. this(cacheName, masterName, sentinels, poolConfig,
  57. Protocol.DEFAULT_TIMEOUT, password);
  58. }
  59. public RedisSentinelPlugin(String cacheName, String masterName,
  60. Set<HostAndPort> sentinels, final GenericObjectPoolConfig poolConfig,
  61. int timeout, final String password, final int database) {
  62. this(cacheName, masterName, sentinels, poolConfig, timeout, timeout,
  63. password, database);
  64. }
  65. public RedisSentinelPlugin(String cacheName, String masterName,
  66. Set<HostAndPort> sentinels, final GenericObjectPoolConfig poolConfig,
  67. int timeout, final String password, final int database,
  68. final String clientName) {
  69. this(cacheName, masterName, sentinels, poolConfig, timeout, timeout,
  70. password, database, clientName);
  71. }
  72. public RedisSentinelPlugin(String cacheName, String masterName,
  73. Set<HostAndPort> sentinels, final GenericObjectPoolConfig poolConfig,
  74. final int timeout, final int soTimeout, final String password,
  75. final int database) {
  76. this(cacheName, masterName, sentinels, poolConfig, timeout, soTimeout,
  77. password, database, null);
  78. }
  79. public RedisSentinelPlugin(String cacheName, String masterName,
  80. Set<HostAndPort> sentinels, final GenericObjectPoolConfig poolConfig,
  81. final int connectionTimeout, final int soTimeout,
  82. final String password, final int database, final String clientName) {
  83. if (StrKit.isBlank(cacheName))
  84. throw new IllegalArgumentException("cacheName can not be blank.");
  85. if (StrKit.isBlank(masterName))
  86. throw new IllegalArgumentException("masterName can not be blank.");
  87. if (null == sentinels || sentinels.isEmpty())
  88. throw new IllegalArgumentException("sentinels can not be blank.");
  89. if (null == poolConfig)
  90. throw new IllegalArgumentException("poolConfig can not be null.");
  91. for(HostAndPort hp : sentinels)
  92. {
  93. this.sentinels.add(hp.toString());
  94. }
  95. this.cacheName = cacheName.trim();
  96. this.masterName = masterName.trim();
  97. this.poolConfig = poolConfig;
  98. this.connectionTimeout = connectionTimeout;
  99. //this.soTimeout = soTimeout;
  100. this.password = password;
  101. this.database = database;
  102. //this.clientName = clientName;
  103. }
  104. public boolean start() {
  105. JedisSentinelPool jedisSentinelPool =new JedisSentinelPool(masterName, sentinels,
  106. poolConfig, connectionTimeout, password, database);
  107. if (serializer == null)
  108. serializer = FstSerializer.me;
  109. if (keyNamingPolicy == null)
  110. keyNamingPolicy = IKeyNamingPolicy.defaultKeyNamingPolicy;
  111. Cache cache = new Cache(cacheName, jedisSentinelPool, serializer,
  112. keyNamingPolicy);
  113. Redis.addCache(cache);
  114. return true;
  115. }
  116. public boolean stop() {
  117. Cache cache = Redis.removeCache(cacheName);
  118. if (cache == Redis.mainCache)
  119. Redis.mainCache = null;
  120. cache.jedisPool.destroy();
  121. return true;
  122. }
  123. /**
  124. * 当RedisSentinelPlugin 提供的设置属性仍然无法满足需求时,通过此方法获取到 JedisPoolConfig 对象,可对 redis
  125. * 进行更加细致的配置
  126. *
  127. * <pre>
  128. * 例如:
  129. * redisSentinelPlugin.getJedisPoolConfig().setMaxTotal(100);
  130. * </pre>
  131. */
  132. public GenericObjectPoolConfig getGenericObjectPoolConfig() {
  133. return poolConfig;
  134. }
  135. // ---------
  136. public void setSerializer(ISerializer serializer) {
  137. this.serializer = serializer;
  138. }
  139. public void setKeyNamingPolicy(IKeyNamingPolicy keyNamingPolicy) {
  140. this.keyNamingPolicy = keyNamingPolicy;
  141. }
  142. // ---------
  143. public void setTestWhileIdle(boolean testWhileIdle) {
  144. poolConfig.setTestWhileIdle(testWhileIdle);
  145. }
  146. public void setMinEvictableIdleTimeMillis(int minEvictableIdleTimeMillis) {
  147. poolConfig
  148. .setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
  149. }
  150. public void setTimeBetweenEvictionRunsMillis(
  151. int timeBetweenEvictionRunsMillis) {
  152. poolConfig
  153. .setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
  154. }
  155. public void setNumTestsPerEvictionRun(int numTestsPerEvictionRun) {
  156. poolConfig.setNumTestsPerEvictionRun(numTestsPerEvictionRun);
  157. }
  158. //提供懒初始化初始数据库,避免太多构造器
  159. public void setDatabase(int database) {
  160. this.database = database;
  161. }
  162. }
复制代码
  1. package com.jfinal.plugin.redis;
  2. import java.util.HashSet;
  3. import java.util.Set;
  4. import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
  5. import redis.clients.jedis.HostAndPort;
  6. import redis.clients.jedis.JedisSentinelPool;
  7. import redis.clients.jedis.Protocol;
  8. import com.jfinal.kit.StrKit;
  9. import com.jfinal.plugin.IPlugin;
  10. import com.jfinal.plugin.redis.serializer.FstSerializer;
  11. import com.jfinal.plugin.redis.serializer.ISerializer;
  12. public class RedisSentinelPlugin implements IPlugin {
  13. private String cacheName;
  14. private String masterName = null;
  15. private int connectionTimeout = Protocol.DEFAULT_TIMEOUT;
  16. //下一jedis版本预留字段
  17. //private int soTimeout = Protocol.DEFAULT_TIMEOUT;
  18. private String password = null;
  19. private int database = Protocol.DEFAULT_DATABASE;
  20. //下一jedis版本预留字段
  21. //private String clientName = null;
  22. private Set<String> sentinels = new HashSet<String>();
  23. private ISerializer serializer;
  24. private IKeyNamingPolicy keyNamingPolicy;
  25. private GenericObjectPoolConfig poolConfig;
  26. public RedisSentinelPlugin(String cacheName, String masterName,
  27. Set<HostAndPort> sentinels, final GenericObjectPoolConfig poolConfig) {
  28. this(cacheName, masterName, sentinels, poolConfig,
  29. Protocol.DEFAULT_TIMEOUT, null, Protocol.DEFAULT_DATABASE);
  30. }
  31. public RedisSentinelPlugin(String cacheName, String masterName,
  32. Set<HostAndPort> sentinels) {
  33. this(cacheName, masterName, sentinels, new GenericObjectPoolConfig(),
  34. Protocol.DEFAULT_TIMEOUT, null, Protocol.DEFAULT_DATABASE);
  35. }
  36. public RedisSentinelPlugin(String cacheName, String masterName,
  37. Set<HostAndPort> sentinels, String password) {
  38. this(cacheName, masterName, sentinels, new GenericObjectPoolConfig(),
  39. Protocol.DEFAULT_TIMEOUT, password);
  40. }
  41. public RedisSentinelPlugin(String cacheName, String masterName,
  42. Set<HostAndPort> sentinels, final GenericObjectPoolConfig poolConfig,
  43. int timeout, final String password) {
  44. this(cacheName, masterName, sentinels, poolConfig, timeout, password,
  45. Protocol.DEFAULT_DATABASE);
  46. }
  47. public RedisSentinelPlugin(String cacheName, String masterName,
  48. Set<HostAndPort> sentinels, final GenericObjectPoolConfig poolConfig,
  49. final int timeout) {
  50. this(cacheName, masterName, sentinels, poolConfig, timeout, null,
  51. Protocol.DEFAULT_DATABASE);
  52. }
  53. public RedisSentinelPlugin(String cacheName, String masterName,
  54. Set<HostAndPort> sentinels, final GenericObjectPoolConfig poolConfig,
  55. final String password) {
  56. this(cacheName, masterName, sentinels, poolConfig,
  57. Protocol.DEFAULT_TIMEOUT, password);
  58. }
  59. public RedisSentinelPlugin(String cacheName, String masterName,
  60. Set<HostAndPort> sentinels, final GenericObjectPoolConfig poolConfig,
  61. int timeout, final String password, final int database) {
  62. this(cacheName, masterName, sentinels, poolConfig, timeout, timeout,
  63. password, database);
  64. }
  65. public RedisSentinelPlugin(String cacheName, String masterName,
  66. Set<HostAndPort> sentinels, final GenericObjectPoolConfig poolConfig,
  67. int timeout, final String password, final int database,
  68. final String clientName) {
  69. this(cacheName, masterName, sentinels, poolConfig, timeout, timeout,
  70. password, database, clientName);
  71. }
  72. public RedisSentinelPlugin(String cacheName, String masterName,
  73. Set<HostAndPort> sentinels, final GenericObjectPoolConfig poolConfig,
  74. final int timeout, final int soTimeout, final String password,
  75. final int database) {
  76. this(cacheName, masterName, sentinels, poolConfig, timeout, soTimeout,
  77. password, database, null);
  78. }
  79. public RedisSentinelPlugin(String cacheName, String masterName,
  80. Set<HostAndPort> sentinels, final GenericObjectPoolConfig poolConfig,
  81. final int connectionTimeout, final int soTimeout,
  82. final String password, final int database, final String clientName) {
  83. if (StrKit.isBlank(cacheName))
  84. throw new IllegalArgumentException("cacheName can not be blank.");
  85. if (StrKit.isBlank(masterName))
  86. throw new IllegalArgumentException("masterName can not be blank.");
  87. if (null == sentinels || sentinels.isEmpty())
  88. throw new IllegalArgumentException("sentinels can not be blank.");
  89. if (null == poolConfig)
  90. throw new IllegalArgumentException("poolConfig can not be null.");
  91. for(HostAndPort hp : sentinels)
  92. {
  93. this.sentinels.add(hp.toString());
  94. }
  95. this.cacheName = cacheName.trim();
  96. this.masterName = masterName.trim();
  97. this.poolConfig = poolConfig;
  98. this.connectionTimeout = connectionTimeout;
  99. //this.soTimeout = soTimeout;
  100. this.password = password;
  101. this.database = database;
  102. //this.clientName = clientName;
  103. }
  104. public boolean start() {
  105. JedisSentinelPool jedisSentinelPool =new JedisSentinelPool(masterName, sentinels,
  106. poolConfig, connectionTimeout, password, database);
  107. if (serializer == null)
  108. serializer = FstSerializer.me;
  109. if (keyNamingPolicy == null)
  110. keyNamingPolicy = IKeyNamingPolicy.defaultKeyNamingPolicy;
  111. Cache cache = new Cache(cacheName, jedisSentinelPool, serializer,
  112. keyNamingPolicy);
  113. Redis.addCache(cache);
  114. return true;
  115. }
  116. public boolean stop() {
  117. Cache cache = Redis.removeCache(cacheName);
  118. if (cache == Redis.mainCache)
  119. Redis.mainCache = null;
  120. cache.jedisPool.destroy();
  121. return true;
  122. }
  123. /**
  124. * 当RedisSentinelPlugin 提供的设置属性仍然无法满足需求时,通过此方法获取到 JedisPoolConfig 对象,可对 redis
  125. * 进行更加细致的配置
  126. *
  127. * <pre>
  128. * 例如:
  129. * redisSentinelPlugin.getJedisPoolConfig().setMaxTotal(100);
  130. * </pre>
  131. */
  132. public GenericObjectPoolConfig getGenericObjectPoolConfig() {
  133. return poolConfig;
  134. }
  135. // ---------
  136. public void setSerializer(ISerializer serializer) {
  137. this.serializer = serializer;
  138. }
  139. public void setKeyNamingPolicy(IKeyNamingPolicy keyNamingPolicy) {
  140. this.keyNamingPolicy = keyNamingPolicy;
  141. }
  142. // ---------
  143. public void setTestWhileIdle(boolean testWhileIdle) {
  144. poolConfig.setTestWhileIdle(testWhileIdle);
  145. }
  146. public void setMinEvictableIdleTimeMillis(int minEvictableIdleTimeMillis) {
  147. poolConfig
  148. .setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
  149. }
  150. public void setTimeBetweenEvictionRunsMillis(
  151. int timeBetweenEvictionRunsMillis) {
  152. poolConfig
  153. .setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
  154. }
  155. public void setNumTestsPerEvictionRun(int numTestsPerEvictionRun) {
  156. poolConfig.setNumTestsPerEvictionRun(numTestsPerEvictionRun);
  157. }
  158. //提供懒初始化初始数据库,避免太多构造器
  159. public void setDatabase(int database) {
  160. this.database = database;
  161. }
  162. }
复制代码

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-5-6 13:09

Copyright 2015-2025 djqfx

返回顶部