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);
}
}