/**
* @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]
}