jedis API接口批量处理包装(事务,管道,分布式锁,lua脚本,发布订阅)

import java.util.List;
import java.util.Map;
import java.util.Set;


import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.Transaction;


/** 

* @author : zhengrf1
* @date 创建时间:2017年7月11日 下午4:04:58 
* @version 1.0 
*/
public interface RedisDao {
/***********value为String的接口*************/
public String batchSetString(Jedis jedis,String[] keysvalues,boolean allowExist);
public List<String> batchGetString(Jedis jedis,String[] keys);
public long incrby(Jedis jedis,String key,long value);

/***********value为hash的接口*************/
public void batchSetHash(Jedis jedis,String key,Map<String, String> hash);
public List<String> batchGetHash(Jedis jedis,String key,String[]fields);
public Map<String, String> GetAllHash(Jedis jedis,String key,boolean scan);
public long incrbyHash(Jedis jedis,String key,String field, long value);


/***********value为List的接口*************/
public void batchPushList(Jedis jedis,String key, String[] values, String direction);
public List<Object> batchPopList(Jedis jedis,String key, String direction, long number);
public List<String> getList(Jedis jedis, String key, long start, long end);
public List<Object> batchModifyList(Jedis jedis, String key, long[] indexs, String[] values);

/***********value为Set的接口*************/
public long batchAddSet(Jedis jedis, String key, String[] values);
public Set<String> getAllSet(Jedis jedis, String key, boolean scan);
public long batchDeleteSet(Jedis jedis, String key, String[] values);

/***********value为Zset的接口************/
public long batchAddZset(Jedis jedis, String key, Map<String, Double> scoreMembers);
public Set<String> getZset(Jedis jedis, String key, long start, long end);
public long batchDeleteZset(Jedis jedis, String key, String[] values);

/***********键管理接口************/
public void renameKey(Jedis jedis, String key, String oldkey, String newkey);
public String typeKey(Jedis jedis, String key);
public void batchDeleteKey(Jedis jedis, String[] keys);
public void setExpireKey(Jedis jedis, String key, int seconds);
public Set<String> getAllKey(Jedis jedis, String pattern, boolean scan);

/***********数据库管理接口************/
public void selectDB(Jedis jedis, int dbIndex);
public void flushDB(Jedis jedis, int dbIndex);
public long sizeDB(Jedis jedis, int dbIndex);

/***********分布式锁管理接口************/
public boolean pessimisticLock(Jedis jedis, String lockKey, int expire);
public void unPessimisticLock(Jedis jedis, String lockKey);
public Transaction optimisticLock(Jedis jedis, String lockKey, int expire);
public void unOptimisticLock(Jedis jedis);

/***********管道管理接口************/
public Pipeline getPipeline(Jedis jedis);
public List<Object> synPipeline(Pipeline pipeline);

/***********lua管理接口************/
public Object evalLua(Jedis jedis, String script);
public Object evalshaLua(Jedis jedis, String sha);
public String loadLua(Jedis jedis, String script);

/***********发布订阅(消息队列)管理接口************/
public void publishQueue(Jedis jedis, String channel, String message);
public void subscribeQueue(Jedis jedis, String[] channels);
}



import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;


import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.ScanParams;
import redis.clients.jedis.ScanResult;
import redis.clients.jedis.Transaction;


/** 

* @author : zhengrf1
* @date 创建时间:2017年7月11日 下午4:23:13 
* @version 1.0 
* @parameter  
* @since  
* @return  
*/
public class RedisDaoImpl implements RedisDao {


/* @author : zhengrf1
* @date 创建时间:2017年7月11日 下午4:23:14 
* @see RedisDao#batchSetString(redis.clients.jedis.Jedis)
* @设置一个或多个value类型为String的键值对,并保证操作的原子性
* @param jedis为redis客户端类对象;keysvalues为key-value数组如:"name" "zrf" "age" "27" ..... 
* allowExist:true 允许key不存在 false 不允许key存在 有一个 在false情况下有一个key不满足条件则所有key-value设置失败 
* allowExist=flase情况下 成功返回1,失败返回0
*/
@Override
public String batchSetString(Jedis jedis,String[] keysvalues,boolean allowExist) {
// TODO Auto-generated method stub
if(allowExist){
return jedis.mset(keysvalues);
}else{
return String.valueOf(jedis.msetnx(keysvalues));
}
}


/* @author : zhengrf1
* @date 创建时间:2017年7月11日 下午4:40:56 
* @see RedisDao#batchGetString(redis.clients.jedis.Jedis, java.lang.String[])
* @获取一个或多个value类型为String的键值对,并保证操作的原子性
* @param jedis为redis客户端类对象;keys为key数组如:"name" "age"  .....
*/
@Override
public List<String> batchGetString(Jedis jedis, String[] keys) {
// TODO Auto-generated method stub
return jedis.mget(keys);
}


/* @author : zhengrf1
* @date 创建时间:2017年7月11日 下午5:21:33 
* @see RedisDao#incrby(redis.clients.jedis.Jedis, int)
* 增加或减去指定value值,保证操作原子性,返回修改后的值,增加则value设为正数,减去则value设为负数
*/
@Override
public long incrby(Jedis jedis,String key,long value) {
// TODO Auto-generated method stub
return jedis.incrBy(key, value);
}


/* @author : zhengrf1
* @date 创建时间:2017年7月11日 下午5:47:48 
* @see RedisDao#batchSetHash(redis.clients.jedis.Jedis)
* 设置value类型为hash的一个或多个字段,并保证操作的原子性
*/
@Override
public void batchSetHash(Jedis jedis,String key,Map<String, String> hash) {
// TODO Auto-generated method stub
jedis.hmset(key, hash);
}


/* @author : zhengrf1
* @date 创建时间:2017年7月11日 下午6:34:54 
* @see RedisDao#batchGetHash(redis.clients.jedis.Jedis, java.lang.String)
* 获取value类型为hash的一个或多个字段,并保证操作的原子性
*/
@Override
public List<String> batchGetHash(Jedis jedis, String key, String[]fields) {
// TODO Auto-generated method stub
return jedis.hmget(key, fields);
}


/* @author : zhengrf1
* @date 创建时间:2017年7月11日 下午6:41:05 
* @see RedisDao#GetAllHash(redis.clients.jedis.Jedis, java.lang.String)
* 获取value类型为hash的所有字段的信息,scan为true时表示分段扫描,用于value值是大Map,如果scan=true则不保证操作的原子性
*/
@Override
public Map<String, String> GetAllHash(Jedis jedis, String key, boolean scan) {
// TODO Auto-generated method stub
long cursor=0;
Map<String,String> map = new HashMap<String,String>();
if(scan == true){
do{


ScanResult<Entry<String, String>> result = jedis.hscan(key, String.valueOf(cursor));
cursor = Long.parseLong(result.getCursor());
Iterator<Entry<String, String>> iterator = result.getResult().iterator();
while(iterator.hasNext()){
map.put(iterator.next().getKey(),iterator.next().getValue());
}

}while(cursor>0);

return map;

}else{
return jedis.hgetAll(key);
}
}


/* @author : zhengrf1
* @date 创建时间:2017年7月11日 下午7:26:21 
* @see RedisDao#incrbyHash(redis.clients.jedis.Jedis, java.lang.String, java.lang.String)
* 增加或减去指定value值,保证操作原子性,返回修改后的值,增加则value设为正数,减去则value设为负数
*/
@Override
public long incrbyHash(Jedis jedis, String key, String field, long value) {
// TODO Auto-generated method stub
return jedis.hincrBy(key, field, value);

}


/* @author : zhengrf1
* @date 创建时间:2017年7月12日 上午10:40:17 
* @see RedisDao#pushList(redis.clients.jedis.Jedis, java.lang.String, java.lang.String, java.lang.String)
*/
@Override
public void batchPushList(Jedis jedis, String key, String[] values, String direction) {
// TODO Auto-generated method stub
if(direction.equals("left")){
jedis.lpush(key, values);
}else if(direction.equals("right")){
jedis.rpush(key, values);
}

}


/* @author : zhengrf1
* @date 创建时间:2017年7月12日 上午10:47:55 
* @see RedisDao#popList(redis.clients.jedis.Jedis, java.lang.String, java.lang.String[], java.lang.String)
* pop一个或多个值出队列,并用事务来保证操作的原子性
*/
@Override
public List<Object> batchPopList(Jedis jedis, String key, String direction, long number) {
// TODO Auto-generated method stub
if(direction.equals("left")){
Transaction multi = jedis.multi();
for(int i = 0; i < number; i++)
multi.lpop(key);

return multi.exec();
}
if(direction.equals("right")){
Transaction multi = jedis.multi();
for(int i = 0; i < number; i++)
multi.rpop(key);


return multi.exec();
}
return null;

}


/* @author : zhengrf1
* @date 创建时间:2017年7月12日 上午11:36:20 
* @see RedisDao#getList(redis.clients.jedis.Jedis, java.lang.String)
* 获取value类型为List的start到end范围内的数据,获取全部list则start=0,end=-1,如果要查询某个索引n则start=end=n
*/
@Override
public List<String> getList(Jedis jedis, String key,long start, long end) {
// TODO Auto-generated method stub
return jedis.lrange(key, start, end);
}


/* @author : zhengrf1
* @date 创建时间:2017年7月12日 上午11:42:11 
* @see RedisDao#modifyList(redis.clients.jedis.Jedis, java.lang.String)
* 修改list某个索引或多个索引的值,并用事务保证操作的原子性
*/
@Override
public List<Object> batchModifyList(Jedis jedis, String key, long[] indexs, String[] values) {
// TODO Auto-generated method stub
Transaction multi = jedis.multi();
for(int i =0 ; i<indexs.length; i++)
jedis.lset(key, indexs[i], values[i]);


return multi.exec();
}


/* @author : zhengrf1
* @date 创建时间:2017年7月12日 下午2:41:11 
* @see RedisDao#batchAddSet(redis.clients.jedis.Jedis, java.lang.String, java.lang.String[])
* set增加一个或多个元素,并返回减去重复后增加成功的元素数量
*/
@Override
public long batchAddSet(Jedis jedis, String key, String[] values) {
// TODO Auto-generated method stub
return jedis.sadd(key, values);
}


/* @author : zhengrf1
* @date 创建时间:2017年7月12日 下午2:49:39 
* @see RedisDao#GetAllSet(redis.clients.jedis.Jedis, java.lang.String, boolean)
*/
@Override
public Set<String> getAllSet(Jedis jedis, String key, boolean scan) {
// TODO Auto-generated method stub
if(scan == false){
return jedis.smembers(key);
}else if(scan == true){
long cursor=0;
Set<String> set = new HashSet<String>();

do{
ScanResult<String> result = jedis.sscan(key, String.valueOf(cursor));
set.addAll(result.getResult());
cursor = Long.parseLong(result.getCursor());
}while(cursor>0);

return set;
}
return null;
}


/* @author : zhengrf1
* @date 创建时间:2017年7月12日 下午3:21:30 
* @see RedisDao#batchDeleteSet(redis.clients.jedis.Jedis, java.lang.String, java.lang.String[])
*/
@Override
public long batchDeleteSet(Jedis jedis, String key, String[] values) {
// TODO Auto-generated method stub
return jedis.srem(key, values);
}


/* @author : zhengrf1
* @date 创建时间:2017年7月12日 下午3:29:37 
* @see RedisDao#batchAddZset(redis.clients.jedis.Jedis, java.lang.String, java.lang.String[])
*/
@Override
public long batchAddZset(Jedis jedis, String key, Map<String, Double> scoreMembers) {
// TODO Auto-generated method stub
return jedis.zadd(key, scoreMembers);
}


/* @author : zhengrf1
* @date 创建时间:2017年7月12日 下午3:39:06 
* @see RedisDao#getZset(redis.clients.jedis.Jedis, java.lang.String)
*/
@Override
public Set<String> getZset(Jedis jedis, String key, long start, long end) {
// TODO Auto-generated method stub
return jedis.zrange(key, start, end);
}


/* @author : zhengrf1
* @date 创建时间:2017年7月12日 下午3:47:20 
* @see RedisDao#batchDeleteZset(redis.clients.jedis.Jedis)
*/
@Override
public long batchDeleteZset(Jedis jedis, String key, String[] values) {
// TODO Auto-generated method stub
return jedis.zrem(key, values);
}


/* @author : zhengrf1
* @date 创建时间:2017年7月12日 下午4:05:09 
* @see RedisDao#renameKey(redis.clients.jedis.Jedis, java.lang.String)
*/
@Override
public void renameKey(Jedis jedis, String key, String oldkey, String newkey) {
// TODO Auto-generated method stub
jedis.rename(oldkey, newkey);
}


/* @author : zhengrf1
* @date 创建时间:2017年7月12日 下午4:08:11 
* @see RedisDao#typeKey(redis.clients.jedis.Jedis, java.lang.String)
*/
@Override
public String typeKey(Jedis jedis, String key) {
// TODO Auto-generated method stub
return jedis.type(key);
}


/* @author : zhengrf1
* @date 创建时间:2017年7月12日 下午4:09:53 
* @see RedisDao#deleteKey(redis.clients.jedis.Jedis, java.lang.String)
*/
@Override
public void batchDeleteKey(Jedis jedis, String[] keys) {
// TODO Auto-generated method stub
jedis.del(keys);
}


/* @author : zhengrf1
* @date 创建时间:2017年7月12日 下午4:18:35 
* @see RedisDao#setExpireKey(redis.clients.jedis.Jedis, java.lang.String)
*/
@Override
public void setExpireKey(Jedis jedis, String key, int seconds) {
// TODO Auto-generated method stub
jedis.expire(key, seconds);
}


/* @author : zhengrf1
* @date 创建时间:2017年7月12日 下午4:24:26 
* @see RedisDao#getAllKey(redis.clients.jedis.Jedis)
*/
@Override
public Set<String> getAllKey(Jedis jedis, String pattern, boolean scan) {
// TODO Auto-generated method stub
if(scan == false){
return jedis.keys(pattern);
}else{
long cursor = 0;
ScanParams params = new ScanParams().match(pattern);
Set<String> set = new HashSet<String>();

do{
ScanResult<String> result = jedis.scan(String.valueOf(cursor), params);
cursor = Long.parseLong(result.getCursor());
set.addAll(result.getResult());
}while(cursor>0);

return set;
}
}


/* @author : zhengrf1
* @date 创建时间:2017年7月12日 下午4:50:48 
* @see RedisDao#selectDB(redis.clients.jedis.Jedis, int)
*/
@Override
public void selectDB(Jedis jedis, int dbIndex) {
// TODO Auto-generated method stub
jedis.select(dbIndex);
}


/* @author : zhengrf1
* @date 创建时间:2017年7月12日 下午4:52:11 
* @see RedisDao#flushDB(redis.clients.jedis.Jedis, int)
* 清理指定dbIndex的数据库,如果dbIndex<0则清理所有数据库
*/
@Override
public void flushDB(Jedis jedis, int dbIndex) {
// TODO Auto-generated method stub
if(dbIndex >= 0){
jedis.select(dbIndex);
jedis.flushDB();
}else{
jedis.flushAll();
}
}


/* @author : zhengrf1
* @date 创建时间:2017年7月12日 下午5:00:44 
* @see RedisDao#sizeDB(redis.clients.jedis.Jedis, int)
*/
@Override
public long sizeDB(Jedis jedis, int dbIndex) {
// TODO Auto-generated method stub
jedis.select(dbIndex);
return jedis.dbSize();
}


/* @author : zhengrf1
* @date 创建时间:2017年7月12日 下午5:22:37 
* @see RedisDao#lock(redis.clients.jedis.Jedis, java.lang.String)
*/
@Override
public boolean pessimisticLock(Jedis jedis, String lockKey, int expire) {
// TODO Auto-generated method stub
if(jedis.setnx(lockKey, "1") ==1){
jedis.expire(lockKey, expire);
return true;
}else{
return false;
}
}


/* @author : zhengrf1
* @date 创建时间:2017年7月12日 下午5:45:55 
* @see RedisDao#unlock(redis.clients.jedis.Jedis, java.lang.String)
*/
@Override
public void unPessimisticLock(Jedis jedis, String lockKey) {
// TODO Auto-generated method stub
jedis.del(lockKey);
}


/* @author : zhengrf1
* @date 创建时间:2017年7月12日 下午7:17:14 
* @see RedisDao#optimisticLock(redis.clients.jedis.Jedis, java.lang.String, int)
*/
@Override
public Transaction optimisticLock(Jedis jedis, String lockKey, int expire) {
// TODO Auto-generated method stub
jedis.watch(lockKey);
Transaction multi = jedis.multi();
multi.set(lockKey, "1");
return multi;
}


/* @author : zhengrf1
* @date 创建时间:2017年7月12日 下午7:17:14 
* @see RedisDao#unOptimisticLock(redis.clients.jedis.Jedis, java.lang.String)
*/
@Override
public void unOptimisticLock(Jedis jedis) {
// TODO Auto-generated method stub
jedis.unwatch();
}


/* @author : zhengrf1
* @date 创建时间:2017年7月14日 上午10:40:34 
* @see RedisDao#getPipeline(redis.clients.jedis.Jedis)
* 获取管道,通过管道句柄批量执行多个命令操作,减少网络消耗,但不保证操作的原子性
*/
@Override
public Pipeline getPipeline(Jedis jedis) {
// TODO Auto-generated method stub
return jedis.pipelined();
}


/* @author : zhengrf1
* @date 创建时间:2017年7月14日 上午10:53:34 
* @see RedisDao#synPipeline(redis.clients.jedis.Pipeline)
*/
@Override
public List<Object> synPipeline(Pipeline pipeline) {
// TODO Auto-generated method stub
return pipeline.syncAndReturnAll();
}


/* @author : zhengrf1
* @date 创建时间:2017年7月14日 上午11:39:20 
* @see RedisDao#evalLua(redis.clients.jedis.Jedis)
* 使用lua脚本能满足减少网络时间消耗,线程安全,复杂逻辑等特点的操作,缺点是相对不够灵活
*/
@Override
public Object evalLua(Jedis jedis, String script) {
// TODO Auto-generated method stub
return jedis.eval(script);
}


/* @author : zhengrf1
* @date 创建时间:2017年7月14日 下午2:54:35 
* @see RedisDao#evalshaLua(redis.clients.jedis.Jedis, java.lang.String)
*/
@Override
public Object evalshaLua(Jedis jedis, String sha) {
// TODO Auto-generated method stub
return jedis.evalsha(sha);
}

/* @author : zhengrf1
* @date 创建时间:2017年7月14日 下午4:41:16 
* @see RedisDao#loadLua(redis.clients.jedis.Jedis, java.lang.String)
*/
@Override
public String loadLua(Jedis jedis, String script) {
// TODO Auto-generated method stub
return jedis.scriptLoad(script);
}


/* @author : zhengrf1
* @date 创建时间:2017年7月14日 下午3:50:36 
* @see RedisDao#publishQueue(redis.clients.jedis.Jedis, java.lang.String, java.lang.String)
*/
@Override
public void publishQueue(Jedis jedis, String channel, String message) {
// TODO Auto-generated method stub
jedis.publish(channel, message);
}


/* @author : zhengrf1
* @date 创建时间:2017年7月14日 下午3:52:59 
* @see RedisDao#subscribe(redis.clients.jedis.Jedis, java.lang.String)
*/
@Override
public void subscribeQueue(Jedis jedis, String[] channels) {
// TODO Auto-generated method stub
class MyJedisPubSub extends JedisPubSub{
public void onMessage(String channel, String message) {  
System.out.println(message);
   }  
}
MyJedisPubSub myJedisPubSub = new MyJedisPubSub();
jedis.subscribe(myJedisPubSub , channels);
}


}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值