2015-07-28 83 views
0

我閱讀了許多關於Redis的網絡文章和指南,這些文章和指南都有很好的信息,但是我找不到所有的遊手好閒。由於我在Redis的是新的全球,我開始收集的信息繼續前進,我也有類似的天氣代表的錄音應用在SQL數據庫遵循我自己的應用案例:如何用Redis格式表示查詢目的的SQL表格格式?

(cityID, sensorID, StartReadingTime, EndReadingTime, AverageValue) 

每個城市(cityID)有許多傳感器(sensorID)這讀取溫度值。

我在(cityID,SensorID,StartReadingTime)上有複合鍵。

我的第一個問題是:在Redis中代表我的案例的最佳方式是什麼? 哈希,列表,集...等

正如我在很多文章中所看到的那樣,在將數據存儲在Redis之前,我必須弄清楚如何在稍後的其他世界中找回它,我將運行哪些查詢檢索數據。

我有我的情況下,三個主要的查詢

1-基本選擇(鍵查找)

SELECT * 
FROM weather 
WHERE cityID = ? 
AND sensorID= ? 
AND StartReadingTime = ? ; 

2-範圍搜索

SELECT * 
FROM weather 
WHERE AverageValue > ? 
AND AverageValue < ? 

3-聚合,範圍搜索

SELECT count(*) 
FROM weather 
WHERE AverageValue > ? 
AND AverageValue < ? 

如果您能爲我提供案例的提示和指導,我將不勝感激,這將鼓勵我繼續從Redis入手。

回答

0

請記住,每個查詢可能需要不同的數據結構以最佳方式回答。在你的情況下,你需要維護兩個數據結構。

1-基本選擇(鍵查找)

保持讀數哈希像這樣:

  • 鍵名:
  • 字段名稱:<start>
  • 字段值:`:
  • 查詢:HGET <city>:<sensor> <start>:分裂值

2-範圍搜索

請有序集合讀數像這樣:

  • 鍵名:averages
  • 會員評分: <avg>
  • 會員價值:<city>:<sensor>:<start>:<end>
  • 查詢:ZRANGEBYSCORE averages <from avg> <to avg> and split the value on:`

3-聚合,範圍搜索

相同的邏輯2,但因爲你實際上並不需要的值只是計數,可以使用一個Lua片段(例如這一個)在查詢中保存一些網絡:

EVAL "local r = redis.call('ZRANGEBYSCORE', KEYS[1], ARGV[1], ARGV[2]) return #r" 1 averages <from avg> <to avg)