使用Jedis开发

除非特别说明,本文都采用仲裁模式

一、客户端连接仲裁模式redis

	/**
	 * 连接单机设置并获取值
	 */
	@Test
	public void setString(){
		Jedis jedis = new Jedis("redis://192.168.1.108:6379");
		jedis.set("foo", "bar");
		String value = jedis.get("foo");
		System.out.println(value);
	}

二、客户端连接集群模式redis

	/**
	 * 连接集群设置并获取值
	 */
	@Test
	public void setStringCluster(){
		Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
		//Jedis Cluster will attempt to discover cluster nodes automatically
		jedisClusterNodes.add(new HostAndPort("192.168.1.108", 7379));
		JedisCluster jc = new JedisCluster(jedisClusterNodes);
		jc.set("foo", "bar");
		String value = jc.get("foo");
		System.out.println(value);
	}

三、字符串数据类型

	Jedis jedis;
	@Before
	public void initRedis(){
		jedis = new Jedis("redis://192.168.1.108:6379");
	}
	
	@After
	public void closeRedis(){
		//注意不要使用jedis.shutdown(),这样会把服务器停掉。。。
		jedis.close();
	}

在后面的代码中这一段代码不在重复出现,默认每个测试类都包含了这段初始化和结束的代码,用来建立和关闭redis连接

	/**
	 * 字符串数据类型相关操作
	 */
	@Test
	public void StringOptions(){
		//设置值
		String r1 = jedis.set("goods:id", "1");
		System.out.println("r1="+r1);//返回值是添加是否成功的状态
		//获取值
		String r2 = jedis.get("goods:id");//返回值为key-value中的value
		System.out.println("r2="+r2);
		//删除值
		Long r3 = jedis.del("goods:id");
		System.out.println("r3="+r3);//返回值为删除元素个数
	}
	
	/**
	 * 字符串数据类型相关操作-扩展
	 */
	@Test
	public void StringOptionsExtends(){
		//新增十个商品,每个商品设置一个价格
		List<String> lGoodsId = new ArrayList<String>();
		for(int i=0;i<10;i++){
			//方式使数字型值自增1,除此以外redis还提供了指定长自增和自减的方法,详情可以查阅redis或者jedis api
			Long goodsId = jedis.incr("goods:id");	
			String key = "goods:"+goodsId+":price";
			lGoodsId.add(key);
			jedis.set(key, Integer.toString(100+i));
		}
		for(int i=0;i<lGoodsId.size();i++){
			System.out.println(lGoodsId.get(i)+"="+jedis.get(lGoodsId.get(i)));
		}
	}

四、散列数据类型

	@Test
	public void hashOptions(){
		//写到这里发现jedis方法和redis对应命令几乎是一模一样的,和redisson完全不同,可以参考jv.redis.datatype.string.RedisString.java中使用redisson写的代码
		jedis.hset("person:1", "name", "lucy");
		jedis.hset("person:1", "sex", "female");
		jedis.hset("person:1", "age", "23");
		/*通过散列类型,可以记录一个对象的多个属性,再使用后面的集合记录所有person,那么两种结构凑在一起就成了关系数据库中的一
		 * 张表,在利用后面讲到的sort命令可以实现关系数据库中的关联查询效果
		 */
		Map<String,String> person = jedis.hgetAll("person:1");
		System.out.println("person:1="+person);
		
		
		//jedis.hmset(key, hash);	一次设置多个值,其中hash是一个字段与值的Map
		//jedis.hmget(key, fields);	一次获取多个字段值,其中fields是多个String的可变参数
		//jedis.hkeys(key);			得到所有
		//jedis.hvals(key);			得多所有值
	}

五、列表数据类型

	/**
	 * 下面命令的中文解释请参考https://my.oschina.net/u/3049601/blog/1162577
	 */
	@Test
	public void listOptions(){
		jedis.del("person:id");
		jedis.lpush("person:id", "1", "2", "3","3", "2", "1");
		System.out.println("after lpush:"+jedis.lrange("person:id", 0, -1));
		
		jedis.rpush("person:id", "4", "5", "6","6", "5", "4");
		System.out.println("after rpush:"+jedis.lrange("person:id", 0, -1));
		
		System.out.println("lpop result:"+jedis.lpop("person:id"));
		System.out.println("after lpop:"+jedis.lrange("person:id", 0, -1));
		
		System.out.println("rpop result:"+jedis.rpop("person:id"));
		System.out.println("after rpop:"+jedis.lrange("person:id", 0, -1));
		
		System.out.println("person:id length="+jedis.llen("person:id"));
		
		System.out.println("lrem by left result:"+jedis.lrem("person:id", 1, "3"));
		System.out.println("after lrem by left:"+jedis.lrange("person:id", 0, -1));
		
		System.out.println("lrem by right result:"+jedis.lrem("person:id", -1, "5"));
		System.out.println("after lrem by right:"+jedis.lrange("person:id", 0, -1));
		
		jedis.linsert("person:id", LIST_POSITION.BEFORE, "6", "7");
		System.out.println("after linsert:"+jedis.lrange("person:id", 0, -1));
		
		jedis.ltrim("person:id", -2, -1);
		System.out.println("after ltrim:"+jedis.lrange("person:id", 0, -1));
	}
	
	/**
	 * 已经学习过散列和列表两种数据类型,现在可以写一段代码来存放一组对象及其属性
	 */
	@Test
	public void listOptionsExtends(){
		Long personId;
		String rPersonId;
		Map<String,String> personMap = new HashMap<String,String>();
		//为了测试方便,在每次程序启动的时候都把之前的元素删除,在实际编程中谨慎使用
		jedis.del("person:id");
		jedis.del("person:id:seq");
		
		//添加第一个人
		personId = jedis.incr("person:id:seq");
		rPersonId = "person:"+personId.toString();
		jedis.lpush("person:id", personId.toString());
		personMap.put("name", "lucy");
		personMap.put("sex","female");
		personMap.put("age","23");
		jedis.hmset(rPersonId,personMap);
		personMap.clear();
		
		//添加第二个人
		personId = jedis.incr("person:id:seq");
		rPersonId = "person:"+personId.toString();
		jedis.lpush("person:id", personId.toString());
		personMap.put("name", "hary");
		personMap.put("sex","male");
		personMap.put("age","25");
		jedis.hmset(rPersonId,personMap);
		personMap.clear();
		
		System.out.println(jedis.lrange("person:id", 0, -1));
		System.out.println(jedis.hgetAll("person:1"));
		System.out.println(jedis.hgetAll("person:2"));
	}

六、集合数据类型

	/**
	 * 下面命令的中文解释请参考https://my.oschina.net/u/3049601/blog/1162577
	 */
	@Test
	public void setOptions(){
		jedis.sadd("tag:person:sex:male", "hary");
		jedis.sadd("tag:person:sex:female", "lucy");
		System.out.println(jedis.smembers("tag:person:sex:female"));
		System.out.println(jedis.sunion("tag:person:sex:male","tag:person:sex:female"));
		/*
		jedis.sdiff();	//求差集
		jedis.sinter();	//求交集
		*/
		jedis.srem("tag:person:sex:female", "lucy");
		System.out.println(jedis.smembers("tag:person:sex:female"));
	}
	
	@Test
	public void setOptionsExtends(){
		jedis.sadd("tag:person:sex:male", "hary");
		jedis.sadd("tag:person:sex:female", "lucy");
		
		//在实际生产过程中,key的命名需要在不影响阅读的基础上尽可能的简化
		//我在这里为了好理解,就写全的了
		jedis.sadd("tag:person:profession:programmer", "hary");
		jedis.sadd("tag:person:profession:programmer", "lucy");
	}

七、有序集合数据类型

	@Test
	public void sortedSetOptions(){
		jedis.zadd("score:english",89, "lucy");
		jedis.zadd("score:english",89, "张三");
		jedis.zadd("score:english",90, "李四");
		jedis.zadd("score:english",91, "王五");
		jedis.zadd("score:english",92, "小六");
		jedis.zrem("score:english", "lucy");
		
		System.out.println(jedis.zrange("score:english", 0, 1));
		System.out.println(jedis.zrevrange("score:english", 0, 1));
		
		//Tuple对象的默认toString方法不会返回元素是字节,不是String,所以如果你需要返回的是String,那么需要继承Redis并重写zrangeWithScores方法
		Set<Tuple> st1 = jedis.zrangeWithScores("score:english", 0, 1);
		for(Tuple t:st1){
			System.out.println(t.getElement()+":"+t.getScore());
		}
		st1 = jedis.zrevrangeWithScores("score:english", 0, 1);
		for(Tuple t:st1){
			System.out.println(t.getElement()+":"+t.getScore());
		}
		//因为jedis的方法名和redis命令名称都一样,所以其他命令查看https://my.oschina.net/u/3049601/blog/1186376进一步了解
	}
	

八、Sort命令

	//因为sort命令复杂度,jedis在实现的时候使用了SortingParams类实现其各种可变选项,用代码着重讲一下
	public void initData(){
		Long personId;
		String rPersonId;
		Map<String,String> personMap = new HashMap<String,String>();
		//为了测试方便,在每次程序启动的时候都把之前的元素删除,在实际编程中谨慎使用
		jedis.del("person:id");
		jedis.del("person:id:seq");
		
		//添加第一个人
		personId = jedis.incr("person:id:seq");
		rPersonId = "person:"+personId.toString();
		jedis.lpush("person:id", personId.toString());
		personMap.put("name", "lucy");
		personMap.put("sex","female");
		personMap.put("age","23");
		jedis.hmset(rPersonId,personMap);
		personMap.clear();
		
		//添加第二个人
		personId = jedis.incr("person:id:seq");
		rPersonId = "person:"+personId.toString();
		jedis.lpush("person:id", personId.toString());
		personMap.put("name", "hary");
		personMap.put("sex","male");
		personMap.put("age","25");
		jedis.hmset(rPersonId,personMap);
		personMap.clear();
		
		//添加第三个人
		personId = jedis.incr("person:id:seq");
		rPersonId = "person:"+personId.toString();
		jedis.lpush("person:id", personId.toString());
		personMap.put("name", "volk");
		personMap.put("sex","male");
		personMap.put("age","24");
		jedis.hmset(rPersonId,personMap);
		personMap.clear();
	}
	@Test
	public void sortOptions(){
		initData();
		//对一个列表进行排序
		System.out.println(jedis.sort("person:id"));
		//根据每个人的年龄进行排序
		//下面的代码等于redis中这一命令行:sort person:id by person:*->age desc
		SortingParams sp = new SortingParams();
		sp.desc();
		sp.by("person:*->age");
		System.out.println(jedis.sort("person:id", sp));
		
		//根据每个人的年龄进行排序,返回每个人的所有属性,包括ID
		sp = new SortingParams();
		sp.desc();
		sp.by("person:*->age");
		sp.get("person:*->name","person:*->sex","person:*->age","#");
		System.out.println(jedis.sort("person:id", sp));
		
		//根据每个人的年龄进行排序,返回每个人的所有属性,包括ID,并将最终结果存储到key=person:temp:rlt中
		jedis.sort("person:id", sp,"person:temp:rlt");
		System.out.println("person:temp:rlt="+jedis.lrange("person:temp:rlt", 0, -1));
	}

 

转载于:https://my.oschina.net/u/3049601/blog/1359285

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值