關於redis併發的程式
最近專案中要使用redis來進行資料儲存,我安裝了一臺redis(單機)。我的想法是,併發200去set(key,value)和併發200去get(key)
package com.ljq.utils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class RedisAPI {
private static JedisPool pool = null;
static int count = 0;
public static JedisPool getPool() {
if (pool == null) {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxActive(1000);
config.setMaxIdle(5);
config.setMaxWait(1000 * 100);
config.setTestOnBorrow(true);
pool = new JedisPool(config, "192.168.1.123", 6379);
}
return pool;
}
public static void returnResource(JedisPool pool, Jedis redis) {
if (redis != null) {
pool.returnResource(redis);
}
}
public static String get(String key){
String value = null;
try {
JedisPool pool = null;
Jedis jedis = null;
try {
pool = getPool();
jedis = pool.getResource();
value = jedis.get(key);
} catch (Exception e) {
pool.returnBrokenResource(jedis);
e.printStackTrace();
} finally {
returnResource(pool, jedis);
}
} catch (Exception e) {
// TODO: handle exception
}
return value;
}
public static String set(String key,String contents){
String value = null;
try {
JedisPool pool = null;
Jedis jedis = null;
try {
pool = getPool();
jedis = pool.getResource();
value = jedis.set(key,contents);
} catch (Exception e) {
pool.returnBrokenResource(jedis);
e.printStackTrace();
} finally {
returnResource(pool, jedis);
}
} catch (Exception e) {
// TODO: handle exception
}
return value;
}
public static void main(String[] args) {
try {
for(int i = 0;i<200;i++){
new Thread( new Runnable() {
public void run() {
System.out.println(set("age","100"));//也可以get(key)
System.out.println("---------------------:"+(++count));
}
}).start();
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
==========================================================================
現在報異常::
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
at redis.clients.util.Pool.getResource(Pool.java:22)
at com.ljq.utils.RedisAPI.set(RedisAPI.java:61)
at com.ljq.utils.RedisAPI$1.run(RedisAPI.java:82)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.util.NoSuchElementException: Could not create a validated object, cause: ValidateObject failed
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1191)
at redis.clients.util.Pool.getResource(Pool.java:20)
... 3 more
我不知道為什麼我配置的執行緒池的1000,怎麼200就報錯!!!急
package com.ljq.utils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class RedisAPI {
private static JedisPool pool = null;
static int count = 0;
public static JedisPool getPool() {
if (pool == null) {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxActive(1000);
config.setMaxIdle(5);
config.setMaxWait(1000 * 100);
config.setTestOnBorrow(true);
pool = new JedisPool(config, "192.168.1.123", 6379);
}
return pool;
}
public static void returnResource(JedisPool pool, Jedis redis) {
if (redis != null) {
pool.returnResource(redis);
}
}
public static String get(String key){
String value = null;
try {
JedisPool pool = null;
Jedis jedis = null;
try {
pool = getPool();
jedis = pool.getResource();
value = jedis.get(key);
} catch (Exception e) {
pool.returnBrokenResource(jedis);
e.printStackTrace();
} finally {
returnResource(pool, jedis);
}
} catch (Exception e) {
// TODO: handle exception
}
return value;
}
public static String set(String key,String contents){
String value = null;
try {
JedisPool pool = null;
Jedis jedis = null;
try {
pool = getPool();
jedis = pool.getResource();
value = jedis.set(key,contents);
} catch (Exception e) {
pool.returnBrokenResource(jedis);
e.printStackTrace();
} finally {
returnResource(pool, jedis);
}
} catch (Exception e) {
// TODO: handle exception
}
return value;
}
public static void main(String[] args) {
try {
for(int i = 0;i<200;i++){
new Thread( new Runnable() {
public void run() {
System.out.println(set("age","100"));//也可以get(key)
System.out.println("---------------------:"+(++count));
}
}).start();
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
==========================================================================
現在報異常::
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
at redis.clients.util.Pool.getResource(Pool.java:22)
at com.ljq.utils.RedisAPI.set(RedisAPI.java:61)
at com.ljq.utils.RedisAPI$1.run(RedisAPI.java:82)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.util.NoSuchElementException: Could not create a validated object, cause: ValidateObject failed
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1191)
at redis.clients.util.Pool.getResource(Pool.java:20)
... 3 more
我不知道為什麼我配置的執行緒池的1000,怎麼200就報錯!!!急
相關文章
- 關於Redis的幾件小事 | 高併發和高可用Redis
- 關於redis的幾件小事(五)redis保證高併發以及高可用Redis
- [併發程式設計]-關於 CAS 的幾個問題程式設計
- 關於Java併發程式設計的總結和思考Java程式設計
- Redis Primer(1)基於JedisPool的Redis hset併發效能測試Redis
- 基於redis實現的鎖(用於控制nodejs的併發)RedisNodeJS
- Oracle EBS 基於Host併發程式的開發Oracle
- 關於RedisRedis
- Sql最佳化(三) 關於oracle的併發SQLOracle
- 一次併發處理過程, 基於 RedisRedis
- Redis在.net中的使用(6)Redis併發鎖Redis
- 關於Java高併發程式設計你需要知道的“升段攻略”Java程式設計
- 關於Redis的常識Redis
- Redis-高併發篇Redis
- Redis如何防止高併發?Redis
- IOS學習總結(1)——關於併發iOS
- 併發程式設計——synchronized關鍵字的使用程式設計synchronized
- 關於Java併發多執行緒的一點思考Java執行緒
- 關於如何提高Web服務端併發效率的非同步程式設計技術Web服務端非同步程式設計
- 關於 API 合併的問題API
- 不要將Actors用於併發程式設計程式設計
- 關於高併發和分散式中的冪等處理分散式
- 關於資料庫事務併發的理解和處理資料庫
- 常用的Redis客戶端的併發模型(轉)Redis客戶端模型
- 關於PHP高併發搶購系統設計PHP
- 更簡的併發程式碼,更強的併發控制
- Redis實現併發阻塞鎖方案Redis
- 關於壓力測試中 TPS 和併發數的思考
- 關於下載檔案過大,併發也很高的時候?
- 併發程式設計之——讀鎖原始碼分析(解釋關於鎖降級的爭議)程式設計原始碼
- Java併發程式設計volatile關鍵字Java程式設計
- java併發程式設計——volatile關鍵字Java程式設計
- java併發程式設計:volatile關鍵字Java程式設計
- 關於SAP abap程式開發的說明
- 關於redis單執行緒的分析Redis執行緒
- 關於Redis的一些小問題Redis
- 基於執行緒與基於事件的併發程式設計之爭執行緒事件程式設計
- 關於redis的幾件小事(二)redis執行緒模型Redis執行緒模型