之前有寫過數據字典的相關業務是怎么做的,有朋友留言問如何讀取,其實很簡單,最簡單的方式就是每次讀取數據庫,但是這樣的做法很不好,因為數據字典在數據庫中屬於冷資源,不是經常會變得數據,這樣的數據用緩存來做是最好的,在訪問數據庫前就直接攔截了去數據庫的請求,這樣減少數據庫的壓力,畢竟很多頁面對於數據字典的訪問還是偏多的
畫張圖簡單了解一下就行:
那怎么把數據放入redis中呢?主流的兩種做法大致說一下吧:
-
在每次進行增刪改數據字典的操作后,發送一個消息隊列,進行單獨記錄在redis中的維護(這樣的做法我個人不是很喜歡,因為有時候寫錯了就要重修修改或者刪除,這樣的頻繁操作比較多)
-
在每次進行數據字典的增刪改后,最后手動執行刷新,這樣批量把數據放入緩存中,最后在頁面上就能直接用了
在此小編我用的是第二種做法,如圖:
在之前的頁面上加了刷新緩存的按鈕,動態ajax到后台,讀取數據庫中的數據字典再刷新到緩存中去(有人說這樣頻繁的操作會很不好,話是這么說,但是這樣的操作權限僅限在項目發布成功后,再執行的操作,一般都是大半夜,毫無影響..--)
先來看一下數據庫的數據
再看一下緩存中的數據
不難看出,都是一一對應的
最后再來看一下自定義標簽,這個主要的目的就是接受jsp上傳來的key和對應的數據字典code,最后把value返回出來
private JedisClient jedis = SpringUtils.getContext().getBean(JedisClient.class); public void doTag() throws JspException, IOException { if (StringUtils.isNotEmpty(typeCode) && StringUtils.isNotEmpty(ddKey)) { String ddValue = jedis.get(CACHE_DATA_DICTS + ":" + typeCode + ":" + ddKey); JspWriter out = getJspContext().getOut(); out.println(ddValue); } else { getJspBody().invoke(sw); getJspContext().getOut().println(sw.toString()); } }
<div class="caption"> 性別:<dataDict:dataDictValue ddKey="1" typeCode="sex"/> <br/> 車輛類型:<dataDict:dataDictValue ddKey="1" typeCode="car_type"/> </div>
頁面效果:
題外話,這樣的做法僅限jsp頁面,如果你的數據是由JS render出來的話(比如jqgrid啊等等),那就可以寫一個js類對象,每次傳入code和key調用ajax從緩存中讀取即可。