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]