使用Jedis操作Redis-使用Java语言在客户端操作---List类型

  在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是4294967295。
  1   /**
  2      * List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样。我们可以在其头部(left)和尾部(right)添加新的元素。
  3      * 在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除
  4      * @throws Exception
  5      */
  6     @Test
  7     public void testList() throws Exception {
  8         //在指定Key所关联的List Value的头部插入参数中给出的所有Values,返回插入的value值的个数
  9         Long lpushResult = jedis.lpush("lmykey", "a","b","c","d");//插入顺序是先插入a,然后插入b,之后插入c,最后插入c
 10         System.out.println(lpushResult);//[d,c,b,a]
 11         
 12         //取从位置0开始到位置2结束的3个元素。
 13         List<String> lrangeResult = jedis.lrange("lmykey", 0, 2);//[d, c, b]
 14         
 15         //取链表中的全部元素,其中0表示第一个元素,-1表示最后一个元素。
 16         List<String> lrangeResult1 = jedis.lrange("lmykey", 0, -1);//[d, c, b, a]
 17         
 18         //插入元素,相当于追加。lmykey2键此时并不存在,因此该命令将不会进行任何操作,其返回值为0。
 19         Long lrangeRestult = jedis.lpushx("lmykey2", "e");//0
 20         
 21         //mykey键此时已经存在,所以该命令插入成功,并返回链表中当前元素的数量。
 22         Long lrangeResult2 = jedis.lpushx("lmykey", "e");//5
 23         
 24         //获取该键的头部元素
 25         System.out.println(jedis.lrange("lmykey", 0, 0));;//[e]
 26         
 27         
 28         //=======================>
 29         //插入元素
 30         jedis.lpush("lmykey2", "a","b","c","d");
 31         
 32         //弹出一个元素,返回弹出的那个元素
 33         String lrangeResult4 = jedis.lpop("lmykey2");//d
 34         
 35         //在执行lpop命令1次后,链表头部的1个元素已经被弹出,此时链表中元素的数量是3
 36         //计算链表还有几个元素
 37         Long lrangeResult5 = jedis.llen("lmykey2");//3
 38         
 39         
 40         //=========》
 41         jedis.lpush("lmykey3", "a","b","c","d","a","c");        
 42         
 43         //从头部(left)向尾部(right)变量链表,删除2个值等于a的元素,返回值为实际删除的数量。
 44         Long lrangeResult6 = jedis.lrem("lmykey3", 2, "a");//2
 45         
 46         System.out.println(jedis.lrange("lmykey3", 0, -1));;//[c, d, c, b]
 47         
 48         //获取索引值为1(头部的第二个元素)的元素值. 索引是从0开始计数的
 49         String lindexValue = jedis.lindex("lmykey3", 1);//d
 50         
 51         //索引值6超过了链表中元素的数量,该命令返回null。
 52         String lindexValue7 = jedis.lindex("lmykey3", 6);//null
 53         
 54         //将索引值为1(头部的第二个元素)的元素值设置为新值e。  如果成功,返回值为ok。
 55         String lset = jedis.lset("lmykey3", 1, "e");//ok
 56         
 57         //查看是否设置成功
 58         System.out.println(jedis.lindex("lmykey3", 1));//
 59         
 60         List<String> lrange = jedis.lrange("lmykey3", 0, -1);//[c, e, c, b]
 61         
 62         //设置的索引值6超过了链表中元素的数量,设置失败,该命令返回错误信息
 63         String lset8 = jedis.lset("lmykey3", 6, "hh");
 64         //错误信息为:redis.clients.jedis.exceptions.JedisDataException: ERR index out of range
 65 
 66         //仅保留索引值0到2之间的3个元素,注意第0个和第2个元素均被保留。
 67         String ltrim = jedis.ltrim("lmykey3", 0, 2);
 68         System.out.println(jedis.lrange("lmykey3", 0, -1));//[c, e, c]
 69         
 70         //=======================>
 71         jedis.lpush("lmykey4", "a","b","c","d");
 72         //在a的前面插入新元素a1。
 73         Long linsert = jedis.linsert("lmykey4", LIST_POSITION.BEFORE, "a", "a1");
 74         System.out.println(jedis.lrange("lmykey4", 0, -1));//[d, c, b, a1, a]
 75         
 76         //在a的后面插入新元素a1,从返回结果表示插入之后该链表一共有几个元素。如果在不存在的元素之前或之后插入新元素,该命令操作失败,并返回-1。
 77         Long linsert9 = jedis.linsert("lmykey4", LIST_POSITION.AFTER, "a", "a1");
 78         System.out.println(linsert9);//6
 79         System.out.println(jedis.lrange("lmykey4", 0, -1));//[d, c, b, a1, a, a1]
 80         
 81         //为不存在的Key插入新元素,该命令操作失败,返回0。
 82         Long linsert10 = jedis.linsert("lmykey123", LIST_POSITION.AFTER, "a", "a2");
 83         System.out.println(linsert10);//0
 84         
 85         
 86         //========>>
 87         //从链表的尾部插入参数中给出的values,插入顺序是从右到左依次插入。
 88         jedis.rpush("rmykey", "a","b","c","d");
 89         System.out.println(jedis.lrange("rmykey", 0, -1));//[a, b, c, d]
 90         
 91         //该键已经存在并且包含4个元素,rpushx命令将执行成功,并将元素e插入到链表的尾部,返回插入成功之后该链表总共有几个元素。
 92         Long rpushx = jedis.rpushx("rmykey", "e");
 93         System.out.println(jedis.lrange("rmykey", 0, -1));//[a, b, c, d, e]
 94         
 95         //由于rmykey2键并不存在,因此该命令不会插入数据,其返回值为0。
 96         Long rpushx11 = jedis.rpushx("rmykey2", "e");
 97         System.out.println(rpushx11);//0
 98         
 99         //将rmykey的尾部元素e弹出,同时再插入到rmykey2的头部(原子性的完成这两步操作)。
100         String rpoplpush = jedis.rpoplpush("rmykey", "rmykey2");
101         System.out.println(rpoplpush);//e
102         System.out.println(jedis.lrange("rmykey", 0, -1));//[a, b, c, d]
103         System.out.println(jedis.lrange("rmykey2", 0, -1));//[e]
104         
105         //将source和destination设为同一键,将mykey中的尾部元素移到其头部。
106         String rpoplpush12 = jedis.rpoplpush("rmykey", "rmykey");
107         System.out.println(jedis.lrange("rmykey", 0, -1));//[d, a, b, c]
108         
109         System.out.println("ok");
110         //关闭连接
111         jedis.close();
112     }