Jedis 操作列表(List)

Redis 列表是简单的字符串链接列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。一个列表最多可以包含 2^32 - 1 个元素 (4294967295, 每个列表超过 40 亿个元素)。下面将演示 jedis 如何操作 list:

左PUSH/POP

从列表左边压栈(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

从列表右边压栈(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]
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号