No Regrets.

Jedis的使用教程

Posted on By Marin



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

测试结果:




有Marin的地方就有你的收获