大家好我正在尝试使用java设置redis服务器。我的 Redis 服务器是 ulimit 无限制的 linux 服务器。
这是我创建连接的spring bean
公共类 JedisService 实现 IJedisService, InitializingBean, DisposableBean{ private JedisPool jedisPool;
public JedisService() {
}
public JedisPool getJedisPool() {
return jedisPool;
}
@Override
public void destroy() throws Exception {
if(jedisPool != null){
jedisPool.destroy();
}
}
@Override
public void afterPropertiesSet() throws Exception {
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxActive(1000);
poolConfig.setMaxIdle(10);
poolConfig.setMinIdle(1);
poolConfig.setMaxWait(30000);
poolConfig.setNumTestsPerEvictionRun(10);
poolConfig.setTestOnBorrow(true);
poolConfig.setTestOnReturn(true);
poolConfig.setTestWhileIdle(true);
poolConfig.setTimeBetweenEvictionRunsMillis(30000);
jedisPool = new JedisPool(poolConfig,Config.REDIS_HOST,
RestrictionUtils.REDIS_PORT,RestrictionUtils.REDIS_CONNECTION_TIMEOUT);
}
public boolean validateHitsCount(String hostKey,String urlKey,int hostHitsCount, int urlHitsCount, long timeKey,Map<String, Object> overLimit){
int retryCount = 0;
return recursiveRedisConnection(retryCount,hostKey,urlKey,hostHitsCount,urlHitsCount,timeKey,overLimit);
}
private boolean recursiveRedisConnection(int retryCount,String hostKey,String urlKey,int hostHitsCount, int urlHitsCount, long timeKey,Map<String, Object> overLimit){
Jedis jedis = null;
boolean returnObj = true;
try {
//Connection
jedis = getJedisPool().getResource();
jedis.connect();
//Delete previous keys
try {
deletePreviouskeys(jedis, urlKey, hostKey, timeKey);
} catch (Exception e) {
}
//Validation
String value = jedis.get(hostKey+timeKey);
if(value != null){
try {
int count = Integer.parseInt(value);
System.out.println("HostCount: "+hostKey+ " "+count);
if(count < hostHitsCount){
jedis.incr(hostKey+timeKey);
returnObj = validateURLHits(jedis, urlKey, urlHitsCount, timeKey, overLimit);
}else{
returnObj = false;
overLimit.put("Data", "You have reached maximum limit for hits---"+hostKey);
}
} catch (Exception e) {
}
}else{
value = 1+"";
jedis.set(hostKey+timeKey, value);
jedis.expire(hostKey+timeKey, 60);
returnObj = validateURLHits(jedis, urlKey, urlHitsCount, timeKey, overLimit);
}
} catch (Exception e) {
retryCount ++;
if(retryCount < 3){
recursiveRedisConnection(retryCount,hostKey,urlKey,hostHitsCount,urlHitsCount,timeKey,overLimit);
}else{
e.printStackTrace();
returnObj = false;
}
}finally{
if(jedis != null && jedis.isConnected()){
getJedisPool().returnResource(jedis);
}
}
return returnObj;
}
private boolean validateURLHits(Jedis jedis,String urlKey, int urlHitsCount, long timeKey,Map<String, Object> overLimit){
boolean returnObj = true;
String value = jedis.get(urlKey+timeKey);
if(value != null){
try {
int count = Integer.parseInt(value);
System.out.println("URLCount: "+urlKey+ " "+count);
if(count < urlHitsCount){
jedis.incr(urlKey+timeKey);
}else{
returnObj = false;
overLimit.put("Data", "Reached maximum limit of hits for this URL");
}
}catch(Exception e){
}
}else{
jedis.set(urlKey+timeKey, 1+"");
jedis.expire(urlKey+timeKey, 60);
}
return returnObj;
}
private void deletePreviouskeys(Jedis jedis,String urlKey, String hostKey, long timeKey){
/*Set<String> keys = jedis.keys("*");
for(String key : keys){
if(!key.equalsIgnoreCase(urlKey+timeKey)){
if(!key.equalsIgnoreCase(hostKey+timeKey)){
jedis.del(key);
}
}
}*/
}
}
方法 validateURLHits 在控制器中被调用。但是当我在多个线程中运行这段代码时,我得到了这个错误
redis.clients.jedis.exceptions.JedisConnectionException:无法从 com.til.ibeat.service.JedisService.recursiveRedisConnection(JedisService. java:60) 在 com.til.ibeat.service.JedisService.recursiveRedisConnection(JedisService.java:95) 在 com.til.ibeat.service.JedisService.recursiveRedisConnection(JedisService.java:95) 在 com.til.ibeat.service .JedisService.validateHitsCount(JedisService.java:52) at com.til.ibeat.controller.MashupController.handleRequest(MashupController.java:66) at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48 ) 在 org.springframework.web.servlet 的 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:763)。DispatcherServlet.doService(DispatcherServlet.java:709) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:613) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:525) at javax .servlet.http.HttpServlet.service(HttpServlet.java:621) at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305 ) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 在 org.apache.catalina.core.StandardContextValve 的 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)。在 org.apache.catalina.authenticator.AuthenticatorBase.invoke 调用(StandardContextValve.java:123)(AuthenticatorBase.java:第472章.invoke(AccessLogValve.java:936) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 在 org. org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor 的 apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)。在 java.util.concurrent.ThreadPoolExecutor$Worker 的 java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 处运行 (JIoEndpoint.java:310)。在 java.lang.Thread.run(Unknown Source) 处运行(Unknown Source) 原因:java.util.NoSuchElementException:无法创建已验证的对象,原因:ValidateObject 失败