Jedis实现多种功能总结
Jedis是Redis的java版本的客户端,利用Jedis可以简单的实现许多功能。
一、 Pipeline
官方的说明:
starts a pipeline,which is a very efficient way to send lots of command and read all the responses when you finish sending them。
简单点说pipeline适用于批处理。当有大量的操作需要一次性执行的时候,可以用管道。
示例:
Jedis jedis = new Jedis(String, int);
Pipeline p=jedis.pipelined();
p.set(key,value);//每个操作都发送请求给redis-server
p.get(key,value);
p.sync();//这段代码获取所有的response
二、 分布式的锁实现
使用场景,随着访问量和数据量的增加,程序都开始实现集群、分布式部署,即同样的程序在不同的机器上部署多份。那么如何保证数据的同步呢?如何实现统一控制呢?基于redis我们可以实现一个分布式锁来处理以上问题。
1. 通过jedis.setnx(key,value)实现
public boolean lock(longtimeout) {long nano =System.nanoTime();
timeout*=ONE_MILLI_NANOS;try{while ((System.nanoTime() - nano)
jedis.expire(key, EXPIRE);
locked= true;returnlocked;
}//短暂休眠,nano避免出现活锁
Thread.sleep(3, r.nextInt(500));
}
}catch(Exception e) {
}return false;
}
2. 通过事务(multi)实现
public boolean lock_2(longtimeout) {long nano =System.nanoTime();
timeout*=ONE_MILLI_NANOS;try{while ((System.nanoTime() - nano)
Transaction t=jedis.multi();//开启事务,当server端收到multi指令//会将该client的命令放入一个队列,然后依次执行,知道收到exec指令
t.getSet(key, LOCKED);
t.expire(key, EXPIRE);
String ret= (String) t.exec().get(0);if (ret == null || ret.equals("UNLOCK")) {return true;
}//短暂休眠,nano避免出现活锁
Thread.sleep(3, r.nextInt(500));
}
}catch(Exception e) {
}return false;
}
3. 通过事务+监听实现
public boolean lock_3(longtimeout) {long nano =System.nanoTime();
timeout*=ONE_MILLI_NANOS;try{while ((System.nanoTime() - nano)
jedis.watch(key);//开启watch之后,如果key的值被修改,则事务失败,exec方法返回null
String value =jedis.get(key);if (value == null || value.equals("UNLOCK")) {
Transaction t=jedis.multi();
t.setex(key, EXPIRE, LOCKED);if (t.exec() != null) {return true;
}
}
jedis.unwatch();//短暂休眠,nano避免出现活锁
Thread.sleep(3, r.nextInt(500));
}
}catch(Exception e) {
}return false;
}
三、 Redis分布式
当数据量或访问压力达到单台机器极限时,我们必须考虑集群部署,使用分片技术,将数据分散到多个机器上去。
Jedis实现了客户端的分片技术,同时也可以操作Redis-cluster服务端的分片技术。
--------------------------------------------------------------------------慢慢了解!