[英]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 UN0002384391290
和SREM 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。 排序集只允許ZINTERSTORE
和ZUNIONSTORE
,因此您需要在查詢后進行清理。
您可以通過使用帶有容量桶的集合來避免排序集合,例如Rooms:Capacity:1-5
、 Rooms:Capacity:6-10
等。
考慮為您的建築物添加坐標,以便您的用戶可以按距離進行查詢。 請參閱GEOADD和GEORADIUS 。
您可能希望在未來允許預訂和可用性查詢。 請參閱Redis 上的日期范圍重疊? .
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.