Jedis
Jedis Client是Redis官网推荐的一个面向java客户端,库文件实现了对redis各类API进行封装调用。redis通信协议是Redis客户端与Redis Server之间交流的语言,它规定了请求和返回值的格式。redis-cli与server端使用一种专门为redis设计的协议RESP(Redis Serialization Protocol)交互,Resp本身没有指定TCP,但redis上下文只使用TCP连接。
前期准备
jar包的下载:
jedis.jar
common-poll.jar
服务器的配置
如果你不是在linux本机运行jedis,需要做如下配置才能进行远程访问:
1、让防火墙运行远程访问6379端口;首先通过vim /etc/sysconfig/iptables打开配置文件,按下图进行修改,然后通过service iptables restart重启防火墙;
2、在redis.conf中注释掉默认本机IP和关闭redis的拒绝远程访问的保护模式;
测试联通
创建项目导入jar包之后创建测试程序:
public class TestRedis {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Jedis jedis=new Jedis("192.168.206.128", 6379);
System.out.println(jedis.ping());
}
}
结果返回pong即测试通过;
常用的API
对不同数据类型的操作,和linux下的命令名称和参数一致;
String类型:
Hash类型:
List类型:
public class TestList {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Jedis jedis=new Jedis("192.168.206.128", 6379);
jedis.lpush("mylist", "a","b","c");
jedis.lpush("mylist", "1","2","3");
jedis.rpush("mylist1", "a","b","c");
jedis.rpush("mylist1", "1","2","3");
ArrayList<String> str1=(ArrayList<String>) jedis.lrange("mylist", 0, 5);
ArrayList<String> str2=(ArrayList<String>) jedis.lrange("mylist1", 0, -1);
System.out.println(str1+"------"+str2);
jedis.lpop("mylist");
jedis.rpop("mylist1");
ArrayList<String> str3=(ArrayList<String>) jedis.lrange("mylist", 0, 5);
ArrayList<String> str4=(ArrayList<String>) jedis.lrange("mylist1", 0, -1);
System.out.println(str3+"------"+str4);
jedis.lpush("mylist2", "1","2","3","1","2","3","1","2","3");
System.out.println(jedis.lrange("mylist2", 0, -1));
jedis.lrem("mylist2", 2, "3");
System.out.println(jedis.lrange("mylist2", 0, -1));
jedis.lrem("mylist2", -2, "1");
System.out.println(jedis.lrange("mylist2", 0, -1));
jedis.lrem("mylist2", 0, "2");
System.out.println(jedis.lrange("mylist2", 0, -1));
jedis.lset("mylist2", 0, "xxx");
System.out.println(jedis.lrange("mylist2", 0, -1));
jedis.linsert("mylist2", LIST_POSITION.BEFORE, "xxx", "aaa");
System.out.println(jedis.lrange("mylist2", 0, -1));
jedis.linsert("mylist2", LIST_POSITION.AFTER, "xxx", "bbb");
System.out.println(jedis.lrange("mylist2", 0, -1));
System.out.println(jedis.lrange("mylist", 0, -1));
System.out.println(jedis.lrange("mylist1", 0, -1));
jedis.rpoplpush("mylist", "mylist1");
System.out.println(jedis.lrange("mylist", 0, -1));
System.out.println(jedis.lrange("mylist1", 0, -1));
jedis.rpoplpush("mylist", "mylist");
System.out.println(jedis.lrange("mylist", 0, -1));
System.out.println(jedis.llen("mylist"));
}
}
Set类型:
public class TestSet {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Jedis jedis=new Jedis("192.168.206.128", 6379);
jedis.sadd("myset", "a","b","c");
System.out.println(jedis.smembers("myset"));
jedis.sadd("myset", "a");
System.out.println(jedis.smembers("myset"));
jedis.srem("myset", "a");
System.out.println(jedis.smembers("myset"));
System.out.println(jedis.sismember("myset", "a"));
System.out.println(jedis.sismember("myset", "b"));
jedis.sadd("my1", "a","b","c");
jedis.sadd("my2", "a","b","d");
System.out.println(jedis.smembers("my1")+"-----"+jedis.smembers("my2"));
System.out.println(jedis.sdiff("my1","my2"));
System.out.println(jedis.sdiff("my2","my1"));
System.out.println(jedis.sinter("my1","my2"));
System.out.println(jedis.sunion("my1","my2"));
jedis.sdiffstore("mya", "my1","my2");
jedis.sinterstore("myb", "my1","my2");
jedis.sunionstore("myc", "my1","my2");
System.out.println(jedis.smembers("mya")+"-----"+jedis.smembers("myb")+"------"+jedis.smembers("myc"));
System.out.println(jedis.scard("mya"));
System.out.println(jedis.srandmember("myc"));
System.out.println(jedis.srandmember("myc"));
System.out.println(jedis.srandmember("myc"));
System.out.println(jedis.srandmember("myc"));
}
}
Sorted-set类型:
public class TestZSet {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Jedis jedis=new Jedis("192.168.206.128", 6379);
jedis.zadd("mysort", 30d, "zs");
jedis.zadd("mysort", 40d, "ls");
Map<Double,String> map=new HashMap<Double,String>();
map.put(50d, "ww");
map.put(60d, "ll");
map.put(70d, "qq");
map.put(80d, "bb");
map.put(90d, "jj");
map.put(101d, "dd");
jedis.zadd("mysort", map);
System.out.println(jedis.zscore("mysort", "dd"));
System.out.println(jedis.zrange("mysort", 0, -1));
System.out.println(jedis.zrevrange("mysort", 0, -1));
System.out.println(jedis.zrangeWithScores("mysort", 0, -1));
System.out.println(jedis.zrangeByScoreWithScores("mysort", 0, 100));
System.out.println(jedis.zcard("mysort"));
jedis.zrem("mysort", "zs","ls");
System.out.println(jedis.zrange("mysort", 0, -1));
jedis.zremrangeByRank("mysort", 0, 1);
System.out.println(jedis.zrange("mysort", 0, -1));
jedis.zremrangeByScore("mysort", 80d, 90d);
System.out.println(jedis.zrange("mysort", 0, -1));
System.out.println(jedis.zrangeWithScores("mysort", 0, -1));
jedis.zincrby("mysort", 9d, "qq");
System.out.println(jedis.zrange("mysort", 0, -1));
System.out.println(jedis.zrangeWithScores("mysort", 0, -1));
System.out.println(jedis.zcount("mysort", 0d, 101d));
}
}
通用的redis命令:
public class TestAll {
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
Jedis jedis=new Jedis("192.168.206.128", 6379);
System.out.println(jedis.keys("*"));
System.out.println(jedis.keys("my?"));
jedis.del("my1");
System.out.println(jedis.keys("*"));
System.out.println(jedis.exists("my1"));
System.out.println(jedis.exists("my2"));
jedis.rename("name", "newname");
System.out.println(jedis.get("name"));
System.out.println(jedis.get("newname"));
System.out.println(jedis.type("newname"));
System.out.println(jedis.type("myhash"));
System.out.println(jedis.type("mylist"));
System.out.println(jedis.type("myset"));
System.out.println(jedis.type("mysort"));
jedis.expire("newname", 20);
Thread.sleep(7000);
System.out.println(jedis.ttl("newname"));
System.out.println(jedis.ttl("mylist"));
Thread.sleep(13000);
System.out.println(jedis.ttl("newname"));
jedis.select(1);
System.out.println(jedis.keys("*"));
jedis.select(0);
System.out.println(jedis.keys("*"));
jedis.move("mylist", 1);
jedis.select(1);
System.out.println(jedis.keys("*"));
}
}
事务
我们将模拟正常提交,正常回滚和watch监控情况下正常执行和发生异常的情况:
主从复制
我们可以通过JavaAPI设置主从关系,但正常生产环境下会先Linux下配置好主从关系;
JedisPoll
线程池应该是单例的,所以我们可以手写一个线程池的工具类来模拟这个过程,实际开发中会有已经封装好的API让我们调用不需要我们自己写;
JedisPollUtil:
public class JedisPollUtil {
private static volatile JedisPool jedisPoll=null;
public static JedisPool getInstance(){
if(null==jedisPoll){
synchronized (JedisPollUtil.class) {
if(null==jedisPoll){
JedisPoolConfig poolConfig=new JedisPoolConfig();
poolConfig.setMaxActive(1000);
poolConfig.setMaxIdle(20);
poolConfig.setMaxWait(100*1000);
poolConfig.setTestOnBorrow(true);
jedisPoll=new JedisPool(poolConfig,"192.168.206.128", 6379);
}
}
}
return jedisPoll;
}
public static void release(JedisPool jedisPoll,Jedis jedis){
if(null!=jedis){
jedisPoll.returnBrokenResource(jedis);
}
}
}
测试结果: