java中Jedis对redis内数据的批量获取- hscan,Pipeline的使用- 常用工具类-RedisUtil
指出问题
在使用 redis 的时候,配合 jedis 使用,但是发现 jedis 的 keys* 或者 mget 都会造成 redis 阻塞,所以使用了 redis 的解决方案 Pipeline(管道)的方式进行对 redis 内数据的获取。封装了以下工具类。需要自取。或者提供好的方法可以留言,我可以写进来。
初始化配置
先在 application.yml 配置 redis 基本信息
spring:
redis:
host: 127.0.0.1
port: 6379
password:
database: 0
timeout: 5000
创建 jedis 连接池
创建 RedisConfig.java
@Configuration
@Slf4j
public class RedisConfig {
@Autowired
private RedisProperties redisProperties; // 从配置文件获取 redis 连接配置
<span class="hljs-keyword">private</span> JedisPool jedisPool;
<span class="hljs-meta">@Autowired</span>
<span class="hljs-keyword">private</span> JedisPoolConfig jedisPoolConfig;
<span class="hljs-meta">@Bean</span>
<span class="hljs-meta">@Scope("prototype")</span>
<span class="hljs-comment">/**
* 多例模式返回redis客户端,但是在依赖注入时,建议不要使用
* 因为jedis客户端是阻塞式IO的,而且线程不安全,
* 所以在操作数据库的时候不要使用单例,建议从连接池获取
*/</span>
<span class="hljs-keyword">public</span> redis.clients.jedis.Jedis <span class="hljs-title function_">jedis</span><span class="hljs-params">()</span>{
<span class="hljs-keyword">if</span> (jedisPool!=<span class="hljs-literal">null</span>){
<span class="hljs-keyword">return</span> jedisPool.getResource();
}<span class="hljs-keyword">else</span> {
<span class="hljs-keyword">return</span> jedisPool().getResource();
}
// return jedisPool.getResource();
}
<span class="hljs-meta">@Bean</span>
<span class="hljs-comment">/**
* 单例模式返回redis连接池
* 依赖注入时,建议注入jedisPool,获取连接池,然后调用getResource方法获取jedis客户端
* 使用完后,调用jedis.close()方法归还连接,节约资源
*/</span>
<span class="hljs-keyword">public</span> JedisPool <span class="hljs-title function_">jedisPool</span><span class="hljs-params">()</span>{
<span class="hljs-keyword">synchronized</span> (<span class="hljs-built_in">this</span>){
<span class="hljs-keyword">if</span>(jedisPool==<span class="hljs-literal">null</span>){
<span class="hljs-keyword">synchronized</span> (<span class="hljs-built_in">this</span>){
<span class="hljs-keyword">if</span> (StringUtils.isEmpty(redisProperties.getPassword())){
<span class="hljs-comment">//无密码</span>
jedisPool = <span class="hljs-keyword">new</span> <span class="hljs-title class_">JedisPool</span>(jedisPoolConfig,redisProperties.getHost(),redisProperties.getPort(),(<span class="hljs-type">int</span>)redisProperties.getTimeout().toMillis());
}<span class="hljs-keyword">else</span> {<span class="hljs-comment">//有密码</span>
jedisPool = <span class="hljs-keyword">new</span> <span class="hljs-title class_">JedisPool</span>(jedisPoolConfig,redisProperties.getHost(),redisProperties.getPort(),(<span class="hljs-type">int</span>)redisProperties.getTimeout().toMillis(),redisProperties.getPassword());
}
}
}
}
<span class="hljs-keyword">return</span> jedisPool;
}
<span class="hljs-meta">@Bean</span>
<span class="hljs-keyword">public</span> JedisPoolConfig <span class="hljs-title function_">jedisPoolConfig</span><span class="hljs-params">()</span>{
<span class="hljs-comment">// Jedis连接池配置</span>
<span class="hljs-type">JedisPoolConfig</span> <span class="hljs-variable">jedisPoolConfig</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">JedisPoolConfig</span>();
jedisPoolConfig.setMaxTotal(redisProperties.getLettuce().getPool().getMaxActive());
<span class="hljs-comment">// 最大空闲连接数, 默认8个</span>
// jedisPoolConfig.setMaxIdle(50);
jedisPoolConfig.setMaxIdle(redisProperties.getLettuce().getPool().getMaxIdle());
// 最大连接数, 默认 8 个
// jedisPoolConfig.setMaxTotal(300);
// 最小空闲连接数, 默认 0
jedisPoolConfig.setMinIdle(redisProperties.getLettuce().getPool().getMinIdle());
// jedisPoolConfig.setMinIdle(20);
// 获取连接时的最大等待毫秒数 (如果设置为阻塞时 BlockWhenExhausted), 如果超时就抛异常, 小于零: 阻塞不确定的时间, 默认 -1
jedisPoolConfig.setMaxWaitMillis(redisProperties.getLettuce().getPool().getMaxWait().toMillis()); // 设置 10 秒
// jedisPoolConfig.setMaxWaitMillis(3000); // 设置 2 秒
// 对拿到的 connection 进行 validateObject 校验
jedisPoolConfig.setTestOnBorrow(<span class="hljs-literal">true</span>);
<span class="hljs-keyword">return</span> jedisPoolConfig;
}
}
jedis 工具类
@Component
@Slf4j
public class RedisUtil {
@Autowired
private JedisPool jedisPool;
<span class="hljs-comment">/**
* findValueByKeyOfPipeline和 findValueByKeyOfPipelineMget 的区别在于 前者根据阈值获取多次 后者是直接一次性获取
*/</span>
<span class="hljs-comment">/**
* 根据(不完整)key值通过Pipeline的方式获取值
* 先通过scan获取全部的key,再通过Pipeline获取全部的值
* 根据countVPT 这个 阈值来控制 获取多次
* (通过建立一个管道一次提交)
* <span class="hljs-doctag">@param</span> redisKey
* <span class="hljs-doctag">@Auther</span> erpangshou
* <span class="hljs-doctag">@Date</span>:2021/6/17 10:36
**/</span>
<span class="hljs-keyword">public</span> List<String> <span class="hljs-title function_">findValueByKeyOfPipeline</span><span class="hljs-params">(String redisKey)</span> {
<span class="hljs-type">Jedis</span> <span class="hljs-variable">jedis</span> <span class="hljs-operator">=</span> <span class="hljs-literal">null</span>;
List<String> values = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();
ArrayList<Response<List<String>>> responses = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();
<span class="hljs-type">int</span> countVPT=ConstantCom.BATCH_SIZE;
<span class="hljs-keyword">try</span> {
jedis = jedisPool.getResource();
<span class="hljs-comment">//从redis获取值刷新航迹信息</span>
List<String> allKeys = findAllKeys(redisKey);
<span class="hljs-keyword">if</span> (Objects.isNull(allKeys) || allKeys.isEmpty()) {
<span class="hljs-keyword">return</span> values;
}
<span class="hljs-type">Pipeline</span> <span class="hljs-variable">pipelined</span> <span class="hljs-operator">=</span> jedis.pipelined();
ArrayList<String> strings = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();
<span class="hljs-keyword">for</span> (String key : allKeys) {
strings.add(key);
<span class="hljs-keyword">if</span> (strings.size()==countVPT){
ArrayList<String> subList = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>(strings);
String[] keys = subList.toArray(<span class="hljs-keyword">new</span> <span class="hljs-title class_">String</span>[subList.size()]);
Response<List<String>> mget = pipelined.mget(keys);
responses.add(mget);
strings=<span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();
}
}
<span class="hljs-comment">//最后的数据</span>
String[] keys = strings.toArray(<span class="hljs-keyword">new</span> <span class="hljs-title class_">String</span>[strings.size()]);
Response<List<String>> mget = pipelined.mget(keys);
responses.add(mget);
pipelined.sync();
<span class="hljs-keyword">for</span> (Response<List<String>> respons : responses) {
values.addAll(respons.get());
}
} <span class="hljs-keyword">catch</span> (Exception e) {
e.printStackTrace();
log.error(<span class="hljs-string">"redis查询异常:"</span> + e.getMessage());
} <span class="hljs-keyword">finally</span> {
<span class="hljs-keyword">if</span> (jedis != <span class="hljs-literal">null</span>) {
jedis.close();
}
}
<span class="hljs-keyword">return</span> values;
}
<span class="hljs-comment">/**
* 根据(不完整)key值通过Pipeline的方式获取值
* 先通过scan获取全部的key,再通过Pipeline获取全部的值
* (通过Pipeline.mget直接获取)
* <span class="hljs-doctag">@param</span> redisKey
* <span class="hljs-doctag">@Auther</span> erpangshou
* <span class="hljs-doctag">@Date</span>:2021/6/17 10:36
**/</span>
<span class="hljs-keyword">public</span> List<String> <span class="hljs-title function_">findValueByKeyOfPipelineMget</span><span class="hljs-params">(String redisKey)</span> {
<span class="hljs-type">Jedis</span> <span class="hljs-variable">jedis</span> <span class="hljs-operator">=</span> <span class="hljs-literal">null</span>;
List<String> values = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();
ArrayList<Response<List<String>>> responses = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();
<span class="hljs-keyword">try</span> {
jedis = jedisPool.getResource();
<span class="hljs-comment">//从redis获取值刷新航迹信息</span>
List<String> allKeys = findAllKeys(redisKey);
<span class="hljs-keyword">if</span> (Objects.isNull(allKeys) || allKeys.isEmpty()) {
<span class="hljs-keyword">return</span> values;
}
// allKeys=allKeys.subList(0,5000);
String[] keys = allKeys.toArray(new String[allKeys.size()]);
Pipeline pipelined = jedis.pipelined();
Response<List<String>> mget = pipelined.mget(keys);
pipelined.sync();
values=mget.get();
} catch (Exception e) {
log.error("redis 查询异常:" + e.getMessage());
} finally {
if (jedis != null) {
jedis.close();
}
}
return values;
}
<span class="hljs-comment">/**
* jedis的met
* <span class="hljs-doctag">@param</span> redisKey
* <span class="hljs-doctag">@Auther</span> erpangshou
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> List<String> <span class="hljs-title function_">mget</span><span class="hljs-params">(String redisKey)</span> {
<span class="hljs-type">Jedis</span> <span class="hljs-variable">jedis</span> <span class="hljs-operator">=</span> <span class="hljs-literal">null</span>;
List<String> values = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();
<span class="hljs-keyword">try</span> {
jedis = jedisPool.getResource();
<span class="hljs-comment">//从redis获取值刷新航迹信息</span>
List<String> allKeys = findAllKeys(redisKey);
<span class="hljs-keyword">if</span> (Objects.isNull(allKeys) || allKeys.isEmpty()) {
<span class="hljs-keyword">return</span> values;
}
String[] keys = allKeys.toArray(<span class="hljs-keyword">new</span> <span class="hljs-title class_">String</span>[allKeys.size()]);
List<String> mget1 = jedis.mget(keys);
values=mget1;
} <span class="hljs-keyword">catch</span> (Exception e) {
log.error(<span class="hljs-string">"redis查询异常:"</span> + e.getMessage());
} <span class="hljs-keyword">finally</span> {
<span class="hljs-keyword">if</span> (jedis != <span class="hljs-literal">null</span>) {
jedis.close();
}
}
<span class="hljs-keyword">return</span> values;
}
<span class="hljs-comment">/**
* 根据(不完整)key值通过Pipeline的方式获取值 --使用传入jedis的方式
* 先通过scan获取全部的key,再通过Pipeline获取全部的值
*
* <span class="hljs-doctag">@param</span> redisKey
* <span class="hljs-doctag">@Auther</span> erpangshou
* <span class="hljs-doctag">@Date</span>:2021/6/17 10:36
**/</span>
<span class="hljs-keyword">public</span> List<String> <span class="hljs-title function_">findValueByKeyOfPipeline</span><span class="hljs-params">(String redisKey, Jedis jedis)</span> {
List<String> values = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();
<span class="hljs-keyword">try</span> {
<span class="hljs-comment">//从redis获取值刷新航迹信息</span>
List<String> allKeys = findAllKeys(redisKey);
<span class="hljs-keyword">if</span> (allKeys == <span class="hljs-literal">null</span> || allKeys.isEmpty()) {
<span class="hljs-keyword">return</span> values;
}
<span class="hljs-comment">//此处采用Pipeline,以提升性能</span>
<span class="hljs-type">Pipeline</span> <span class="hljs-variable">pipelined</span> <span class="hljs-operator">=</span> jedis.pipelined();
Response<List<String>> mget = pipelined.mget(allKeys.toArray(<span class="hljs-keyword">new</span> <span class="hljs-title class_">String</span>[allKeys.size()]));
pipelined.sync();
values = mget.get();
} <span class="hljs-keyword">catch</span> (Exception e) {
log.error(<span class="hljs-string">"redis查询异常:"</span> + e.getMessage());
}
<span class="hljs-keyword">return</span> values;
}
<span class="hljs-comment">/**
* 根据多个完整(精确)key值通过Pipeline的方式获取值
* 使用完整的key通过Pipeline获取全部的值
*
* <span class="hljs-doctag">@param</span> allKeys
* <span class="hljs-doctag">@Auther</span> erpangshou
* <span class="hljs-doctag">@Date</span> 2021/6/17 10:33
*/</span>
<span class="hljs-keyword">public</span> List<String> <span class="hljs-title function_">findAllkeysByKeysOfPipeline</span><span class="hljs-params">(String[] allKeys)</span> {
<span class="hljs-type">Jedis</span> <span class="hljs-variable">jedis</span> <span class="hljs-operator">=</span> <span class="hljs-literal">null</span>;
List<String> values = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();
<span class="hljs-type">int</span> countVPT=ConstantCom.BATCH_SIZE;
<span class="hljs-keyword">try</span> {
jedis = jedisPool.getResource();
ArrayList<Response<List<String>>> responses = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();
<span class="hljs-comment">//从redis获取值刷新航迹信息</span>
<span class="hljs-keyword">if</span> (Objects.isNull(allKeys) || allKeys.length == <span class="hljs-number">0</span>) {
<span class="hljs-keyword">return</span> values;
}
<span class="hljs-comment">//此处采用Pipeline,以提升性能</span>
<span class="hljs-type">Pipeline</span> <span class="hljs-variable">pipelined</span> <span class="hljs-operator">=</span> jedis.pipelined();
ArrayList<String> strings = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();
<span class="hljs-keyword">for</span> (String key : allKeys) {
strings.add(key);
<span class="hljs-keyword">if</span> (strings.size()==countVPT){
ArrayList<String> subList = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>(strings);
String[] keys = subList.toArray(<span class="hljs-keyword">new</span> <span class="hljs-title class_">String</span>[subList.size()]);
Response<List<String>> mget = pipelined.mget(keys);
responses.add(mget);
strings=<span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();
}
}
<span class="hljs-comment">//最后的数据</span>
String[] keys = strings.toArray(<span class="hljs-keyword">new</span> <span class="hljs-title class_">String</span>[strings.size()]);
Response<List<String>> mget = pipelined.mget(keys);
responses.add(mget);
pipelined.sync();
<span class="hljs-keyword">for</span> (Response<List<String>> respons : responses) {
values.addAll(respons.get());
}
} <span class="hljs-keyword">catch</span> (Exception e) {
log.error(<span class="hljs-string">"redis查询异常:"</span> + e.getMessage());
} <span class="hljs-keyword">finally</span> {
<span class="hljs-keyword">if</span> (jedis != <span class="hljs-literal">null</span>) {
jedis.close();
}
}
<span class="hljs-keyword">return</span> values;
}
<span class="hljs-comment">/**
* 根据多个完整(精确)key值通过Pipeline的方式获取值 --使用传入jedis的方式
* 使用完整的key通过Pipeline获取全部的值
*
* <span class="hljs-doctag">@param</span> redisKeys
* <span class="hljs-doctag">@Auther</span> erpangshou
* <span class="hljs-doctag">@Date</span> 2021/6/17 10:33
*/</span>
<span class="hljs-keyword">public</span> List<String> <span class="hljs-title function_">findAllkeysByKeysOfPipeline</span><span class="hljs-params">(String[] redisKeys, Jedis jedis)</span> {
List<String> values = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();
<span class="hljs-keyword">try</span> {
<span class="hljs-comment">//从redis获取值刷新航迹信息</span>
<span class="hljs-keyword">if</span> (redisKeys == <span class="hljs-literal">null</span> || redisKeys.length == <span class="hljs-number">0</span>) {
<span class="hljs-keyword">return</span> values;
}
<span class="hljs-comment">//此处采用Pipeline,以提升性能</span>
<span class="hljs-type">Pipeline</span> <span class="hljs-variable">pipelined</span> <span class="hljs-operator">=</span> jedis.pipelined();
Response<List<String>> mget = pipelined.mget(redisKeys);
pipelined.sync();
values = mget.get();
} <span class="hljs-keyword">catch</span> (Exception e) {
log.error(<span class="hljs-string">"redis查询异常:"</span> + e.getMessage());
}
<span class="hljs-keyword">return</span> values;
}
<span class="hljs-comment">/**
* 根据keys 获取value
*
* <span class="hljs-doctag">@param</span> pattern
* <span class="hljs-doctag">@Auther</span> erpangshou
*/</span>
<span class="hljs-keyword">public</span> List<String> <span class="hljs-title function_">findValueByKey</span><span class="hljs-params">(String pattern)</span> {
List<String> values = <span class="hljs-literal">null</span>;
List<String> keys = findAllKeys(pattern);
<span class="hljs-keyword">if</span> (keys != <span class="hljs-literal">null</span> && keys.size() > <span class="hljs-number">0</span>) {
String[] strings = keys.toArray(<span class="hljs-keyword">new</span> <span class="hljs-title class_">String</span>[keys.size()]);
values = findAllkeysByKeysOfPipeline(strings);
}
<span class="hljs-keyword">return</span> values;
}
<span class="hljs-comment">/**
* 根据keys 获取value --使用传入jedis的方式
*
* <span class="hljs-doctag">@param</span> pattern
* <span class="hljs-doctag">@Auther</span> erpangshou
*/</span>
<span class="hljs-keyword">public</span> List<String> <span class="hljs-title function_">findValueByKey</span><span class="hljs-params">(String pattern, Jedis jedis)</span> {
List<String> values = <span class="hljs-literal">null</span>;
List<String> keys = findAllKeys(pattern);
<span class="hljs-keyword">if</span> (keys != <span class="hljs-literal">null</span> && keys.size() > <span class="hljs-number">0</span>) {
String[] strings = keys.toArray(<span class="hljs-keyword">new</span> <span class="hljs-title class_">String</span>[keys.size()]);
values = findAllkeysByKeysOfPipeline(strings, jedis);
}
<span class="hljs-keyword">return</span> values;
}
<span class="hljs-comment">/**
* 根据keys 获取value 已map形式返回
*
* <span class="hljs-doctag">@param</span> pattern
* <span class="hljs-doctag">@Auther</span> erpangshou
*/</span>
<span class="hljs-keyword">public</span> List<Map> <span class="hljs-title function_">findValuetoMapByKey</span><span class="hljs-params">(String pattern, Jedis jedis)</span> {
List<String> values = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();
ArrayList<Map> mapList = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();
<span class="hljs-keyword">try</span> {
List<String> keys = findAllKeys(pattern);
<span class="hljs-keyword">if</span> (keys != <span class="hljs-literal">null</span> && keys.size() > <span class="hljs-number">0</span>) {
String[] strings = keys.toArray(<span class="hljs-keyword">new</span> <span class="hljs-title class_">String</span>[keys.size()]);
values = findAllkeysByKeysOfPipeline(strings);
}
<span class="hljs-keyword">if</span> (ObjectUtil.isNotEmpty(values)) {
<span class="hljs-keyword">for</span> (String value : values) {
Map<String, Object> map = ((JSONObject) JSONObject.parse(value)).toJavaObject(Map.class);
mapList.add(map);
}
}
} <span class="hljs-keyword">catch</span> (Exception e) {
jedis.close();
e.printStackTrace();
}
<span class="hljs-keyword">return</span> mapList;
}
<span class="hljs-comment">/**
* 因为Redis是单线程jedis.keys()方法会导致数据库阻塞,
* 可能导致Redis其它业务无法操作,所有采用迭代模式(scan)获取数据
* 并且keys()方法的时间复杂度为O(n),scan()时间复杂度为O(1)
*/</span>
<span class="hljs-keyword">public</span> List<String> <span class="hljs-title function_">findAllKeys</span><span class="hljs-params">(String pattern)</span> {
<span class="hljs-type">Jedis</span> <span class="hljs-variable">jedis</span> <span class="hljs-operator">=</span> <span class="hljs-literal">null</span>;
List<String> total = <span class="hljs-literal">null</span>;
<span class="hljs-keyword">try</span> {
jedis = jedisPool.getResource();
<span class="hljs-type">String</span> <span class="hljs-variable">cursor</span> <span class="hljs-operator">=</span> String.valueOf(<span class="hljs-number">0</span>);
total = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();
<span class="hljs-type">ScanParams</span> <span class="hljs-variable">params</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">ScanParams</span>();
params.match(pattern);
<span class="hljs-keyword">do</span> {
params.count(ConstantCom.BATCH_SIZE);
ScanResult<String> result = jedis.scan(cursor, params);
cursor = result.getStringCursor();
total.addAll(result.getResult());
} <span class="hljs-keyword">while</span> (Integer.valueOf(cursor) > <span class="hljs-number">0</span>);
} <span class="hljs-keyword">catch</span> (NumberFormatException e) {
e.printStackTrace();
log.error(<span class="hljs-string">"批量获取redis的key失败"</span>);
} <span class="hljs-keyword">finally</span> {
<span class="hljs-keyword">if</span> (ObjectUtil.isNotEmpty(jedis)) {
jedis.close();
}
}
<span class="hljs-keyword">return</span> total;
}
<span class="hljs-comment">/**
* 获取全都的key --使用传入jedis的方式
* 因为Redis是单线程jedis.keys()方法会导致数据库阻塞,
* 可能导致Redis其它业务无法操作,所有采用迭代模式(scan)获取数据
* 并且keys()方法的时间复杂度为O(n),scan()时间复杂度为O(1)
*/</span>
<span class="hljs-keyword">public</span> List<String> <span class="hljs-title function_">findAllKeys</span><span class="hljs-params">(String pattern, Jedis jedis)</span> {
List<String> total = <span class="hljs-literal">null</span>;
<span class="hljs-keyword">try</span> {
<span class="hljs-type">String</span> <span class="hljs-variable">cursor</span> <span class="hljs-operator">=</span> String.valueOf(<span class="hljs-number">0</span>);
total = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();
<span class="hljs-type">ScanParams</span> <span class="hljs-variable">params</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">ScanParams</span>();
params.match(pattern);
<span class="hljs-keyword">do</span> {
params.count(ConstantCom.BATCH_SIZE);
ScanResult<String> result = jedis.scan(cursor, params);
cursor = result.getStringCursor();
total.addAll(result.getResult());
} <span class="hljs-keyword">while</span> (Integer.valueOf(cursor) > <span class="hljs-number">0</span>);
} <span class="hljs-keyword">catch</span> (NumberFormatException e) {
e.printStackTrace();
log.error(<span class="hljs-string">"批量获取redis的key失败"</span>);
}
<span class="hljs-keyword">return</span> total;
}
<span class="hljs-comment">/**
* 取代jedis.keys(*)
*
* <span class="hljs-doctag">@param</span> pattern
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> Set<String> <span class="hljs-title function_">findAllKeysToSet</span><span class="hljs-params">(String pattern)</span> {
<span class="hljs-type">Jedis</span> <span class="hljs-variable">jedis</span> <span class="hljs-operator">=</span> <span class="hljs-literal">null</span>;
Set<String> total = <span class="hljs-literal">null</span>;
<span class="hljs-keyword">try</span> {
jedis = jedisPool.getResource();
<span class="hljs-type">String</span> <span class="hljs-variable">cursor</span> <span class="hljs-operator">=</span> String.valueOf(<span class="hljs-number">0</span>);
total = <span class="hljs-keyword">new</span> <span class="hljs-title class_">HashSet</span><String>() {
};
<span class="hljs-type">ScanParams</span> <span class="hljs-variable">params</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">ScanParams</span>();
params.match(pattern);
<span class="hljs-keyword">do</span> {
params.count(ConstantCom.BATCH_SIZE);
ScanResult<String> result = jedis.scan(cursor, params);
cursor = result.getStringCursor();
total.addAll(result.getResult());
} <span class="hljs-keyword">while</span> (Integer.valueOf(cursor) > <span class="hljs-number">0</span>);
} <span class="hljs-keyword">catch</span> (NumberFormatException e) {
e.printStackTrace();
log.error(<span class="hljs-string">"批量获取redis的key失败"</span>);
} <span class="hljs-keyword">finally</span> {
<span class="hljs-keyword">if</span> (ObjectUtil.isNotEmpty(jedis)) {
jedis.close();
}
}
<span class="hljs-keyword">return</span> total;
}
<span class="hljs-comment">/**
* 取代jedis.keys(*) --使用传入jedis的方式
* <span class="hljs-doctag">@param</span> pattern
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> Set<String> <span class="hljs-title function_">findAllKeysToSet</span><span class="hljs-params">(String pattern, Jedis jedis)</span> {
Set<String> total = <span class="hljs-literal">null</span>;
<span class="hljs-keyword">try</span> {
<span class="hljs-type">String</span> <span class="hljs-variable">cursor</span> <span class="hljs-operator">=</span> String.valueOf(<span class="hljs-number">0</span>);
total = <span class="hljs-keyword">new</span> <span class="hljs-title class_">HashSet</span><String>();
<span class="hljs-type">ScanParams</span> <span class="hljs-variable">params</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">ScanParams</span>();
params.match(pattern);
<span class="hljs-keyword">do</span> {
params.count(ConstantCom.BATCH_SIZE);
ScanResult<String> result = jedis.scan(cursor, params);
cursor = result.getStringCursor();
total.addAll(result.getResult());
} <span class="hljs-keyword">while</span> (Integer.valueOf(cursor) > <span class="hljs-number">0</span>);
} <span class="hljs-keyword">catch</span> (NumberFormatException e) {
e.printStackTrace();
log.error(<span class="hljs-string">"批量获取redis的key失败"</span>);
}
<span class="hljs-keyword">return</span> total;
}
<span class="hljs-comment">/**
* 实时数据取出,封装成指定的对象集合
*
* <span class="hljs-doctag">@param</span> list redis取出的value集合
* <span class="hljs-doctag">@param</span> entityClass 需要封装的对象类型
* <span class="hljs-doctag">@param</span> <T>
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> <T> List<T> <span class="hljs-title function_">valueToClass</span><span class="hljs-params">(List<String> list, Class<T> entityClass)</span> {
List<T> result = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();
<span class="hljs-keyword">for</span> (String value : list) {
Map<String, Object> map = ((JSONObject) JSONObject.parse(value)).toJavaObject(Map.class);
Set<String> keySet = map.keySet();
<span class="hljs-comment">// 将所有key转换为小写</span>
Map<String, Object> map1 = <span class="hljs-keyword">new</span> <span class="hljs-title class_">HashMap</span><>();
<span class="hljs-keyword">for</span> (String set : keySet) {
map1.put(set.toLowerCase(), map.get(set));
}
<span class="hljs-type">T</span> <span class="hljs-variable">instance</span> <span class="hljs-operator">=</span> <span class="hljs-literal">null</span>;
<span class="hljs-keyword">try</span> {
instance = entityClass.newInstance();
BeanUtils.populate(instance, map1);
} <span class="hljs-keyword">catch</span> (InstantiationException e) {
e.printStackTrace();
} <span class="hljs-keyword">catch</span> (IllegalAccessException e) {
e.printStackTrace();
} <span class="hljs-keyword">catch</span> (InvocationTargetException e) {
e.printStackTrace();
}
result.add(instance);
}
<span class="hljs-keyword">return</span> result;
}
<span class="hljs-keyword">public</span> List<Map<String, Object>> <span class="hljs-title function_">valueToMap</span><span class="hljs-params">(List<String> list)</span> {
List<Map<String, Object>> result = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();
<span class="hljs-keyword">for</span> (String value : list) {
<span class="hljs-keyword">if</span> (org.apache.commons.lang3.StringUtils.isNotBlank(value)) {
Map<String, Object> map = ((JSONObject) JSONObject.parse(value)).toJavaObject(Map.class);
result.add(map);
}
}
<span class="hljs-keyword">return</span> result;
}
<span class="hljs-comment">/**
* <span class="hljs-doctag">@description</span> redis常用方法封装get
* <span class="hljs-doctag">@author</span> erpangshou
* <span class="hljs-doctag">@date</span> 2021/6/11
**/</span>
<span class="hljs-keyword">public</span> String <span class="hljs-title function_">get</span><span class="hljs-params">(String key)</span> {
<span class="hljs-type">Jedis</span> <span class="hljs-variable">jedis</span> <span class="hljs-operator">=</span> <span class="hljs-literal">null</span>;
<span class="hljs-keyword">try</span> {
jedis = jedisPool.getResource();
<span class="hljs-keyword">return</span> jedis.get(key);
} <span class="hljs-keyword">catch</span> (Exception e) {
e.printStackTrace();
} <span class="hljs-keyword">finally</span> {
<span class="hljs-keyword">if</span> (!Objects.isNull(jedis)) {
jedis.close();
}
}
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
}
<span class="hljs-comment">/**
* <span class="hljs-doctag">@description</span> redis常用方法封装set
* <span class="hljs-doctag">@author</span> erpangshou
* <span class="hljs-doctag">@date</span> 2021/6/11
**/</span>
<span class="hljs-keyword">public</span> String <span class="hljs-title function_">set</span><span class="hljs-params">(String key, String value)</span> {
<span class="hljs-type">Jedis</span> <span class="hljs-variable">jedis</span> <span class="hljs-operator">=</span> <span class="hljs-literal">null</span>;
<span class="hljs-keyword">try</span> {
jedis = jedisPool.getResource();
<span class="hljs-keyword">return</span> jedis.set(key, value);
} <span class="hljs-keyword">catch</span> (Exception e) {
e.printStackTrace();
} <span class="hljs-keyword">finally</span> {
<span class="hljs-keyword">if</span> (!Objects.isNull(jedis)) {
jedis.close();
}
}
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
}
<span class="hljs-keyword">public</span> String <span class="hljs-title function_">hget</span><span class="hljs-params">(String key, String field)</span> {
<span class="hljs-type">Jedis</span> <span class="hljs-variable">jedis</span> <span class="hljs-operator">=</span> <span class="hljs-literal">null</span>;
<span class="hljs-keyword">try</span> {
jedis = jedisPool.getResource();
<span class="hljs-keyword">return</span> jedis.hget(key, field);
} <span class="hljs-keyword">catch</span> (Exception e) {
e.printStackTrace();
} <span class="hljs-keyword">finally</span> {
<span class="hljs-keyword">if</span> (!Objects.isNull(jedis)) {
jedis.close();
}
}
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
}
<span class="hljs-comment">/**
* 获取redis的hash值
* 用scan方式模仿hgetAll
* <span class="hljs-doctag">@param</span> pattern key
* <span class="hljs-doctag">@Auther</span> erpangshou
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> Map<String, String> <span class="hljs-title function_">hScan</span><span class="hljs-params">(String pattern)</span> {
<span class="hljs-type">long</span> <span class="hljs-variable">startTime</span> <span class="hljs-operator">=</span> System.currentTimeMillis();
<span class="hljs-type">Jedis</span> <span class="hljs-variable">jedis</span> <span class="hljs-operator">=</span> <span class="hljs-literal">null</span>;
Map<String, String> result = <span class="hljs-keyword">new</span> <span class="hljs-title class_">HashMap</span><>();
List<Map.Entry<String, String>> results = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><Map.Entry<String, String>>();
<span class="hljs-keyword">try</span> {
jedis = jedisPool.getResource();
<span class="hljs-type">String</span> <span class="hljs-variable">cursor</span> <span class="hljs-operator">=</span> String.valueOf(<span class="hljs-number">0</span>);
<span class="hljs-type">ScanParams</span> <span class="hljs-variable">params</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">ScanParams</span>();
params.count(ConstantCom.BATCH_SIZE);
<span class="hljs-keyword">do</span> {
ScanResult<Map.Entry<String, String>> scanResult = jedis.hscan(pattern, cursor, params);
cursor = scanResult.getStringCursor();
scanResult.getResult().stream().forEach(entry->result.put(entry.getKey(),entry.getValue()));
} <span class="hljs-keyword">while</span> (Integer.valueOf(cursor) > <span class="hljs-number">0</span>);
} <span class="hljs-keyword">catch</span> (NumberFormatException e) {
e.printStackTrace();
log.error(<span class="hljs-string">"批量获取redis的key失败"</span>);
} <span class="hljs-keyword">finally</span> {
<span class="hljs-keyword">if</span> (ObjectUtil.isNotEmpty(jedis)) {
jedis.close();
}
}
System.out.println(<span class="hljs-string">"hscansize:"</span>+result.size());
System.out.println(<span class="hljs-string">"hscantime:"</span>+(System.currentTimeMillis()-startTime));
<span class="hljs-keyword">return</span> result;
}
}