Spring Data Redis 教程

ListOperations 操作接口

ListOperations 操作接口定义了怎样操作 Redis 的 list 类型。在 RedisTemplate 中,可以通过 opsForList() 方法获取该操作接口。代码如下:

ListOperations<String,String> ops = redisTemplate.opsForList();

列表左边添加

可以通过 leftPush() 方法将指定的值添加到列表的左边。方法定义如下:

  • Long leftPush(K key, V value)  将值添加到指定键对应列表的左边

  • Long leftPush(K key, V pivot, V value)  将值添加到和 pivot 参数匹配元素的左边

  • Long leftPushAll(K key, Collection<V> values)  将指定的所有值批量添加到键对应列表的左边

  • Long leftPushAll(K key, V... values)  将指定的所有值批量添加到键对应列表的左边

  • Long leftPushIfPresent(K key, V value)  仅当列表存在时,才将值添加到键对应的列表的左边

示例:

ListOperations<String,String> ops = redisTemplate.opsForList();
// 从列表左边添加一个值
ops.leftPush("leftPush", "key1");
List<String> valList = ops.range("leftPush", 0, -1);
System.out.println("leftPush=" + Arrays.toString(valList.toArray()));

// 从列表左边添加多个值
ops.leftPushAll("leftPush", Arrays.asList("key2", "key3"));
valList = ops.range("leftPush", 0, -1);
System.out.println("leftPush=" + Arrays.toString(valList.toArray()));

// 如果 leftPush 键存在,则才将 key4值写入列表
ops.leftPushIfPresent("leftPush", "key4");
valList = ops.range("leftPush", 0, -1);
System.out.println("leftPush=" + Arrays.toString(valList.toArray()));

// 由于 leftPush2 键不存在,tmp-value 值不会写入列表
ops.leftPushIfPresent("leftPush2", "tmp-value");
valList = ops.range("leftPush2", 0, -1);
System.out.println("leftPush2=" + Arrays.toString(valList.toArray()));

// 在 key2 元素之前添加 insertKey 元素
ops.leftPush("leftPush", "key2", "insertKey");
valList = ops.range("leftPush", 0, -1);
System.out.println("leftPush=" + Arrays.toString(valList.toArray()));

运行示例,输出结果:

leftPush=[key1]
leftPush=[key3, key2, key1]
leftPush=[key4, key3, key2, key1]
leftPush2=[]
leftPush=[key4, key3, insertKey, key2, key1]

列表左边出栈

可以使用 leftPop() 方法将列表第一个元素删除,且返回该值。方法定义如下:

  • V leftPop(K key)  删除并返回存储在 key 的列表中的第一个元素。

  • V leftPop(K key, long timeout, TimeUnit unit)  从存储在 key 的列表中删除并返回第一个元素。注意:该操作将阻塞连接,直到元素可用或达到超时。

示例:

ListOperations<String,String> ops = redisTemplate.opsForList();
// 从列表左边添加一个值
ops.leftPushAll("leftPop", "key1", "key2", "key3");
List<String> valList = ops.range("leftPop", 0, -1);
System.out.println("leftPop=" + Arrays.toString(valList.toArray()));

// 返回列表第一个元素
String val1 = ops.leftPop("leftPop");
System.out.println("val1=" + val1);

String val2 = ops.leftPop("leftPop");
System.out.println("val2=" + val2);

运行示例,输出结果:

leftPop=[key3, key2, key1]
val1=key3
val2=key2

列表右边添加

可以通过 rightPush() 方法将指定的值添加到列表的右边。方法定义如下:

  • Long rightPush(K key, V value)  将值添加到键的列表右边

  • Long rightPush(K key, V pivot, V value)  将值添加到键的列表中指定值的前面

  • Long rightPushAll(K key, Collection<V> values)  将所有值添加到键的列表右边

  • Long rightPushAll(K key, V... values)  将所有值添加到键的列表右边

  • Long rightPushIfPresent(K key, V value)  只有当键存在时,才将值添加到列表的右边

示例:

List<String> results;
ListOperations<String,String> ops = redisTemplate.opsForList();
// 添加一个值到列表右边
ops.rightPush("rightPush", "value1");
results = ops.range("rightPush", 0, -1);
System.out.println("rightPush=" + Arrays.toString(results.toArray()));

// 添加多个值到列表右边
ops.rightPushAll("rightPush", "value2", "value3");
results = ops.range("rightPush", 0, -1);
System.out.println("rightPush=" + Arrays.toString(results.toArray()));

ops.rightPushAll("rightPush", Arrays.asList("value4", "value5"));
results = ops.range("rightPush", 0, -1);
System.out.println("rightPush=" + Arrays.toString(results.toArray()));

// 在 value3 值前面添加值 insertValue
ops.rightPush("rightPush", "value3", "insertValue");
results = ops.range("rightPush", 0, -1);
System.out.println("rightPush=" + Arrays.toString(results.toArray()));

// 键存在时,才将值添加到列表
ops.rightPushIfPresent("rightPush", "value6");
results = ops.range("rightPush", 0, -1);
System.out.println("rightPush=" + Arrays.toString(results.toArray()));

ops.rightPushIfPresent("rightPush2", "value1"); // 因为不存在,所以不添加
results = ops.range("rightPush2", 0, -1);
System.out.println("rightPush2=" + Arrays.toString(results.toArray()));

运行示例,输出结果:

rightPush=[value1]
rightPush=[value1, value2, value3]
rightPush=[value1, value2, value3, value4, value5]
rightPush=[value1, value2, value3, insertValue, value4, value5]
rightPush=[value1, value2, value3, insertValue, value4, value5, value6]
rightPush2=[]

列表右边出栈

可以使用 rightPop() 方法将列表最后一个元素删除,且返回该值。方法定义如下:

  • V rightPop(K key)  删除并返回存储在键的列表中的最后一个元素。

  • V rightPop(K key, long timeout, TimeUnit unit)  删除并返回存储在键的列表中的最后一个元素,允许指定超时时间。

  • V rightPopAndLeftPush(K sourceKey, K destinationKey)  从 sourceKey 的列表中删除最后一个元素,将其附加到 destinationKey 列表的头部并返回其值。

  • V rightPopAndLeftPush(K sourceKey, K destinationKey, long timeout, TimeUnit unit)  从 sourceKey 的列表中删除最后一个元素,将其附加到 destinationKey 列表的头部并返回其值,允许指定超时时间。

示例:

List<String> results;
ListOperations<String,String> ops = redisTemplate.opsForList();
// 准备数据
ops.rightPushAll("rightPop",
        "v1", "v2", "v3", "v4", "v5", "v6");
results = ops.range("rightPop", 0, -1);
System.out.println("rightPop=" + Arrays.toString(results.toArray()));

// 从右边弹出一个元素
String value1 = ops.rightPop("rightPop");
System.out.println("value1=" + value1);
results = ops.range("rightPop", 0, -1);
System.out.println("rightPop=" + Arrays.toString(results.toArray()));

// 从 rightPop 的列表中删除最后一个元素,将其附加到 rightPop2 列表的头部并返回其值
String value2 = ops.rightPopAndLeftPush("rightPop", "rightPop2");
System.out.println("value2=" + value2);

results = ops.range("rightPop", 0, -1);
System.out.println("rightPop=" + Arrays.toString(results.toArray()));

results = ops.range("rightPop2", 0, -1);
System.out.println("rightPop2=" + Arrays.toString(results.toArray()));

运行示例,输出结果:

rightPop=[v1, v2, v3, v4, v5, v6]
value1=v6
rightPop=[v1, v2, v3, v4, v5]
value2=v5
rightPop=[v1, v2, v3, v4]
rightPop2=[v5]

根据下标获取元素

前面介绍的 leftPop() 方法返回列表第一个元素,而 rightPop() 方法返回列表最后一个元素,而 index() 方法可以返回指定下标的元素。方法定义如下:

  • V index(K key, long index)  获取键对应列表中指定下标位置的值

示例:

ListOperations<String,String> ops = redisTemplate.opsForList();
// 准备数据
ops.leftPushAll("index", "key1", "key2", "key3");
List<String> valList = ops.range("index", 0, -1);
System.out.println("index=" + Arrays.toString(valList.toArray()));

// 返回下标为1的元素
String value = ops.index("index", 1);
System.out.println(value);

运行示例,输出结果:

index=[key3, key2, key1]
key2

根据范围获取元素

在前面的示例中,已经大量使用了 range() 行数,通过该函数一次性将整个列表取出来。方法定义如下:

  • List<V> range(K key, long start, long end)  从键的列表中获取 start 和 end 之间的元素。

示例:

List<String> valList;
ListOperations<String,String> ops = redisTemplate.opsForList();
// 准备数据
ops.leftPushAll("range", "key1", "key2", "key3", "key4", "key5", "key6");

// 获取列表所有元素
valList = ops.range("range", 0, -1);
System.out.println("range=" + Arrays.toString(valList.toArray()));

// 从列表获取3个元素,分别是 list[0]、list[1]、list[2]
valList = ops.range("range", 0, 2);
System.out.println("range=" + Arrays.toString(valList.toArray()));

// 从列表获取元素,除去 -1 即最后一个元素
valList = ops.range("range", 0, -2);
System.out.println("range=" + Arrays.toString(valList.toArray()));

运行示例,输出结果:

range=[key6, key5, key4, key3, key2, key1]
range=[key6, key5, key4]
range=[key6, key5, key4, key3, key2]

如果我们拥有如下列表:

[key6, key5, key4, key3, key2, key1]

它们的下标如下:

[0, 1, 2, 3, 4, 5]

[-6, -5, -4, -3, -2, -1]

也就是说:

 0=key6,  1=key5,  2=key4,  3=key3,  4=key2,  5=key1
-1=key1, -2=key2, -3=key3, -4=key4, -5=key5, -6=key6

删除元素

使用 remove 方法从指定键的列表中删除,方法定义如下:

  • Long remove(K key, long count, Object value)  从键列表中删除首次出现的 value 值,删除 count 个。

示例:

ListOperations<String,String> ops = redisTemplate.opsForList();
// 准备数据
ops.leftPushAll("remove",
        "key1", "key2", "key1-2", "key2", "key1-3", "key2");
List<String> valList = ops.range("remove", 0, -1);
System.out.println("remove=" + Arrays.toString(valList.toArray()));

// 在键的列表值中,从左到右删除两个 key2 值
ops.remove("remove", 2, "key2");
valList = ops.range("remove", 0, -1);
System.out.println("remove=" + Arrays.toString(valList.toArray()));

运行示例,输出结果:

remove=[key2, key1-3, key2, key1-2, key2, key1]
remove=[key1-3, key1-2, key2, key1]

设置列表值

使用 set() 方法允许我们对列表中指定的下标进行设置值。方法定义如下:

  • void set(K key, long index, V value)  将键的列表中指定下标的值设置为指定的值

示例:

List<String> results;
ListOperations<String,String> ops = redisTemplate.opsForList();
// 准备数据
ops.rightPushAll("set", "v1", "v2", "v3", "v4");
results = ops.range("set", 0, -1);
System.out.println("set=" + Arrays.toString(results.toArray()));

// 将列表下标为2的值设置为 new-value
ops.set("set", 2, "new-value");
results = ops.range("set", 0, -1);
System.out.println("set=" + Arrays.toString(results.toArray()));

运行示例,输出结果:

set=[v1, v2, v3, v4]
set=[v1, v2, new-value, v4]

获取列表大小

使用 size 方法可以获取指定键的列表的大小,方法定义如下:

  • Long size(K key)  获取存储在 key 的列表的大小

示例:

List<String> results;
ListOperations<String,String> ops = redisTemplate.opsForList();
// 准备数据
ops.rightPushAll("list", "v1", "v2", "v3", "v4");
results = ops.range("list", 0, -1);
System.out.println("list=" + Arrays.toString(results.toArray()));

// 获取列表大小
Long size = ops.size("list");
System.out.println("size = " + size);

运行示例,输出结果:

list=[v1, v2, v3, v4]
size = 4

修剪列表

可以使用 trim() 方法对键的列表进行修剪。方法定义如下:

  • void trim(K key, long start, long end)  修剪指定键的列表,列表只保留 start 到 end 之间的元素

示例:

List<String> results;
ListOperations<String,String> ops = redisTemplate.opsForList();
// 准备数据
ops.rightPushAll("list", "v1", "v2", "v3", "v4", "v5", "v6");
results = ops.range("list", 0, -1);
System.out.println("list=" + Arrays.toString(results.toArray()));

// 修剪列表
// 只留下列表中下标为 2、3、4 的元素
ops.trim("list", 2, 4);
results = ops.range("list", 0, -1);
System.out.println("list=" + Arrays.toString(results.toArray()));

运行示例,输出结果:

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