RedisTemplate模板的使用

Stella981
• 阅读 944

一、Map =======boundHashOps

(1)主方法,向redis当中存储Map值

RedisTemplate模板的使用

@Resource
private RedisTemplate<String, Object> redisTemplate;
 
private static final Long EXPIRED_MINUTE = new Long(1);
private static final String HUM_NUM_KEY = "HUM_NUM_";    //统计医师人文医学测评次数
 
  @RequestMapping("/hum_num")
    public 
    @ResponseBody
    ApiResult getDoctorHumnum(@RequestParam Map<String,Object> paramMap) {
        
        paramMap.put("orgs", this.getOrganization());
        
        Map<String, Object> result = Maps.newHashMap();
        String key = this.generateKey(HUM_NUM_KEY, paramMap);
        if(this.isExistInRedis(key)) {
            result = this.getMapFromRedis(key);
        }else {
            result = doctorInfoService.selectDoctorHumNum(paramMap);
            this.putMapToRedis(key, result);
        }
        return ApiResult.success(result);
    }

RedisTemplate模板的使用

(2)设置Key值

private String generateKey(String prefix, Map<String,Object> paramMap) {
        return prefix 
                + (paramMap.get("orgUuid")==null?"": paramMap.get("orgUuid").toString())
                + "_"
                + (paramMap.get("cycleId")==null?"": paramMap.get("cycleId").toString());
    }

注意: 上面的设置key其实就是一个识别的字符串,将此字符串存储到redis里面作为key

(3)判断key是否存在

private boolean isExistInRedis(String key) {
        return redisTemplate.boundHashOps(key).size()==0? false: true;
           // 注意的是因为我们插入的是一个Map所以存储的是Hash的内容。
    }

(4)获取redis当中存储的值

RedisTemplate模板的使用

private Map<String, Object> getMapFromRedis(String key){
        
        // 这里使用guava工具类中的方法,在一定程度上简化了使用HasMap时创建泛型的错误操作
        Map<String, Object> result = Maps.newHashMap();
        Map<Object, Object> map = redisTemplate.boundHashOps(key).entries();// 根据key获取Map
   
        // 将Map遍历出来     
        for(Map.Entry<Object, Object> entry: map.entrySet()) {
            result.put(entry.getKey().toString(), entry.getValue());
        }
        
        return result;
    }

RedisTemplate模板的使用

(5)将Map中的值插入到Redis当中的方法

private void putMapToRedis(String key, Map<?, ?> map) {
        
        redisTemplate.boundHashOps(key).putAll(map);
        // 设置过期时间,单位是分钟
        redisTemplate.boundHashOps(key).expire(EXPIRED_MINUTE, TimeUnit.MINUTES);
    }

二、Object========boundVauleOps 

(1)主方法

RedisTemplate模板的使用

@Resource
private RedisTemplate<String, Object> redisTemplate;
 
@RequestMapping("/statistic")
    @ResponseBody
    public ApiResult statistic(@RequestParam Map<String, Object> paramMap) {
        String key = this.generateKey(PERIDIC_STATISTIC_TAB3_KEY, paramMap);
        StatisticGroupResult statistic = null;
        if (isExistStringInRedis(key)) {
            statistic =(StatisticGroupResult) redisTemplate.boundValueOps(key).get();
        } else {
            statistic = operateService.selectStatisticGroup(paramMap);
            redisTemplate.boundValueOps(key).set(statistic,EXPIRED_MINUTE, TimeUnit.MINUTES);
        }
        return ApiResult.success(statistic);
    }

RedisTemplate模板的使用

(2)判断key值是否存在

// 判断字符串类型的Key值是否存在
    private boolean isExistStringInRedis(String key) {
        return redisTemplate.boundValueOps(key).size()==0? false: true;
    }

注意这里面存在一些内容和Map中使用的是公共的

三、List  ============boundListOps

(1)主方法

RedisTemplate模板的使用

// 使用的都是String,Object方式
    @Resource
    private RedisTemplate<String, Object> redisTemplate;
    
 
    @RequestMapping("/periodic_list")
    @ResponseBody
    public ApiResult periodicList(@RequestParam Map<String,Object> paramMap) {
        String key = this.generateKey(PERIDIC_TAB3_KEY ,paramMap);
        List<PeriodicExamineResult> result = new ArrayList<>();
        if (isExistListInRedis(key)) {
            List<Object> list = redisTemplate.boundListOps(key).range(0,-1);
            for (int i = 0; i < list.size(); i++) {
                result.add((PeriodicExamineResult) list.get(i));
            }
        }else {
            result = operateService.queryPeriodicExamineList(paramMap);
            for (PeriodicExamineResult temp:result) {
                redisTemplate.boundListOps(key).leftPush(temp);
                redisTemplate.boundListOps(key).expire(EXPIRED_MINUTE, TimeUnit.MINUTES);
            }
        }
        return ApiResult.success(result);
    }

RedisTemplate模板的使用

(2)判断List当中的值是否存在

// 判断列表类型的key值是否存在
    private boolean isExistListInRedis(String key) {
        return redisTemplate.boundListOps(key).size() == 0 ? false : true;
    }

四、当RedisTemplate<String,List<....>> redisTemplate;

RedisTemplate模板的使用

@Resource
    private RedisTemplate<String, List<PeriodicExamineResult>> redisTemplate;
 
     @org.junit.Test
    public void Test4() {
        String key = "LI_HAO"; // 设置key
        List<PeriodicExamineResult> result = new ArrayList<>();
        Map<String,Object> paramMap = Maps.newHashMap();
        result = operateService.queryPeriodicExamineList(paramMap);
        
        redisTemplate.boundListOps(key).leftPush(result); // 将获取的result放到redis当中
        redisTemplate.boundListOps(key).expire(10, TimeUnit.MINUTES);// 设置时间
 
        List<List<PeriodicExamineResult>>  list =redisTemplate.boundListOps(key).range(1,-1);  //将存储到redis当中的值获取出来
        for (PeriodicExamineResult res:list.get(0)) {
            System.out.println(res.getTotal());
        }
    }

RedisTemplate模板的使用

注意: range(1,-1) 表示遍历出列表中的所有内容。因为我们是以List插入的所以也应该以List进行接收。所以使用list.get(0)从而获取到插入的列表 

五、如果在使用分页时遇到这个问题,那么我们可以手动的写一个分页,用来承接List

RedisTemplate模板的使用

//它所使用的模板同上面使用的一样为:
    @Resource
    private RedisTemplate<String, Object> redisTemplate;
    
 
    @RequestMapping("/examine_result_search")
    @ResponseBody
    public JQGirdPageResult examineResultSearch(@RequestParam Map<String,Object> paramMap, @ModelAttribute PageBean pageBean) {
 
        String key = this.generateKey(PERIDIC_EXAMINE_TAB4_KEY, paramMap);
        List<PeriodicExaminePageResult> result = new ArrayList<>();
        if (isExistListInRedis(key)) {
            List<Object> list = redisTemplate.boundListOps(key).range(0,-1);
            for (int i = 0; i < list.size(); i++) {
                result.add((PeriodicExaminePageResult) list.get(i));
            }
            Long total =Long.valueOf(result.size());
            Integer pageSize = pageBean.getRows();
            Integer page = pageBean.getPage();
            JQGirdPageResult jqGirdPageResult = new JQGirdPageResult();
            Integer totalPage = total % pageSize == 0? total.intValue() / pageSize: total.intValue() / pageSize + 1;
            jqGirdPageResult.setTotal(totalPage == 0? 1: totalPage);
            jqGirdPageResult.setPage(page);
            jqGirdPageResult.setRows(result);
            jqGirdPageResult.setRecords(total);
            return jqGirdPageResult;
 
        } else {
            result = operateService.queryPeriodicPageList(paramMap);
            for (PeriodicExaminePageResult temp:result) {
                redisTemplate.boundListOps(key).leftPush(temp);
                redisTemplate.boundListOps(key).expire(EXPIRED_MINUTE, TimeUnit.MINUTES);
            }
            Long total =Long.valueOf(result.size());
            Integer pageSize = pageBean.getRows();
            Integer page = pageBean.getPage();
            JQGirdPageResult jqGirdPageResult = new JQGirdPageResult();
            Integer totalPage = total % pageSize == 0? total.intValue() / pageSize: total.intValue() / pageSize + 1;
            jqGirdPageResult.setTotal(totalPage == 0? 1: totalPage);
            jqGirdPageResult.setPage(page);
            jqGirdPageResult.setRows(result);
            jqGirdPageResult.setRecords(total);
            return jqGirdPageResult;
        }
 
    }
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Easter79 Easter79
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这