zoukankan      html  css  js  c++  java
  • redisTemplate.sort使用分页查询

    由于数据量比较大需要放入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);





  • 相关阅读:
    评论拷贝JS写怀旧小游戏系列(六)躲人游戏
    宋体生成mongodb 聚合函数
    数据数字mongodb 模糊查询以及$type使用
    三国索引oracle 全文索引优化like
    插件网页怎么下载安装Firebug和使用Firebug
    对象调用javascript 中强制执行 toString()
    清空数据Android 跳转到一个应用安装的详情界面的方法
    抽样概率machine learning sampling 采样
    判断类型JS写怀旧小游戏系列(七)吃方块
    文档项目程序人生2009年(55)
  • 原文地址:https://www.cnblogs.com/dayangcong/p/15525703.html
Copyright © 2011-2022 走看看