由于数据量比较大需要放入redis增加查询效率,且需要对指定进行字段排序,网上资料比较少,于是自己琢磨了一个。
/**
* HashSet
* @param key 键
* @param map 对应多个键值
* @return true 成功 false 失败
*/
public boolean hmset(String key, Map<String,Object> map){
try {
redisTemplate.opsForHash().putAll(key, map);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将list放入缓存
* @param key 键
* @param value 值
* @return
*/
public boolean leftSet(String key, Object value) {
try {
redisTemplate.opsForList().leftPush(key,value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public boolean setPageListData(List<Object> dataList,String key,String subKey) throws NoSuchFieldException {
for(int i=0;i<dataList.size();i++){
leftSet(key,i);
Class cls = dataList.get(i).getClass();
//得到所有属性
Field[] fields = cls.getDeclaredFields();
String nameVlues="";
Map<String,Object> xmap = new HashMap<String,Object>();
//遍历获取所有属性值
for (int n=0;n<fields.length;n++){
try {
//得到属性
Field field = fields[n];
//打开私有访问
field.setAccessible(true);
//获取属性
String name = field.getName();
//获取属性值
Object value = field.get(dataList.get(i));
//一个个赋值
nameVlues += field.getName()+":"+value+",";
xmap.put(field.getName(),value);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
System.out.println(subKey+"_"+i);
hmset(subKey+"_"+i,xmap);
}
return true;
}
/**
* redis 排序分页查询
* @param key 外部KEY
* @param subKey 实体key
* @param by 需要排序的字段
* @param fields 需要返回字段名称
* @param isDesc 是否降序排列
* @param isAlpha 排列字段是否中文
* @param offset 起始数据
* @param count 数据量
* */
public <T> List<T> sortPageList(String key, String subKey, String by,List<Object> fields ,boolean isDesc, boolean isAlpha, long offset, long count) {
SortQueryBuilder<String> builder= SortQueryBuilder.sort(key);
builder.by(subKey+"*->"+by);
builder.alphabetical(isAlpha);
if(isDesc){
builder.order(SortParameters.Order.DESC);
}
builder.limit(offset,count);
List<T> cks = redisTemplate.sort(builder.build());
List list = new ArrayList();
for(Object ck: cks){
//每次获取一组数据
List<Object> multiCacheMapValue = getMultiCacheMapValue(subKey + ck, fields);
Map<String,Object> xmap = new HashMap<>();
for(int i=0;i<multiCacheMapValue.size();i++){
xmap.put(String.valueOf(fields.get(i)),multiCacheMapValue.get(i));
}
list.add(xmap);
}
return list;
}
调用方法,写入List数据
// List arr = new ArrayList(){{
// add(new TestDTO().builder().name("jack").age(22).build());
// add(new TestDTO().builder().name("tom").age(23).build());
// add(new TestDTO().builder().name("mike").age(24).build());
// add(new TestDTO().builder().name("zhangsan").age(25).build());
// }};
//
// redisUtil.setPageListData(arr,"userKey","user_info");
通过排序分页获取数据
String[] col = new String[]{"age", "name"};
List<Object> list = new ArrayList<Object>();
List<Object> objects = redisUtil.sortPageList("userKey", "user_info_", "age", Arrays.asList(col), true,false,0L,10L);