原理:
使用Eval方法,在redis上面执行脚本,去匹配redis的小key下的value(这里是JSON串),能够匹配上条件的消息过滤出来。
其中key参数为hash结构的大key,i传入1即可,jsonCondition1、jsonCondition2、jsonCondition3表示的是查询小key下的velue的参数。
返回结果为value的json串,可以自行调整脚本。
package com.comleader.service;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.comleader.bean.JedisUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @Author: Daisen.Z
* @Date: 2023/4/23 11:25
* @Version: 1.0
* @Description:
*/
@Service
public class JedisService {
@Autowired
private JedisUtils jedisUtils;
// Lua脚本,用于查询Hash中的特定字段
String redisScript = "local keys = redis.call('hkeys', KEYS[1]) " +
"local res = {} " +
"for i=1,#keys do " +
" local value = redis.call('hget', KEYS[1], keys[i]) " +
" if value and string.find(value, ARGV[1]) and string.find(value, ARGV[2]) and string.find(value, ARGV[3]) then " +
" table.insert(res, value) " +
" end " +
"end " +
"return res";
// 至多支持三个参数查询
public List<String> evalValue(String key, int i, String jsonCondition1,String jsonCondition2,String jsonCondition3) {
if (ObjectUtil.isNull(jsonCondition2)){
jsonCondition2 = "";
}
if (ObjectUtil.isNull(jsonCondition3)){
jsonCondition3 = "";
}
Jedis jedis=jedisUtils.getJedis();
Object evalResult = jedis.eval(redisScript, 1, key, jsonCondition1,jsonCondition2,jsonCondition3);
if (evalResult instanceof List<?>) {
List<String> matchedFields = (List<String>) evalResult;
return matchedFields;
}else {
return new ArrayList<>();
}
}
// 构造Redis中查询Json的条件
public String constructRedisJsonCondition(String key,String value){
if (StringUtil.isEmpty(value)){
return "";
}
String valueToFind = "\"%s\":%s,";
String jsonCondition = String.format(valueToFind, key, value);
return jsonCondition;
}
}