查询redis 分页工具类
1.PageUtil
package com.demo.admin.util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@Component
public class PageUtil {
@Resource
private RedisTemplate redisTemplate;
public boolean hput(String key, String hkey, Object value) {
try {
redisTemplate.opsForHash().put(key, hkey, value);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
public boolean setPage(String key, String hkey, double score, String value) {
boolean result = false;
try {
result = redisTemplate.opsForZSet().add(key + ":page", hkey, score);
} catch (Exception e) {
e.printStackTrace();
}
redisTemplate.expire(key + ":page", 1800000, TimeUnit.MILLISECONDS);
return result;
}
public Set<String> getPage(String key, int offset, int count) {
Set<String> result = null;
try {
result = redisTemplate.opsForZSet().rangeByScore(key + ":page", 1, 100000, (offset - 1) * count, count);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public Integer getSize(String key) {
Integer num = 0;
try {
Long size = redisTemplate.opsForZSet().zCard(key + ":page");
return size.intValue();
} catch (Exception e) {
e.printStackTrace();
}
return num;
}
}
1.RedisFurryAndPageQueryUtil
package com.demo.admin.util;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.demo.admin.api.entity.otc.OtcAssetsInfo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.*;
@Component
public class RedisFurryAndPageQueryUtil<T> {
@Resource
private PageUtil pageUtil;
@Resource
private RedisTemplate redisTemplate;
public Page<T> find(String name, int currentPage, int count, String tableName, T t) {
name = StringUtils.lowerCase(name);
Page<T> page = new Page<T>();
ArrayList<OtcAssetsInfo> result = new ArrayList<>();
String pageName = tableName + name + ":page";
Boolean ifExist = redisTemplate.hasKey(pageName);
if (!ifExist) {
try {
Cursor<Map.Entry<String, String>> cursor = null;
if (name == null || "".equals(name)) {
cursor = redisTemplate
.opsForHash()
.scan(tableName, ScanOptions.scanOptions()
.match("*")
.count(1000).build());
}else{
cursor = redisTemplate
.opsForHash()
.scan(tableName, ScanOptions.scanOptions()
.match("*"+name + "*")
.count(10000).build());
setPage(cursor, name, tableName);
getPageResult(name, currentPage, count, page, result, tableName, t);
}
cursor.close();
} catch (Exception e) {
e.printStackTrace();
}
} else {
getPageResult(name, currentPage, count, page, result, tableName, t);
}
return page;
}
private void setPage(Cursor<Map.Entry<String, String>> cursor, String name, String tableName) {
int i = 1;
while (cursor.hasNext()) {
Map.Entry<String, String> result = cursor.next();
String key = result.getKey();
pageUtil.setPage(tableName + name, key, i, null);
i++;
}
}
private void getPageResult(String name, int currentPage, int count, Page<T> page, ArrayList result, String tableName, T t) {
Integer totalNumber = pageUtil.getSize(tableName + name);
Set<String> keyPages = pageUtil.getPage(tableName + name, currentPage, count);
count = keyPages.size();
for (String keyPage : keyPages) {
T Object = (T) redisTemplate.boundHashOps(tableName).get(keyPage);
result.add(Object);
}
Integer pageCount = 0;
if (totalNumber % count == 0) {
pageCount = totalNumber / count;
} else {
pageCount = totalNumber / count + 1;
}
page.setCurrent(currentPage);
page.setSize(count);
page.setRecords(result);
page.setTotal(totalNumber);
page.setPages(pageCount);
}
}
junit 单元测试
package test;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.demo.admin.DemoApplication;
import com.demo.admin.api.entity.otc.OtcAssetsInfo;
import com.demo.admin.util.RedisFurryAndPageQueryUtil;
import com.demo.common.core.util.JsonMapper;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.util.Map;
@Slf4j
@SpringBootTest(classes = DemoApplication.class)
@RunWith(SpringRunner.class)
public class MethodTestUtils {
@Resource
private RedisTemplate redisTemplate;
@Resource
private RedisFurryAndPageQueryUtil redisFurryAndPageQueryUtil;
@Test
public void testRedisPage(){
String tableName = "otcAssetsInfo";
Page<OtcAssetsInfo> page = redisFurryAndPageQueryUtil.find("", 1, 10, tableName, OtcAssetsInfo.class);
log.info(JsonMapper.INSTANCE.toJson(page));
log.info(JsonMapper.INSTANCE.toJson(page.getRecords()));
}
}
想学习,关注微信公众号 “Java追求”