使用Python設計日誌儲存系統
假設我們有一些日誌,每個日誌包含一個唯一ID和時間戳。時間戳是一個字串,格式為:年:月:日:時:分:秒,例如2019:01:01:23:59:59。所有欄位都是用零填充的十進位制數字。
我們必須設計一個日誌儲存系統來實現以下功能:
void Put(int id, string timestamp): 此函式將接收日誌的唯一ID和時間戳,並將日誌儲存到儲存系統中。int[] Retrieve(String start, String end, String granularity): 此函式將返回時間戳在起始時間和結束時間範圍內的日誌ID。granularity引數指示要考慮的時間級別。例如,start = "2019:01:01:23:59:59",end = "2019:01:02:23:59:59",granularity = "Day",這意味著我們需要查詢2019年1月1日至2019年1月2日之間的日誌。
因此,如果輸入如下所示:
put(1, "2019:01:01:23:59:59");put(2, "2019:01:01:22:59:59");put(3, "2018:01:01:00:00:00");retrieve("2018:01:01:01:01:01","2019:01:01:23:00:00","Year");retrieve("2018:01:01:01:01:01","2019:01:01:23:00:00","Hour");
那麼輸出將為[1,2,3],因為我們需要返回2018年和2019年範圍內的所有日誌;以及[1,2],因為我們需要返回從2018:01:01:01到2019:01:01:23的所有日誌,日誌3在範圍之外。
為了解決這個問題,我們將遵循以下步驟:
定義初始化器。
logs :=新建一個列表定義一個函式
put()。此函式將接收id和timestamp將id和timestamp插入到logs列表的末尾
定義一個函式
retrieve()。此函式將接收s, e, graindex :=一個類似於{'Year':5, 'Month' : 8, 'Day' : 11, 'Hour' : 14, 'Minute' : 17, 'Second' :20}的對映[gra]start := s[從索引0到index]end := e[從索引0到index]返回 (
tidfor eachtid,timestampinlogsifstart <= timestamp[從索引0到index] <= end)
示例
讓我們看看下面的實現,以便更好地理解:
class LogSystem(object):
def __init__(self):
self.logs = []
def put(self, id, timestamp):
self.logs.append((id, timestamp))
def retrieve(self, s, e, gra):
index = {'Year':5, 'Month' : 8, 'Day' : 11, 'Hour' : 14, 'Minute' : 17, 'Second' :20}[gra]
start = s[:index]
end = e[:index]
return (tid for tid, timestamp in self.logs if start <= timestamp[:index] <= end)
ob = LogSystem()
ob.put(1, "2019:01:01:23:59:59")
ob.put(2, "2019:01:01:22:59:59")
ob.put(3, "2018:01:01:00:00:00")
print(list(ob.retrieve("2018:01:01:01:01:01","2019:01:01:23:00:00","Year")))
print(list(ob.retrieve("2018:01:01:01:01:01","2019:01:01:23:00:00","Hour")))輸入
ob.put(1, "2019:01:01:23:59:59")
ob.put(2, "2019:01:01:22:59:59")
ob.put(3, "2018:01:01:00:00:00")
ob.retrieve("2018:01:01:01:01:01","2019:01:01:23:00:00","Year")
ob.retrieve("2018:01:01:01:01:01","2019:01:01:23:00:00","Hour")輸出
[1, 2, 3] [1, 2]
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP