Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions redis-template-tool-acl/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

<groupId>com.netease.lowcode</groupId>
<artifactId>redis-template-tool-acl</artifactId>
<version>2.0.0</version>
<version>2.1.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
Expand All @@ -20,6 +20,11 @@


<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<artifactId>nasl-metadata-collector</artifactId>
<groupId>com.netease.lowcode</groupId>
Expand All @@ -41,7 +46,12 @@
<artifactId>spring-data-redis</artifactId>
<version>2.4.1</version>
</dependency>

<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.47</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,10 @@
@Configuration
public class RedisConfig {
/**
* redis配置类型1.url 2.单机 3.sentinel(不支持高版本redis服务端) 4.cluster
* redis配置类型1.url 2.单机 3.sentinel(不支持高版本redis服务端) 4.cluster,默认单机
*/

@NaslConfiguration(defaultValue = {@Environment(type = EnvironmentType.DEV, value = "1"),
@Environment(type = EnvironmentType.ONLINE, value = "1")})
@NaslConfiguration(defaultValue = {@Environment(type = EnvironmentType.DEV, value = "2"),
@Environment(type = EnvironmentType.ONLINE, value = "2")})
@Value("${redisMode}")
public String redisMode;
/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,29 @@
package com.netease.lib.redistemplatetool.util;

import com.alibaba.fastjson2.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.netease.lowcode.core.annotation.NaslLogic;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.*;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.text.Collator;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;


@Component
@Component("libraryRedisToolAcl")
public class RedisTool {
private static final Logger logger = LoggerFactory.getLogger("LCAP_EXTENSION_LOGGER");

@Autowired
public RedisTemplate<String, String> redisTemplate;
private ObjectMapper mapper = new ObjectMapper();

/**
* 是否存在key,返回true/false
Expand Down Expand Up @@ -83,6 +91,173 @@ public Long removesFromSet(String key, List<String> values) {
return setOperations.remove(key, values.toArray());
}

/**
* 将多个键值对设置到 Redis 哈希表中,并返回更新后的哈希表。
*
* @param hashKey 哈希表的键
* @param keyValueMap 包含要设置到 Redis 哈希表中的键值对的 Map
* @return 是否更新成功
*/
@NaslLogic
public Boolean setHashValuesReturnBoolean(String hashKey, Map<String, String> keyValueMap) {
HashOperations<String, String, String> ops = redisTemplate.opsForHash();
for (Map.Entry<String, String> entry : keyValueMap.entrySet()) {
ops.put(hashKey, entry.getKey(), entry.getValue());
}
return true;
}

/**
* 删除 Redis 哈希表中指定的域
*
* @param hashKey 哈希表的 key
* @param fieldKey 要删除的域
* @return 被删除的域的数量
*/
@NaslLogic
public Long deleteHashfieldKey(String hashKey, String fieldKey) {
HashOperations<String, String, String> ops = redisTemplate.opsForHash();
return ops.delete(hashKey, fieldKey);
}

/**
* 获取hashKey中limit条数据
*
* @param hashKey 数据结构类型
* @param limit 获取的条数(默认为最大值)
* @param keywordValue 搜索关键字,可空。根据值的中文排序。
* @param keywordName 搜索字段,可空。当数据为多层时,用.分隔。
* @return
*/
@NaslLogic
public List<String> getHashTopN(String hashKey, Integer limit, String keywordValue, String keywordName) {
if (limit == null || limit == 0) {
limit = Integer.MAX_VALUE;
}
List<String> allList = new ArrayList<>();
try {
allList = redisTemplate.<String, Object>opsForHash().values(hashKey).stream().limit(Integer.MAX_VALUE).map(value -> value != null ? value.toString() : "").collect(Collectors.toList());
} catch (Exception e) {
logger.error("redis:{}获取错误:", hashKey, e);
}
if (StringUtils.isEmpty(keywordValue) || StringUtils.isEmpty(keywordName)) {
return allList;
} else {
return allList.stream().filter(json -> {
try {
JSONObject jsonObject = mapper.readValue(json, JSONObject.class);
String nameValue = getKeywordValue(keywordName, jsonObject);
return !StringUtils.isEmpty(nameValue) && nameValue.contains(keywordValue);
} catch (Exception e) {
logger.error("json转换错误", e);
return false;
}
}).sorted((json1, json2) -> {
try {
// 创建中文拼音排序器
Collator collator = Collator.getInstance(Locale.CHINA);
// 获取两个json对象的中文名
JSONObject jsonObject1 = mapper.readValue(json1, JSONObject.class);
String name1 = getKeywordValue(keywordName, jsonObject1);
JSONObject jsonObject2 = mapper.readValue(json2, JSONObject.class);
String name2 = getKeywordValue(keywordName, jsonObject2);
// 使用Collator比较中文名
return collator.compare(name1, name2);
} catch (Exception e) {
logger.error("name对比错误", e);
return 0;
}
}).limit(limit).collect(Collectors.toList());
}
}

private String getKeywordValue(String keywordName, JSONObject jsonObject) {
String[] keywordNames = keywordName.split("\\.");
String nameValue;
if (keywordNames.length > 1) {
JSONObject keywordJsonObject = jsonObject;
for (int i = 0; i < keywordNames.length - 1; i++) {
String name = keywordNames[i];
if (keywordJsonObject.containsKey(name)) {
keywordJsonObject = keywordJsonObject.getJSONObject(name);
} else {
break;
}
}
nameValue = keywordJsonObject.getString(keywordNames[keywordNames.length - 1]);
} else {
nameValue = jsonObject.getString(keywordName);
}
return nameValue;
}

/**
* 获取hashKey中limit条数据
*
* @param hashKey 数据结构类型
* @param limit 获取的条数(默认为最大值)
* @param keywordMap <搜索关键字,搜索字段>。可空。搜索关键字,根据第一个值的中文排序。搜索字段,当数据为多层时,用.分隔。
* @return
*/
@NaslLogic
public List<String> getHashTopNByKeyMap(String hashKey, Integer limit, Map<String, String> keywordMap) {
if (limit == null || limit == 0) {
limit = Integer.MAX_VALUE;
}
List<String> allList = new ArrayList<>();
try {
allList = redisTemplate.<String, Object>opsForHash().values(hashKey).stream().limit(Integer.MAX_VALUE).map(value -> value != null ? value.toString() : "").collect(Collectors.toList());
} catch (Exception e) {
logger.error("redis:{}获取错误:", hashKey, e);
}
if (CollectionUtils.isEmpty(keywordMap)) {
return allList;
} else {
return allList.stream().filter(json -> {
try {
JSONObject jsonObject = mapper.readValue(json, JSONObject.class);
return keywordMap.entrySet().stream().allMatch(entry -> {
String jsonValue = getKeywordValue(entry.getKey(), jsonObject);
return !StringUtils.isEmpty(jsonValue) && jsonValue.contains(entry.getValue());
});
} catch (Exception e) {
logger.error("json转换错误", e);
return false;
}
}).sorted((json1, json2) -> {
try {
// 创建中文拼音排序器
Collator collator = Collator.getInstance(Locale.CHINA);
// 获取两个json对象的中文名
JSONObject jsonObject1 = mapper.readValue(json1, JSONObject.class);
String keywordName = keywordMap.entrySet().iterator().next().getKey();
String name1 = jsonObject1.getString(keywordName);
JSONObject jsonObject2 = mapper.readValue(json2, JSONObject.class);
String name2 = jsonObject2.getString(keywordName);
// 使用Collator比较中文名
return collator.compare(name1, name2);
} catch (Exception e) {
logger.error("name对比错误", e);
return 0;
}
}).limit(limit).collect(Collectors.toList());
}
}

/**
* 从 Redis 哈希表中获取键对应的值。
*
* @param hashKey 哈希表的键
* @param fieldKey 获取值的键
* @return 单条数据value
*/
@NaslLogic
public String getHashValue(String hashKey, String fieldKey) {
HashOperations<String, String, String> ops = redisTemplate.opsForHash();
return ops.get(hashKey, fieldKey);
}


/**
* 向集合中添加元素
*
Expand Down
Loading