簡體   English   中英

Redis 在密鑰與 json 中嵌入值

[英]Redis embedding value in the key vs json

我計划將房間可用性存儲在 redis 數據庫中。 json 對象如下所示:

{
  BuildingID: "RE0002439",
  RoomID: "UN0002384391290",
  SentTime: 1572616800,
  ReceivedTime: 1572616801,
  Status: "Occupied",
  EstimatedAvailableFrom: 1572620400000,
  Capacity: 20,
  Layout: "classroom"
}

這將由設備和應用程序(房間外的平板電腦、某些房間的房間內的傳感器、用戶等)報告,並且差異很大,因為我們有數百座建築物和 1000 多個房間。

我的意圖是在 Redis 中使用一個簡單的鍵值結構。 主要查詢是現在哪個房間可用,但其他查詢也是可能的。

因此,我認為密鑰應該看起來像

RoomID,Status,Capacity

我的問題是這是正確的假設,因為這是我們希望將所有這些都包含在密鑰中的主要查詢嗎? 鍵中是否也應該有其他字段,或者鍵應該只是一個帶有 Redis 增量的數字,就好像它是 SQL 一樣?

我可以找到很多關於層次結構的問題,但我的對象實際上沒有層次結構。

除非您專門為此使用 redis 實例,否則對常見查詢使用具有模式匹配的鍵並不是一個好主意。 當多次調用以遍歷整個鍵空間時,KEYS 也是 O(N) 和 SCAN。

考慮RediSearch 模塊,它將為您提供此用例的強大功能。

如果 RediSearch 不是一個選項:

您可以使用單個哈希鍵來存儲所有房間,但是您必須將整個 json 字符串存儲為值,並且每當您要修改字段時,您都需要獲取,然后修改然后設置。

您可能最好使用多種數據結構,這里有一個讓您入門的想法:

將每個房間存儲為哈希鍵。 如果 RoomID 是唯一的,您可以將其用作密鑰,或者在需要時將其與建築物 ID 配對。 這樣,您可以在一次操作中編輯字段值。

HSET UN0002384391290 BuildingID RE0002439 Capacity 20 ...

保留一個包含所有房間 ID 的集合。 SADD AllRooms UN0002384391290

使用集合和排序集合作為其余的索引:

一組可用房間:使用SADD AvailableRooms UN0002384391290SREM AvailableRooms UN0002384391290來標記房間是否可用。 這樣,您對所有可用房間的常見查詢就會盡可能快。 您可以使用它來代替房間數據中的Status 使用SISMEMBER來測試給定的房間現在是否可用。

具有容量的排序集合:使用ZADD RoomsByCapacity 20 UN0002384391290 所以現在你可以開始做一些很好的查詢,比如ZRANGEBYSCORE RoomsByCapacity 15 +inf WITHSCORES來獲取容量 >=15 的所有房間。 然后,您可以與可用房間相交。

按布局設置SADD RoomsByLayout:classroom UN0002384391290 然后你可以通過布局相交,比如SINTER AvailableRooms RoomsByLayout:classroom來獲取所有可用的教室。

按建築設置SADD RoomsByBuilding:RE0002439 UN0002384391290 然后你也可以與建築物相交,比如SINTER AvailableRooms RoomsByLayout:classroom RoomsByBuilding:RE0002439來獲取建築物中所有可用的教室。

您可以將集合與排序集合混合使用,例如ZINTERSTORE Available:RE0002439:ByCap 3 RoomsByBuilding:RE0002439 RoomsByCapacity AvailableRooms AGGREGATE MAX以獲取所有可用房間按建築容量評分 RE0002439。 排序集只允許ZINTERSTOREZUNIONSTORE ,因此您需要在查詢后進行清理。

您可以通過使用帶有容量桶的集合來避免排序集合,例如Rooms:Capacity:1-5Rooms:Capacity:6-10等。

考慮為您的建築物添加坐標,以便您的用戶可以按距離進行查詢。 請參閱GEOADDGEORADIUS

您可能希望在未來允許預訂和可用性查詢。 請參閱Redis 上的日期范圍重疊? .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM