MongoDB
获取mongo配置代码
package com.kingdee.mongo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@PropertySource(value={"classpath:common.properties"})
public class MongoConfig {
@Value("${mongo.host}")
private String host;
@Value("${mongo.port}")
private String port;
public String user;
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public String pass;
@Value("${mongo.dbname}")
private String database;
@Value("${mongo.maxConnect}")
public String maxConnect;
@Value("${mongo.maxWaitThread}")
public String maxWaitThread;
@Value("${mongo.maxTimeOut}")
public String maxTimeOut;
@Value("${mongo.maxWaitTime}")
public String maxWaitTime;
public String getDatabase() {
return database;
}
public void setDatabase(String database) {
this.database = database;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getPort() {
return port;
}
public void setPort(String port) {
this.port = port;
}
}
生成连接数据库实例代码
package com.kingdee.mongo;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import com.mongodb.DB;
import com.mongodb.MongoClient;
import com.mongodb.ServerAddress;
public class MongoFactory {
public static DB getMongoDB(String tag, String mongoHost, int mongoPort,String mongoDbName, String mongoUser, String mongoPassword) throws Exception {
List<ServerAddress> replicaSetSeeds = new ArrayList<ServerAddress>();
if (StringUtils.isNotEmpty(mongoHost) && !StringUtils.startsWith(mongoHost, "${") && mongoPort > 0) {
replicaSetSeeds.add(new ServerAddress(mongoHost, mongoPort));
}
DB db;
if (!replicaSetSeeds.isEmpty() && StringUtils.isNotEmpty(mongoDbName) && !StringUtils.startsWith(mongoDbName, "${")) {
MongoClient client = new MongoClient(replicaSetSeeds);
db = client.getDB(mongoDbName);
} else {
db = null;
}
return db;
}
}
构建客户端实例代码
package com.kingdee.mongo;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import com.kingdee.redis.JedisUtils;
import com.mongodb.DB;
import com.mongodb.DBCollection;
public class MongoDBClient {
private static Logger logger = LoggerFactory.getLogger(MongoDBClient.class);
@Autowired
private MongoConfig mongoConfig;
private static DB mongoDB;
protected void getMongoClient(){
try {
String mongoHost = mongoConfig.getHost();
String mongoPort = mongoConfig.getPort();
String mongoDbName = mongoConfig.getDatabase();
String mongoUser = mongoConfig.getUser();
String mongoPassword = mongoConfig.getPass();
mongoDB = MongoFactory.getMongoDB("data", mongoHost, Integer.valueOf(mongoPort),mongoDbName, mongoUser, mongoPassword);
} catch (Exception ignore) {
mongoDB = null;
logger.warn(ignore.getMessage(), ignore);
}
}
public DBCollection getCollection(String collectionName) {
if (mongoDB != null) {
return mongoDB.getCollection(collectionName);
}else{
getMongoClient();
return mongoDB.getCollection(collectionName);
}
}
protected void close() {
if (mongoDB != null) {
try {
mongoDB.getMongo().close();
} catch (Throwable ignore) {
}
}
mongoDB = null;
}
}
操作mongo数据代码
package com.kingdee.dao.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.TypeUtils;
import com.kingdee.mongo.MongoDBClient;
import com.kingdee.util.ThreadLocalLog;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.ReadPreference;
import com.mongodb.WriteResult;
import com.mongodb.util.JSON;
import net.sf.json.JSONObject;
public class BaseDao {
private static Logger logger = LoggerFactory.getLogger(BaseDao.class);
private Map<String, DBCollection> collections = new HashMap<String, DBCollection>();
private Lock lock = new ReentrantLock();
@Autowired
private MongoDBClient mongoDBClient;
/**默认都是从副本集操作数据
* @param collectionName
* @return
*/
public DBCollection getCollection(String collectionName) {
DBCollection collection = collections.get(collectionName);
if (collection == null) {
lock.lock();
try {
collection = collections.get(collectionName);
if (collection == null) {
collection = mongoDBClient.getCollection(collectionName);
if (collection != null) {
collection.setReadPreference(ReadPreference.secondaryPreferred());
collections.put(collectionName, collection);
}
}
} finally {
lock.unlock();
}
}
return collection;
}
DBObject findOne(String collectionName, String id) {
return findOne(collectionName, new BasicDBObject("_id", id), null, true);
}
DBObject findOne(String collectionName, DBObject query, DBObject orderBy, boolean secondary) {
return findOne(collectionName, query, null, orderBy, secondary);
}
DBObject findOne(String collectionName, DBObject query, DBObject fields, DBObject orderBy, boolean secondary) {
DBCollection collection = getCollection(collectionName);
if (collection == null) return null;
DBObject rtn = null;
long begin = System.currentTimeMillis();
try {
if (secondary) {
try {
rtn = collection.findOne(query, fields, orderBy);
} catch (Throwable ignore) {
logger.warn("findOne at secondary error! collection:" + collectionName + " query:" + query, ignore);
}
}
if (rtn == null) {
try {
rtn = collection.findOne(query, fields, orderBy, ReadPreference.primaryPreferred());
} catch (Throwable ignore) {
logger.warn("findOne at primary error! collection:" + collectionName + " query:" + query, ignore);
}
}
} finally {
long t = System.currentTimeMillis() - begin;
if (t > 100) {
logger.info("--"+"MongoDao.findOne"+"collection:"+collectionName+"query:"+query+"cost:"+t);
}
}
return rtn;
}
void removeById(String collectionName, String id) {
remove(collectionName, new BasicDBObject("_id", id));
}
void remove(String collectionName, DBObject query) {
DBCollection collection = getCollection(collectionName);
if (collection == null) return;
try {
collection.remove(query);
} catch (Throwable ignore) {
logger.warn("remove error! collection:" + collectionName + " query:" + query, ignore);
}
}
List<DBObject> findByIds(String collectionName, String... ids) {
if (ids == null || ids.length == 0) return null;
DBObject query = new BasicDBObject();
query.put("_id", new BasicDBObject("$in", ids));
return find(collectionName, query, null, 0, 0);
}
List<DBObject> find(String collectionName, DBObject query, DBObject orderBy, int skip, int limit) {
return find(collectionName, query, null, orderBy, skip, limit);
}
List<DBObject> find(String collectionName, DBObject query, DBObject keys, DBObject orderBy, int skip, int limit) {
DBCollection collection = getCollection(collectionName);
if (collection == null) return null;
DBCursor cursor = null;
List<DBObject> rtn = new ArrayList<DBObject>();
long begin = System.currentTimeMillis();
try {
cursor = collection.find(query, keys);
if (orderBy != null) cursor = cursor.sort(orderBy);
if (skip > 0) cursor = cursor.skip(skip);
if (limit > 0) cursor = cursor.limit(limit);
while (cursor.hasNext()) {
DBObject next = cursor.next();
if (next != null) rtn.add(next);
}
} catch (Throwable ignore) {
logger.warn("find error! collection:" + collectionName + " query:" + query, ignore);
} finally {
try {
if (cursor != null) cursor.close();
} catch (Throwable ignore) {
}
long t = System.currentTimeMillis() - begin;
if (t > 100) {
boolean b = ThreadLocalLog.addLog("--", "MongoDao.find", "collection:" + collectionName, "query:" + query, "skip:" + skip, "limit:" + limit, "cost:" + t);
if (!b) {
LoggerFactory.getLogger("Slow").info("MongoDao.find collection:{} query:{} skip:{} limit:{} cost:{}", collectionName, query, skip, limit, t);
}
}
}
return rtn;
}
boolean save(String collectionName, Object bean, String idKey) {
DBObject dbObject = covertToDBObject(bean, idKey);
return save(collectionName, dbObject);
}
boolean save(String collectionName, DBObject object) {
DBCollection collection = getCollection(collectionName);
if (collection == null) return false;
long begin = System.currentTimeMillis();
try {
collection.save(object);
return true;
} catch (Throwable ignore) {
logger.warn("save error! collection:" + collectionName + " object:" + object, ignore);
} finally {
long t = System.currentTimeMillis() - begin;
if (t > 100) {
boolean b = ThreadLocalLog.addLog("--", "MongoDao.save", "collection:" + collectionName, "object:" + object, "cost:" + t);
if (!b) {
LoggerFactory.getLogger("Slow").info("MongoDao.save collection:{} object:{} cost:{}", collectionName, object, t);
}
}
}
return false;
}
boolean update(String collectionName, DBObject query, DBObject object) {
DBCollection collection = getCollection(collectionName);
if (collection == null) return false;
long begin = System.currentTimeMillis();
try {
WriteResult result = collection.update(query, new BasicDBObject("$set", object));
return result != null && result.isUpdateOfExisting();
} catch (Throwable ignore) {
logger.warn("update error! collection:" + collectionName + " object:" + object, ignore);
} finally {
long t = System.currentTimeMillis() - begin;
if (t > 100) {
boolean b = ThreadLocalLog.addLog("--", "MongoDao.update", "collection:" + collectionName, "query:" + query, "object:" + object, "cost:" + t);
if (!b) {
LoggerFactory.getLogger("Slow").info("MongoDao.update collection:{} query:{} object:{} cost:{}", collectionName, query, object, t);
}
}
}
return false;
}
/**
*
* @param collectionName
* @param query 查询条件
* @param object 修改
* @param upsert 如果匹配不到记录,是否新增一条
* @param multi false 一次更新一条;true 更新匹配到的所有记录
* @return
*/
boolean batchUpdate(String collectionName, DBObject query, DBObject object, boolean upsert, boolean multi) {
DBCollection collection = getCollection(collectionName);
if (collection == null) return false;
long begin = System.currentTimeMillis();
try {
WriteResult result = collection.update(query, new BasicDBObject("$set", object), upsert, multi);
return result != null && result.isUpdateOfExisting();
} catch (Throwable ignore) {
logger.warn("update error! collection:" + collectionName + " object:" + object, ignore);
} finally {
long t = System.currentTimeMillis() - begin;
if (t > 100) {
boolean b = ThreadLocalLog.addLog("--", "MongoDao.update", "collection:" + collectionName, "query:" + query, "object:" + object, "cost:" + t);
if (!b) {
LoggerFactory.getLogger("Slow").info("MongoDao.update collection:{} query:{} object:{} cost:{}", collectionName, query, object, t);
}
}
}
return false;
}
long count(String collectionName) {
DBCollection collection = getCollection(collectionName);
if (collection == null) return 0L;
try {
return collection.count();
} catch (Throwable ignore) {
logger.warn("count error! collection:" + collectionName, ignore);
}
return 0L;
}
/**按照条件进行数量统计,从副本里面统计
* @param collectionName
* @param query
* @return
*/
long count(String collectionName, DBObject query) {
DBCollection collection = getCollection(collectionName);
if (collection == null) return 0L;
try {
return collection.count(query);
} catch (Throwable ignore) {
logger.warn("count error! collection:" + collectionName, ignore);
}
return 0L;
}
protected DBObject covertToDBObject(Object bean, String idKey) {
JSONObject jsonObject = JSONObject.fromObject(bean);
DBObject dbObject = new BasicDBObject();
for (Object key : jsonObject.keySet()) {
if (key == null || jsonObject.get(key)==null) continue;
dbObject.put(key.toString(), jsonObject.get(key));
}
if (org.apache.commons.lang.StringUtils.isNotEmpty(idKey)) {
Object id = dbObject.get(idKey);
dbObject.removeField(idKey);
dbObject.put("_id", id);
}
return dbObject;
}
/**
* 新增/修改
* @param collectionName
* @param query
* @param object
* @param upsert 如果记录不存在,是否新增一条记录
* @param multi 是否批量修改满足条件的记录
* @return
*/
boolean saveOrUpdate(String collectionName, DBObject query, Object bean, boolean upsert, boolean multi) {
DBCollection collection = getCollection(collectionName);
if (collection == null) return false;
DBObject object = covertToDBObject(bean, null);
long begin = System.currentTimeMillis();
try {
WriteResult result = collection.update(query, new BasicDBObject("$set", object), upsert, multi);
return result != null && result.isUpdateOfExisting();
} catch (Throwable ignore) {
logger.warn("saveOrUpdate error! collection:" + collectionName + " object:" + object, ignore);
} finally {
long t = System.currentTimeMillis() - begin;
if (t > 100) {
boolean b = ThreadLocalLog.addLog("--", "MongoDao.saveOrUpdate", "collection:" + collectionName, "query:" + query, "object:" + object, "cost:" + t);
if (!b) {
LoggerFactory.getLogger("Slow").info("MongoDao.saveOrUpdate collection:{} query:{} object:{} cost:{}", collectionName, query, object, t);
}
}
}
return false;
}
/**
* 删除字段
* @param collectionName
* @param query
* @param object
* @return
*/
boolean unset(String collectionName, DBObject query, DBObject object) {
DBCollection collection = getCollection(collectionName);
if (collection == null) return false;
long begin = System.currentTimeMillis();
try {
WriteResult result = collection.update(query, new BasicDBObject("$unset", object));
return result != null && result.isUpdateOfExisting();
} catch (Throwable ignore) {
logger.warn("unset error! collection:" + collectionName + " object:" + object, ignore);
} finally {
long t = System.currentTimeMillis() - begin;
if (t > 100) {
boolean b = ThreadLocalLog.addLog("--", "MongoDao.unset", "collection:" + collectionName, "query:" + query, "object:" + object, "cost:" + t);
if (!b) {
LoggerFactory.getLogger("Slow").info("MongoDao.unset collection:{} query:{} object:{} cost:{}", collectionName, query, object, t);
}
}
}
return false;
}
}
Redis
redis配置代码
package com.kingdee.redis;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
@PropertySource(value={"classpath:common.properties"})
public class RedisConfig {
@Value("${redis.host}")
private String host;
@Value("${redis.pool.active}")
private String maxactive;
@Value("redis.timeout")
private String timeout;
public String getTimeout() {
return timeout;
}
public void setTimeout(String timeout) {
this.timeout = timeout;
}
public String getMaxactive() {
return maxactive;
}
public void setMaxactive(String maxactive) {
this.maxactive = maxactive;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Value("${redis.password}")
private String password;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getPort() {
return port;
}
public void setPort(String port) {
this.port = port;
}
@Value("${redis.port}")
private String port;
}
操作redis数据代码
package com.kingdee.redis;
import java.lang.management.ManagementFactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import net.sf.json.JSONArray;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.exceptions.JedisConnectionException;
public class JedisUtils {
private static JedisPool pool = null;
private static Logger logger = LoggerFactory.getLogger(JedisUtils.class);
private static Lock lock = new ReentrantLock();
public static int retryNum = 3;//jedis重连次数
// 每个线程共享一个连接
private static ThreadLocal<Jedis> connWrapper = new ThreadLocal<Jedis>();
// 每个线程共享一个连接
private static ThreadLocal<Pipeline> pipelineWrapper = new ThreadLocal<Pipeline>();
@Autowired
private static RedisConfig redisConfig;
public static Jedis jedis() {
JedisPool pool = getJedisPool();
Jedis jedis = null;
try{
jedis = pool.getResource();
}catch(JedisConnectionException e){
if(jedis != null){
jedis.close();
}
logger.error("",e);
return null;
}
return jedis;
}
/**返回一个线程共用一个redis连接
* @return
*/
public static Jedis myClient() {
int count = 0;
Jedis jedis = null;
do {
try {
jedis = connWrapper.get();
if (jedis == null) {
jedis= jedis();
connWrapper.set(jedis);
}
} catch (JedisConnectionException e) {
// 出现链接异常的时候归还jedis
if(jedis != null){
jedis.close();
}
logger.error("",e);
try {
Thread.sleep(2000); //休眠2秒
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
} while (jedis == null && count < retryNum);
return jedis;
}
/**返回一个线程共用一个redis连接
* @return
*/
public static Pipeline myPipeline() {
int count = 0;
Pipeline pipeline = null;
do {
try {
pipeline = pipelineWrapper.get();
if (pipeline == null) {
pipeline= myClient().pipelined();
pipelineWrapper.set(pipeline);
}
} catch (Exception e) {
// 出现链接异常的时候归还jedis
if(pipeline != null){
pipeline.sync();
myClient().close();
}
logger.error("",e);
try {
Thread.sleep(2000); //休眠2秒
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
} while (pipeline == null && count < retryNum);
return pipeline;
}
/**
* 刷新管道数据,释放单线程redis管道连接
*/
public static void closePipelineConnection() {
Pipeline pipeline=pipelineWrapper.get();
if(pipeline!=null){
pipeline.sync();
}
Jedis jedis = connWrapper.get();
if (jedis != null) {
try {
jedis.close();
} catch (Exception e) {
logger.error("Can not close database connection", e);
}
// 释放掉保存的对象
pipelineWrapper.remove();
connWrapper.remove();
}
}
public static JedisPool getJedisPool() {
if (pool == null) {
lock.lock();
try{
if(pool == null){
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(Integer.valueOf(redisConfig.getMaxactive()));
if(StringUtils.isEmpty(redisConfig.getPassword())){
pool = new JedisPool(config, redisConfig.getHost(), Integer.valueOf(redisConfig.getPort()));
}else{
pool = new JedisPool(config,redisConfig.getHost(), Integer.valueOf(redisConfig.getPort()),
Integer.valueOf(redisConfig.getTimeout()),redisConfig.getPassword());
}
}
}catch(Exception e){
logger.error("",e);
}finally{
lock.unlock();
}
}
return pool;
}
public static long del(String[] keys){
Jedis jedis = null;
long ret = 0l;
try{
jedis = JedisUtils.jedis();
if(jedis != null){
long start = System.currentTimeMillis();
ret = jedis.del(keys);
logger.info("delete from redis cost:"+(System.currentTimeMillis()-start)+"ms ,key:"+StringUtils.join(keys,","));
}
}catch(Exception e){
logger.error("删除缓存失败,key:"+StringUtils.join(keys,","));
logger.error("删除缓存失败",e);
if(jedis != null){
jedis.close();//将连接失效,避免重用返回错误的对象
jedis = null;
}
}finally{
try{
if(jedis != null){
jedis.close();
}
}catch(Exception e){
logger.error("",e);
}
}
return ret;
}
public static List<String> mget(String[] keys){
Jedis jedis = null;
List<String> ret = new LinkedList<String>();
try{
jedis = JedisUtils.jedis();
if(jedis != null){
long start = System.currentTimeMillis();
ret = jedis.mget(keys);
logger.info("get from redis cost:"+(System.currentTimeMillis()-start)+"ms ,key:"+keys);
}
}catch(Exception e){
logger.error("获取缓存失败,key:"+keys);
logger.error("保存缓存失败",e);
if(jedis != null){
jedis.close();//将连接失效,避免重用返回错误的对象
jedis = null;
}
}finally{
try{
if(jedis != null){
jedis.close();
}
}catch(Exception e){
logger.error("",e);
}
}
return ret;
}
private static final String REDIS_POOL_JMX_PREFIX = "org.apache.commons.pool2:type=GenericObjectPool,name=pool1";
private static final String[] REDIS_POOL_JMX_ATTRS = {"NumActive","NumIdle","NumWaiters"};
/**
* key不存在则存储,存在不覆盖
*/
public static long setnx(String key,String value){
Jedis jedis = null;
long ret = 0;
try{
jedis = JedisUtils.jedis();
if(jedis != null){
ret = jedis.setnx(key, value);
}
}catch(Exception e){
logger.error("获取setnx数据失败,key:"+key,e);
if(jedis != null){
jedis.close();//将连接失效,避免重用返回错误的对象
jedis = null;
}
}finally{
try{
if(jedis != null){
jedis.close();
}
}catch(Exception e){
logger.error("",e);
}
}
return ret;
}
/**
* key不存在则存储,存在时不覆盖,使用时请特别注意:
* 此处的设置key和设置超时并不是一个统一的原子操作
* (如小概率事件:设置key成功了,但是设置超时失败了,此时会返回了成功:
* 因为如果返回了失败,由于key不会过期,所以后续调用setnx会一直失败),因此,
* 需要其它的辅佐手段检查key是否过期(如:key-value的value字段存放当前日期,
* 锁定时,检查日期字段,看锁是否过期等)
* @date 2015-11-25
* @author wenxiang_xu
*/
public static long setnx(String key,String value,int timeoutSeconds){
Jedis jedis = null;
long ret = 0;
try{
jedis = JedisUtils.jedis();
if(jedis != null){
ret = jedis.setnx(key, value);
if(ret==1){
jedis.expire(key, timeoutSeconds);
}
}
}catch(Exception e){
logger.error("获取setnx数据失败,key:"+key,e);
if(jedis != null){
jedis.close();//将连接失效,避免重用返回错误的对象
jedis = null;
}
}finally{
try{
if(jedis != null){
jedis.close();
}
}catch(Exception e){
logger.error("",e);
}
}
return ret;
}
/**
* 删除key
*/
public static long del(String key){
Jedis jedis = null;
long ret = 0l;
try{
jedis = JedisUtils.jedis();
if(jedis != null){
ret = jedis.del(key);
}
}catch(Exception e){
logger.error("删除缓存失败,key:"+key);
logger.error("删除缓存失败",e);
if(jedis != null){
jedis.close();;//将连接失效,避免重用返回错误的对象
jedis = null;
}
}finally{
try{
if(jedis != null){
jedis.close();;
}
}catch(Exception e){
logger.error("",e);
}
}
return ret;
}
/**
* 与getFromCache一致
*/
public static String get(String key){
Jedis jedis = null;
String ret = null;
try{
jedis = JedisUtils.jedis();
if(jedis != null){
ret = jedis.get(key);
}
}catch(Exception e){
logger.error("获取get数据失败,key:"+key,e);
if(jedis != null){
jedis.close();;//将连接失效,避免重用返回错误的对象
jedis = null;
}
}finally{
try{
if(jedis != null){
jedis.close();;
}
}catch(Exception e){
logger.error("",e);
}
}
return ret;
}
/**
* 从redis队列尾部取值
* @param key
* @param start: 起始index,可以为负值,如果是负值,则是从尾部开始计算,-1为尾部第一个
* @param end: 结束的index,可以为负值,如果是负值,则是从尾部开始计算
* @return
*/
public static List<String> lrange(String key,int start,int end){
Jedis jedis = null;
List<String> ret = new ArrayList<String>();
try{
jedis = JedisUtils.jedis();
if(jedis != null){
ret = jedis.lrange(key,start,end);
}
}catch(Exception e){
logger.error("lrange失败",e);
if(jedis != null){
jedis.close();//将连接失效,避免重用返回错误的对象
jedis = null;
}
}finally{
try{
if(jedis != null){
jedis.close();
}
}catch(Exception e){
logger.error("",e);
}
}
return ret;
}
}