一、前言
Redis是Key-Value數據庫,存儲的時候需要一個唯一的Key值,查詢的時候根據根據key值進行查詢,但是Redis畢竟只是key-value存儲,所以有很多局限性。例如:
(1)無法實現多條件組合的查詢,如:
硬要實現的話需要多條命令并計算并集或交集。
(2)模糊查詢中文比較費勁;
因此,如何設計一個合適的Key來優化我們的查詢操作,是一個比較有意義的事情。
對于Key的設計網上有很多資料,但對我來說,都太過于凌亂,并沒有找到一個合適的方案。下邊,和大家一起學習一種較為簡單的模式匹配方式的Key值設計方法。
下邊的學習,主要介紹項目中使用的方式,有興趣的同學可以clone代碼一起學習,倉庫地址:
https://git.oschina.net/xuliugen/redis-demo.git
二、項目結構
SSM框架(Spring+Spring MVC+MyBatis),除了實現了對Redis的存儲,還通過注解的方式實現了數據庫的讀寫分離功能,實現了Spring對數據庫和Redis的事務管理,JSR303校驗,以及簡單的領域驅動DDD思想項目。
(1)項目結構:
(2)數據庫腳本:
(3)Spring配置文件位置:
其中,db-redis.xml文件中,如下代碼表示開啟Redis事務:
(4)Redis和MyBatis代碼位置:
三、Key值設計
上述,大致看了依托的項目結構,還沒有開始Redis Key值得設計,因此可以跳過,下邊主要學習一下,如何設計一種Key實現模式匹配查詢方式。
(1)情景假設
有實體對象SecurityUserDTO,如下:
這里假設用戶對象最常用的查詢條件是:用戶名(userName)和單位類型(unitType),因此,對于數據庫設計的時候,我們應該對這兩個屬性加上索引(題外話,完全和Key的設計無關!只是在于點一下這種最常見的數據庫加索引的方式)。
數據庫做了索引,那我,我們將數據存儲到Redis中的時候,如何在把他取出來那?
(2)首先,看一下最終存放在Redis中的數據格式:
其中:
SU1_縣級單位_wangwu_0000000035
可以分為四個部分:
1、簡化的實體對象名稱,就是SecurityUserDTO的簡寫,為了縮短Key的長度;
2、unitType的值,第一個查詢條件;
3、userName的值,第二個查詢條件;
4、ID的值,十位數值,前邊不足十位補0;
(3)如何拼接,核心代碼如下:
assembleRedisKeyPrefix()方法:
assemberIdForKey()方法:
到這里,基本已經知道了大致拼接的過程,因此存放到Redis的數據是如下格式:
注:可以SecurityUserController#addUser(SecurityUserDTO userDTO)方法測試效果。
(4)如何查詢:
查詢的話可以參考SecurityUserController#listByCondition()方法:
查詢的時候,也是需要根據查詢條件構造Key值,然后讀取數據。
如果,查詢條件都有的話,構造的Key值如下:
如果,查詢條件只有一個的話,構造的Key值如下:
(5)修改數據和刪除數據:
因為ID在拼接的時候肯定是唯一的,因此,刪除的直接拼接為如下形式即可:
四、總結
拼接Key的方式很簡單,以常用的查詢條件屬性作為拼接Key的依據,當然還可以通過其他的方式,但最主要的是如何去實踐。