Redis 列表是简单的字符串链接列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。一个列表最多可以包含 2^32 - 1 个元素 (4294967295, 每个列表超过 40 亿个元素)。下面将演示 jedis 如何操作 list:
从列表左边压栈(push)和出栈(pop),方法定义如下:
Long lpush(String key, String... strings) 将字符串(可多个)值添加到存储在键的列表的头部 (LPUSH)
Long lpushx(String key, String... string) 如果键的列表存在,则添加到列表首部;如果键的列表不存在,则不执行任何操作;
String lpop(String key) 原子地返回并删除列表的第一个(LPOP)元素
List<String> lpop(String key, int count) 原子地返回并删除户列表头部的 count 个元素
示例:
// 从列表左边push两个元素 jedis.lpush("list", "value1"); jedis.lpush("list", "value2"); List<String> values = jedis.lrange("list", 0, -1); System.out.println(Arrays.toString(values.toArray())); // 结果:[value2, value1] // 再次推送一个 jedis.lpush("list", "value0"); values = jedis.lrange("list", 0, -1); System.out.println(Arrays.toString(values.toArray())); // 结果:[value0, value2, value1] // 从列表左边弹出一个元素 String value = jedis.lpop("list"); System.out.println("value=" + value); // 结果:value=value0 // 将一个值插入到已存在的列表头部,列表不存在时操作无效 jedis.lpushx("list", "first value"); values = jedis.lrange("list", 0, -1); System.out.println(Arrays.toString(values.toArray())); // 结果:[first value, value2, value1] jedis.lpushx("list2", "first value"); values = jedis.lrange("list2", 0, -1); System.out.println(Arrays.toString(values.toArray())); // 结果:[]
从列表右边压栈(push)和出栈(pop),方法定义如下:
Long rpush(String key, String... strings) 将字符串(可多个)值添加到存储在键的列表的尾部 (RPUSH)
Long rpushx(String key, String... string) 如果键的列表存在,则添加到列表尾部;如果键的列表不存在,则不执行任何操作;
String rpop(String key) 原子地返回并删除列表的最后一个(RPOP)元素
List<String> rpop(String key, int count) 原子地返回并删除列表的最后 count 个(RPOP)元素
String rpoplpush(String srckey, String dstkey) 从 srckey 列表的右边(尾部)出栈(pop)元素,然后元素添加到 dstkey 列表的左边(首部)
示例:
// 从列表右边push两个元素 jedis.rpush("list", "value1"); jedis.rpush("list", "value2"); List<String> values = jedis.lrange("list", 0, -1); System.out.println(Arrays.toString(values.toArray())); // 结果:[value1, value2] // 再次推送一个 jedis.rpush("list", "value0"); values = jedis.lrange("list", 0, -1); System.out.println(Arrays.toString(values.toArray())); // 结果:[value1, value2, value0] // 从列表右边弹出一个元素 String value = jedis.rpop("list"); System.out.println("value=" + value); // 结果:value=value0 // 将一个值插入到已存在的列表尾部,列表不存在时操作无效 jedis.rpushx("list", "last value"); values = jedis.lrange("list", 0, -1); System.out.println(Arrays.toString(values.toArray())); // 结果:[value1, value2, last value] jedis.rpushx("list2", "last value"); values = jedis.lrange("list2", 0, -1); System.out.println(Arrays.toString(values.toArray())); // 结果:[] // 从 list_src 列表右边弹出一个元素,弹出元素 push 到 list_dst 列表左边 jedis.lpush("list_src", "a", "b"); // [b, a] jedis.lpush("list_dst", "1", "2"); // [2, 1] jedis.rpoplpush("list_src", "list_dst"); values = jedis.lrange("list_src", 0, -1); System.out.println("list_src=" + Arrays.toString(values.toArray())); values = jedis.lrange("list_dst", 0, -1); System.out.println("list_dst=" + Arrays.toString(values.toArray())); // 结果: // list_src=[b] // list_dst=[a, 2, 1]
给列表指定的下标设置值,方法定义如下:
String lset(String key, long index, String value) 为键存储的列表的 index 下标设置新值
示例:
// 准备点数据 jedis.lpush("list", "value1"); jedis.lpush("list", "value2"); // 修改列表下标为0的元素为 new value jedis.lset("list", 0, "new value"); // 获取列表下标为 0 的元素 String value = jedis.lindex("list", 0); System.out.println("value=" + value); // 结果:value=new value
根据下标从列表中取值,方法定义如下:
String lindex(String key, long index) 返回存储在指定键的列表中的指定元素。
示例:
// 准备点数据 jedis.lpush("list", "value1"); jedis.lpush("list", "value2"); // 获取列表下标为 0 的元素 String value = jedis.lindex("list", 0); System.out.println("value=" + value); // 结果:value=value2
将元素插入到指定元素的前面或者后面,方法定义如下:
Long linsert(String key, ListPosition where, String pivot, String value) 将指定的 value 插入到 key 列表中 pivot 元素的前面或者后面。ListPosition.AFTER 之后, ListPosition.BEFORE 之前。
示例:
// 准备点数据 jedis.lpush("list", "value1"); jedis.lpush("list", "value2"); // 将 # 插入到 value1 元素前面 jedis.linsert("list", ListPosition.BEFORE, "value1", "#"); List<String> values = jedis.lrange("list", 0, -1); System.out.println(Arrays.toString(values.toArray())); // 结果:[value2, #, value1] // 将 # 插入到 value1 元素后面 jedis.linsert("list", ListPosition.AFTER, "value1", "@"); values = jedis.lrange("list", 0, -1); System.out.println(Arrays.toString(values.toArray())); // 结果:[value2, #, value1, @]
根据列表下标范围从列表中获取元素,方法定义如下:
List<String> lrange(String key, long start, long stop) 返回 key 列表中 start 到 stop 之间的元素
示例:
// 准备点数据 jedis.rpush("list", "1", "2", "3", "4", "5", "6"); // 获取列表所有数据 List<String> values = jedis.lrange("list", 0, -1); System.out.println(Arrays.toString(values.toArray())); // 结果:[1, 2, 3, 4, 5, 6] // 获取列表下标 0 ~ 2 的元素 values = jedis.lrange("list", 0, 2); System.out.println(Arrays.toString(values.toArray())); // 结果:[1, 2, 3]
获取列表长度,方法定义如下:
Long llen(String key) 获取 key 列表长度
示例:
// 准备点数据 jedis.rpush("list", "1", "2", "3", "4", "5", "6"); // 获取列表长度 long len = jedis.llen("list"); System.out.println("len=" + len); // 结果:len=6
从列表中删除元素,方法定义如下:
Long lrem(String key, long count, String value) 从列表中删除 value 元素,根据元素出现的顺序,删除 count 个元素。
示例:
// 准备点数据 jedis.rpush("list", "1", "2", "3", "4", "5", "6"); // 从列表删除一个元素 2 jedis.lrem("list", 1, "2"); List<String> values = jedis.lrange("list", 0, -1); System.out.println(Arrays.toString(values.toArray())); // 结果:[1, 3, 4, 5, 6]