ListOperations主要对redis 的list(链表)操作,下面我主要是讲一个具体的例子,将一个list集合如何多个值批量存储到缓存:
我们先看ListOperations的 leftPushAll这个方法的源码:它是用的 “V... values”;说明它是支持1-N个参数
/**
* Prepend {@code values} to {@code key}.
*
* @param key must not be {@literal null}.
* @param values
* @return {@literal null} when used in pipeline / transaction.
* @see <a href="http://redis.io/commands/lpush">Redis Documentation: LPUSH</a>
*/
@Nullable
Long leftPushAll(K key, V... values);
再看实现类:它用的是数组,那么我们传入数据就有两种方式了吧。
/*
* (non-Javadoc)
* @see org.springframework.data.redis.core.ListOperations#leftPushAll(java.lang.Object, java.lang.Object[])
*/
@Override
public Long leftPushAll(K key, V... values) {
byte[] rawKey = rawKey(key);
byte[][] rawValues = rawValues(values);
return execute(connection -> connection.lPush(rawKey, rawValues), true);
}
我们就可以用以下两种方式:
leftPushAll("users",new strings[]);
leftPushAll("users1",JsonUtil.toJson(user),JsonUtil.toJson(user1),JsonUtil.toJson(user2));
现在我们就来实现这个操作:1.我们先将list集合转化为数组,有人肯定会想到用asList这个方法,这里会出现一个错误,这是因为你list是一个集合,里面是存储的一个对象。所有asList这个方法是不行了,我们只能将对象转化为一个字符串。如下:
@Test
public void leftPushAll() {
List<User> list = new ArrayList<User>();
User user = new User();
user.setId("1");
user.setAge(11);
user.setName("张三1");
User user1 = new User();
user1.setId("2");
user1.setAge(12);
user1.setName("张三2");
User user2 = new User();
user2.setId("3");
user2.setAge(13);
user2.setName("张三3");
list.add(user);
list.add(user1);
list.add(user2);
String[] strings =new String[list.size()];
for (int i = 0; i < list.size(); i++) {
strings[i]=list.get(i).toString();
}
System.out.println(JsonUtil.toJson(strings));
ListOperations<String, String> operations = this.template.opsForList();
operations.leftPushAll("users",strings);
operations.leftPushAll("users1", JsonUtil.toJson(user),JsonUtil.toJson(user1),JsonUtil.toJson(user2));
System.out.println(operations.size("users"));
}
运行的结果:
/**
* @Title: range
* @Description: TODO(获取指定key的范围内的value值的 list列表。 (0 -1)返回所有值列表 )
* @param @param key
* @param @param start
* @param @param end
* @param @return 参数
* @return List<String> 返回类型
* @throws
*/
List<String> range(final String key, Long start, Long end);
/**
* @Title: trim
* @Description: TODO(保留key指定范围内的列表值。其它的都删除。)
* @param @param key
* @param @param start
* @param @param end
* @return void 返回类型
* @throws
*/
void trim(final String key, Long start, Long end);
/**
* @Title: size
* @Description: TODO(获取key 列表的长度)
* @param @param key
* @param @return 参数
* @return Long 返回类型
* @throws
*/
Long size(final String key);
/**
* @Title: leftPush
* @Description: TODO(写入缓存,是左面进入 先进后出)
* @param @param key
* @param @param value
* @param @return 参数
* @return Long 返回类型
* @throws
*/
public Long leftPush(final String key, String value);
/**
* @Title: leftPushAll
* @Description: TODO(多个值写入缓存,是左面进入 先进后出)
* @param @param key
* @param @param values
* @param @return 参数
* @return Long 返回类型
* @throws
*/
public Long leftPushAll(final String key, String... values);
/**
* @Title: leftPushIfPresent
* @Description: TODO(如果列表存在,则在列表左边插入值value)
* @param @param key
* @param @param value
* @param @return 参数
* @return Long 返回类型
* @throws
*/
Long leftPushIfPresent(final String key, String value);
/**
* @Title: leftPush
* @Description: TODO(在key的列表中指定的value左边(前面)插入一个新的value.如果 指定的value不存在则不插入任何值。)
* @param @param key
* @param @param pivot
* @param @param value
* @param @return 参数
* @return Long 返回类型
* @throws
*/
Long leftPush(final String key, String pivot, String value);
/**
* @Title: rightPush
* @Description: TODO(写入缓存,是右边面进入 先进先出)
* @param @param key
* @param @param value
* @param @return 参数
* @return Long 返回类型
* @throws
*/
Long rightPush(final String key, String value);
/**
* @Title: rightPushAll
* @Description: TODO(多个值写入缓存,是右边面进入 先进先出)
* @param @param key
* @param @param values
* @param @return 参数
* @return Long 返回类型
* @throws
*/
Long rightPushAll(final String key, String... values);
/**
* @Title: rightPushIfPresent
* @Description: TODO(如果列表存在,则在列表右边插入值value)
* @param @param key
* @param @param value
* @param @return 参数
* @return Long 返回类型
* @throws
*/
Long rightPushIfPresent(final String key, String value);
/**
* @Title: rightPush
* @Description: TODO(在key的列表中指定的value右边(前面)插入一个新的value.如果 指定的value不存在则不插入任何值。)
* @param @param key
* @param @param pivot
* @param @param value
* @param @return 参数
* @return Long 返回类型
* @throws
*/
Long rightPush(final String key, String pivot, String value);
/**
* @Title: set
* @Description: TODO(设置key列表中指定位置的值为value index不能大于列表长度。大于抛出异常,为负数则从右边开始计算)
* @param @param key
* @param @param index
* @param @param value 参数
* @return void 返回类型
* @throws
*/
void set(final String key, Long index, String value);
/**
* @Title: remove
* @Description: TODO(删除列表中第一个遇到的value值。count指定删除多少个,count为0则全部删除)
* @param @param key
* @param @param count (大于0从左边开始,等于0全部删除,小于0从右边开始)
* @param @param value
* @param @return 参数
* @return Long 返回类型
* @throws
*/
Long remove(final String key, Long count, Object value);
/**
* @Title: index
* @Description: TODO(通过索引获取列表中的元素)
* @param @param key
* @param @param index (大于0从左边开始,小于0从右边开始)
* @param @return 参数
* @return String 返回类型
* @throws
*/
String index(final String key, Long index);
/**
* @Title: leftPop
* @Description: TODO(移除列表中的第一个值,并返回该值)
* @param @param key
* @param @return 参数
* @return String 返回类型
* @throws
*/
String leftPop(final String key);
/**
* @Title: leftPop
* @Description: TODO(移除列表中的第一个值,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。)
* @param @param key
* @param @param timeout
* @param @param unit
* @param @return 参数
* @return String 返回类型
* @throws
*/
String leftPop(final String key, Long timeout, TimeUnit unit);
/**
* @Title: rightPop
* @Description: TODO(移除列表中的最后一个值,并返回该值)
* @param @param key
* @param @return 参数
* @return String 返回类型
* @throws
*/
String rightPop(final String key);
/**
* @Title: rightPop
* @Description: TODO(移除列表中的最后一个值,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。)
* @param @param key
* @param @param timeout
* @param @param unit
* @param @return 参数
* @return String 返回类型
* @throws
*/
String rightPop(final String key, Long timeout, TimeUnit unit);
/**
* @Title: rightPopAndLeftPush
* @Description: TODO(从指定列表中从右边(尾部)移除第一个值,并将这个值从左边(头部)插入目标列表)
* @param @param sourceKey
* @param @param destinationKey
* @param @return 参数
* @return String 返回类型
* @throws
*/
String rightPopAndLeftPush(final String sourceKey,final String destinationKey);
/**
* @Title: rightPopAndLeftPush
* @Description: TODO(从指定列表中从右边(尾部)移除第一个值,并将这个值从左边(头部)插入目标列表,如果移除的列表中没有值,则一直阻塞指定的单位时间)
* @param @param sourceKey
* @param @param destinationKey
* @param @param timeout
* @param @param unit
* @param @return 参数
* @return String 返回类型
* @throws
*/
String rightPopAndLeftPush(final String sourceKey, final String destinationKey, Long timeout, TimeUnit unit);
gitHub项目DEMO地址:https://github.com/LX1309244704/SpringBoot-master/tree/master/springboot-redis