在Redis的設計中,鍵是壹切,它對Redis是可見的,而值對Redis是壹個字節數組。Redis不知道妳的值中存儲了什麽,所以如果妳想知道,比如說,
select * from users其中user . location =“Shanghai“‘
這樣的查詢在Redis中無法通過值進行比較。但是您可以通過不同的數據結構類型來實現這壹點。例如,下面的數據定義
用戶:1 {姓名:傑克,年齡:28歲,地點:上海}用戶:2 {姓名:弗蘭克,年齡:30歲,地點:北京}用戶:地點:上海【1】
其中users:1 users:2分別定義了兩個用戶信息,由Redis中的hash數據結構實現,而users:location:shanghai記錄了上海所有的用戶id,由collection數據結構實現。這樣,我們可以通過兩個簡單的Redis命令調用來實現我們上面的查詢。
jedis jedis = jedispool . get resource();設置& lt字符串& gtshanghaiIDs = jedis.smembers(“用戶:地點:上海“);//遍歷集合//...//通過hgetall獲取對應的用戶信息jedis . hgetall(“users:“+Shanghai IDs【0】);
通過如上設計,可以實現簡單的條件查詢。然而,這樣的問題很多。首先,我們需要維護壹組ID索引。其次,我們對壹些復雜的查詢無能為力(當然,我們不能指望Redis像關系數據庫那樣實現查詢,這不是Redis所做的)。
但是Redis2.6集成了Lua腳本,可以通過eval命令直接在RedisServer的環境中執行,在Lua腳本中可以調用Redis命令。事實上,這意味著您可以使用腳本語言lua來操作Redis中存儲的鍵值,這具有重要意義。您甚至可以為系統所需的各種服務編寫lua腳本,提前將其加載到Redis中,然後只需調用Lua腳本來響應請求。當然,這有點誇張,但就是這個意思。
例如,現在我們想實現對年齡大於28歲的“所有用戶”的查詢,這可以通過以下Lua腳本來實現。
公共靜態最終字符串SCRIPT =“local result keys = { };“+“對於ipairs(密鑰)中的k,v,do“+“local tmp = redis . call(‘hget‘,v,‘age‘);“+“如果tmp & gtARGV【1】然後“+”table . insert(result keys,v);“+“結束;”+“結束;”+“返回結果鍵;”;
執行腳本代碼jedis jedis = jedispool . get resource();jedis . auth(auth);列表& lt字符串& gtkeys = arrays . as list(all user keys);列表& lt字符串& gtargs = new ArrayList & lt& gt();args . add(“28“);列表& lt字符串& gtresult keys =(List & lt;字符串& gt)jedis . eval sha(func key,keys,args);返回結果鍵;
請註意,上面的代碼中使用了evalsha命令,該命令的參數不是直接的Lua腳本字符串,而是預先加載到Redis中的函數的阿沙索引。所有需要在系統中執行的函數都通過下面的代碼提前加載到Redis中,我們的系統維護了壹個函數哈希表。以後需要實現什麽功能,從函數表中獲取對應函數的SHA索引並通過evalsha調用即可。
string shaFuncKey = jedis . SCRIPT load(SCRIPT);//加載腳本並獲取sha索引functional . put(funcname _ age,shafunkey);//添加到函數表
通過以上方法,可以在Redis中執行更復雜的查詢,提高效率。