|
@@ -164,6 +164,14 @@ public class RedisUtils implements ApplicationContextAware {
|
|
"if redis.call('MSETNX', unpack(args)) == 1 then for i = 1, #KEYS do " +
|
|
"if redis.call('MSETNX', unpack(args)) == 1 then for i = 1, #KEYS do " +
|
|
"redis.call('EXPIRE', KEYS[i], ARGV[#ARGV]) end return 1 else return 0 end";
|
|
"redis.call('EXPIRE', KEYS[i], ARGV[#ARGV]) end return 1 else return 0 end";
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Redis批量设置字典脚本(如果成功则更新过期时间)
|
|
|
|
+ */
|
|
|
|
+ private static final String HMSET_WITH_DURATION_SCRIPT =
|
|
|
|
+ "local args = {} table.insert(args, KEYS[1]) for i = 2, #KEYS do table.insert(args, KEYS[i]) " +
|
|
|
|
+ "table.insert(args, ARGV[i]) end local result = redis.call('HMSET', unpack(args)) " +
|
|
|
|
+ "if result[1] == false then return 0 else return redis.call('EXPIRE', KEYS[1], ARGV[1]) end";
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* Redis连接工厂
|
|
* Redis连接工厂
|
|
*/
|
|
*/
|
|
@@ -670,6 +678,34 @@ public class RedisUtils implements ApplicationContextAware {
|
|
return Boolean.TRUE.equals(template.execute(script, keys, values));
|
|
return Boolean.TRUE.equals(template.execute(script, keys, values));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 批量设置带过期时间的字典值
|
|
|
|
+ *
|
|
|
|
+ * @param template Redis操作模版实例
|
|
|
|
+ * @param key 字典标识
|
|
|
|
+ * @param mapping 键/值映射表
|
|
|
|
+ * @param duration 有效时间
|
|
|
|
+ * @param <K> 键类型
|
|
|
|
+ * @return true/false
|
|
|
|
+ */
|
|
|
|
+ public static <K> boolean hmset(@NonNull RedisTemplate<K, ?> template, @NonNull K key,
|
|
|
|
+ @NonNull Map<K, ?> mapping, @NonNull Duration duration) {
|
|
|
|
+ if (CollectionUtils.isEmpty(mapping)) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ int i = 0;
|
|
|
|
+ List<K> keys = Lists.newArrayListWithCapacity(mapping.size() + 1);
|
|
|
|
+ keys.add(key);
|
|
|
|
+ Object[] values = new Object[mapping.size() + 1];
|
|
|
|
+ values[i++] = duration.getSeconds();
|
|
|
|
+ for (Map.Entry<K, ?> entry : mapping.entrySet()) {
|
|
|
|
+ keys.add(entry.getKey());
|
|
|
|
+ values[i++] = entry.getValue();
|
|
|
|
+ }
|
|
|
|
+ RedisScript<Boolean> script = new DefaultRedisScript<>(HMSET_WITH_DURATION_SCRIPT, Boolean.class);
|
|
|
|
+ return Boolean.TRUE.equals(template.execute(script, keys, values));
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 数字自增1,如果键不存在则对值初始化
|
|
* 数字自增1,如果键不存在则对值初始化
|
|
*
|
|
*
|