/**
	 * @author jackson
	 * @date 2015-12-18 下午1:51:58
	 * @return void
	 */
	@Test
	public  void jedisList(){
		
		//lpush lrange ;lpush 当key 存在但不是列表类型时,返回一个错误  返回值: 执行LPUSH 命令后,列表的长度。 先进后出
		long n = jedis.lpush("jedisList", "a b c d e f".split(" "));
		List<String> jedisList = jedis.lrange("jedisList", 0, 8);
		System.out.println("jedisList 返回列表长度: "+ n +" 列表的值: "+jedisList);
		n = jedis.lpush("jedisList", "a b c d e f".split(" "));// 列表允许值有重复
		jedisList = jedis.lrange("jedisList", 0, 16);
		System.out.println("jedisList 返回列表长度: "+ n +" 列表的值: "+jedisList);
		
		//lpushx 只能push 一个值,向表头,当且仅当key 存在时,如果不存在则不做任何操作。
		jedis.lpush("jedisList1","11");
		jedis.lpush("jedisList1","12");
		n= jedis.lpushx("jedisList1","13");
		jedisList = jedis.lrange("jedisList1", 0, 20);
		System.out.println("jedisList 返回列表长度: "+ n +" 列表的值: "+jedisList);
		
		//lpop 移除头元素,返回头元素
		String top = jedis.lpop("jedisList");
		System.out.println(top);
		
		//llen返回列表key 的长度。 如果key 不存在,则key 被解释为一个空列表,返回0 . 如果key 不是列表类型,返回一个错误。
		n = jedis.llen("jedisList");
		System.out.println(n);
		
		n = jedis.llen("jedisList2");
		System.out.println(n);
		
		// linsert  向从表头开始遇到的第一个a 前面插入 before
		n= jedis.linsert("jedisList", LIST_POSITION.BEFORE, "a", "before");
		jedisList = jedis.lrange("jedisList", 0, 28);// [e, d, c, b, before, a, f, e, d, c, b, a]
		System.out.println("jedisList 返回列表长度: "+ n +" 列表的值: "+jedisList);
		n= jedis.linsert("jedisList", LIST_POSITION.AFTER, "a", "after");//  向从表头开始遇到的第一个a 后面插入 after
		jedisList = jedis.lrange("jedisList", 0, 28);
		System.out.println("jedisList 返回列表长度: "+ n +" 列表的值: "+jedisList);//[e, d, c, b, before, a, after, f, e, d, c, b, a]
		
		//lindex  下标从表头 记起 是从  0 开始,如果从表尾计  -1 表示最后一个元素 -2 表示倒数第二个
		String jedisStr = jedis.lindex("jedisList",9);
		System.out.println("返回jedisList 列表中 第9 个元素:"+jedisStr);
		 jedisStr = jedis.lindex("jedisList",-2);
		System.out.println("返回jedisList 列表中 第倒数第二个 个元素:"+jedisStr);
		
		//lrem  移除 指定数量(count)的 某个value  count > 0 从前面遍历, count < 0 从后面遍历 count = 0 移除所有
		// count > 0
		jedis.lpush("jedisList3", "a b c d e f a b c d e f a b c d e f a a a d f f".split(" "));// 先进后出的原则,
		jedis.lrem("jedisList3", 3, "a");// 从表头开始移除 3 个 a   先进后出的原则,表头应该是最后插入的一个元素,即f 
		List list = jedis.lrange("jedisList3", 0, 30);//返回值:[f, f, d, f, e, d, c, b, a, f, e, d, c, b, a, f, e, d, c, b, a]
		System.out.println("从表头开始移除 3 个 a 移除元素后返回的list: "+list);
		// count < 0
		jedis.lpush("jedisList4", "a b c d e f a b c d e f a b c d e f a a a d f f".split(" "));// 先进后出的原则,
		jedis.lrem("jedisList4", -3, "a");// 从表尾开始移除 3 个 a   先进后出的原则,表尾应该是最先插入的一个元素,即a
		list = jedis.lrange("jedisList4", 0, 30);//返回值: 
		System.out.println(" 从表尾开始移除 3 个 a 移除元素后返回的list: "+list);// 返回值: [f, f, d, a, a, a, f, e, d, c, b, f, e, d, c, b, f, e, d, c, b]
		// count = 0
		jedis.lpush("jedisList5", "a b c d e f a b c d e f a b c d e f a a a d f f".split(" "));// 先进后出的原则,
		jedis.lrem("jedisList5", 0, "a");// 移除所有的a
		list = jedis.lrange("jedisList5", 0, 30); 
		System.out.println("移除所有的a 移除元素后返回的list: "+list);// 返回值: [f, f, d, f, e, d, c, b, f, e, d, c, b, f, e, d, c, b]
		
		//lset 将key 对应的列表上原有index 位置上的index的值替换为新值
		jedis.lpush("jedisList6", "a b c d e f a b c d e f a b c d e f a a a d f f".split(" "));
		jedis.lset("jedisList6", 0, "lset");
		list = jedis.lrange("jedisList6", 0, 30); 
		System.out.println("在 index=0 的位置上lset 返回的list: "+list);//返回值:[lset, f, d, a, a, a, f, e, d, c, b, a, f, e, d, c, b, a, f, e, d, c, b, a]
		
		jedis.lpush("jedisList7", "a b c d e f a b c d e f a b c d e f a a a d f f".split(" "));
		jedis.lset("jedisList7", -1, "lset");
		list = jedis.lrange("jedisList7", 0, 30); // 注意: lrange 是前闭后闭型
		System.out.println("在 index=-1 的位置上lset 返回的list: "+list);//返回值:[f, f, d, a, a, a, f, e, d, c, b, a, f, e, d, c, b, a, f, e, d, c, b, lset]
		
		// ltrim  保留最新插入的 几条记录,其余的都删除
		jedis.lpush("jedisList8", "a b c d e f a b c d e f a b c d e f a a a d f f".split(" "));
		jedis.ltrim("jedisList8", 0, 5);// 只保留最新插入的六条记录,其余的都删除
		list = jedis.lrange("jedisList8", 0, 7); // 注意: lrange 是前闭后闭型
		System.out.println(" 只保留最新插入的六条记录,其余的都删除    返回的list: "+list);//返回值:[f, f, d, a, a, a]
		
		//rpop 移除并返回列表key的尾元素
		jedis.lpush("jedisList9", "a b c d e f a b c d e f a b c d e f a a a d f f".split(" "));
		String rpop = jedis.rpop("jedisList9");// 移除并返回列表key的尾元素
		list = jedis.lrange("jedisList9", 0, 27); // 注意: lrange 是前闭后闭型
		System.out.println("移除尾元素后   返回的list: "+list+" 返回移除的尾元素:"+rpop);//返回值: [f, f, d, a, a, a, f, e, d, c, b, a, f, e, d, c, b, a, f, e, d, c, b] 返回移除的尾元素:a
		
		//rpoplpush  移除 source 中的最后元素并返回,将返回的元素插入到列表destination 
		jedis.lpush("jedisList10", "a b c d e f".split(" "));
		jedis.lpush("jedisList11", "1 2 3 4 5 6".split(" "));
		jedis.rpoplpush("jedisList10", "jedisList11");
		List<String> sourelist = jedis.lrange("jedisList10", 0, 27);
		List<String> destinationlist = jedis.lrange("jedisList11", 0, 27);
		System.out.println("源list 弹出尾元素后的list:"+sourelist+" 插入源list的尾元素后的List:"+destinationlist);//返回值:源list 弹出尾元素后的list:[f, e, d, c, b] 插入源list的尾元素后的List:[a, 6, 5, 4, 3, 2, 1]

		//如果 source 和 destination是同一个列表,那就相当于将列表逆转
		jedis.lpush("jedisList12", "a b c d e f".split(" "));
		jedis.rpoplpush("jedisList12", "jedisList12");
		sourelist = jedis.lrange("jedisList12", 0, 27);
		System.out.println("同一个list执行 rpoplupsh操作后的返回的值:"+sourelist);//[a, f, e, d, c, b]  将尾元素 a 移到了 表头
		//如果source 列表不存在时  不执行任何操作,也不返回错误
		jedis.lpush("jedisList14", "a b c d e f".split(" "));
		jedis.rpoplpush("jedisList13", "jedisList14");
		sourelist = jedis.lrange("jedisList13", 0, 27);
		destinationlist = jedis.lrange("jedisList14", 0, 27);
		System.out.println("同一个list执行 rpoplupsh操作后的返回的值:"+sourelist+" "+destinationlist);
		//如果destinationlist 不存在   初始化 destinationlist 然后插入 sourelist 的尾元素
		jedis.lpush("jedisList15", "a b c d e f".split(" "));
		jedis.rpoplpush("jedisList15", "jedisList16");
		sourelist = jedis.lrange("jedisList15", 0, 27);
		destinationlist = jedis.lrange("jedisList16", 0, 27);
		System.out.println("同一个list执行 rpoplupsh操作后的返回的值:"+sourelist+" "+destinationlist);
		
		//rpush 将一个或多个值插入到列表表尾
		n = jedis.rpush("jedisListRpush1", "a b c d e f".split(" "));//列表存储顺序和插入顺序一致
		List<String> rpushList = jedis.lrange("jedisListRpush1", 0, n);
		System.out.println("rpush 将一个或多个值插入到列表表尾:"+rpushList);//rpush 将一个或多个值插入到列表表尾:[a, b, c, d, e, f]
		
		//rpushx  当且仅当key存在时执行此命令
		//key 存在
		n = jedis.rpushx("jedisListRpush1", "rpushx");
		List<String>  rpushxList = jedis.lrange("jedisListRpush1", 0, n);
		System.out.println("rpushx 将一个值插入到列表表尾:"+rpushxList);// rpushx 将一个值插入到列表表尾:[a, b, c, d, e, f, rpushx]
		//key 不存在
		n = jedis.rpushx("jedisListRpush2", "rpushx");
		rpushxList = jedis.lrange("jedisListRpush2", 0, n);
		System.out.println("rpushx 将一个值插入到列表表尾:"+rpushxList);// rpushx 将一个值插入到列表表尾:[]
		
		//blpop  brpop brpoplpush 这三个命令是阻塞用的
		jedis.lpush("jedisList20", "a b c d e f".split(" "));
//		jedis.lpush("jedisList21", "a b c d 1 1".split(" "));//按照顺序 遍历 如果 jedisList21为空 则弹出jedisList20 的头元素
		List blpopList = jedis.blpop(6," jedisList21 jedisList20".split(" "));//如果jedisListRpush2 为空则线程会一致阻塞在这块直到从另一个客户端插入一个值为止 6 秒为阻塞时间,如果为0 则表示无限阻塞
		System.out.println(blpopList);//返回值:[jedisList20, f]  

	}