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