redisTemplate存儲hash結構時,若是value不是String類型怎麼解決

業務:考勤系統,獲取構成考勤日曆須要的數據,如是否打卡,是否有異常,是否有排班....若是選擇月份,顯示該月份的考勤日曆,若是選擇日期,則顯示該天的考勤日曆,兩個功能是經過一個接口來實現的。redis

需求:功能已完成,直接經過查庫獲取相關數據,性能有些差,須要將數據存入redis中,取的時候從redis中取spring

方案:首先寫定時任務,定時將數據庫中的實時數據同步到redis中,存的數據結構時hash結構,redis的key爲精確到月份的日期,如2019-04,表明了某月的數據,hash中的key爲具體的日期,表明的具體某天的數據,value爲該日期的數據。數據庫

reids工具類:咱們用的是spring帶的redisTemplate的工具類來對redis進行操做,操做hash的方法爲:json

redisTemplate.opsForHash().put(key,d,json);

參數1key表示reids的key,d表示hash的key,json爲值,該方法存儲hash數據時,value某人爲String,強行的傳遞咱們的自定義對象會報錯,此時,須要將咱們的自定義對象序列化成json字符串,而後將該json字符串做爲參數傳入方法中,此時,就能夠完成了redisTemplate對value非String的hash數據結構的存儲了。數組

取值時先取出json字符串,而後將其轉換成咱們須要的對象。緩存

核心代碼:數據結構

存:工具

//將List轉換成數組
List<Shift> shiftList=groupBy.get(a);
//將shiftList轉化成json字符串
String json=JSON.toJSONString(shiftList);
redisTemplate.opsForHash().put(key,d,json);

取:性能

//獲取該員工該月份對應的班次信息
Map<String,String> entries = redisTemplate.opsForHash().entries(key);
List<Shift> shiftLists=new ArrayList<Shift>();
//獲取班次列表,若是redis中有該月份的緩存則再緩存裏取
if(entries!=null&&entries.size()>0){
    //若是傳來的時間是具體某天
    if(date.length()>7){
        //根據剛纔保存的map鍵名,獲得其保存的值
        String json= (String)redisTemplate.opsForHash().get(key, date);
        shiftLists=(List<Shift>)JSON.parseArray(json,Shift.class);
    }else{
        //獲取某個月份的考勤日曆
            for(String d:entries.keySet()){
                String json=(String)redisTemplate.boundHashOps(key).get(d);
                List<Shift> newshiftLists=(List<Shift>) JSON.parseArray(json,Shift.class);
                shiftLists.addAll(newshiftLists);
            }
    }
}else{
    shiftLists = getMonthShifts(date);
}
相關文章
相關標籤/搜索