只保存最后一小时信息的优雅方式是什么?在我的情况下,我正在记录信息,例如:
Tue Nov 10 05:17:12 UTC 2015 \t apple
Tue Nov 10 05:42:27 UTC 2015 \t banana
Tue Nov 10 05:51:41 UTC 2015 \t carrot
我只需要过去一小时的信息。我希望以简单和防弹的方式保存到一个或多个文本文件。即,没有遍历目录以基于广泛模式匹配来删除旧文件。如果我有2小时的数据,这不是问题,但我不想要不到1小时。
我有想法替换2或3个文件,有时记录到> 1文件,并在特定时间删除一个或其他特定文件,但我无法弄清楚逻辑。
假设PHP。因此,这是来自Web请求的按需,而不是crontab。
答案 0 :(得分:0)
我刚才处理过类似的问题。我的解决方案是使用两个文件,保存到最后两个小时。在伪代码中:
# two files
file0 = a file
file1 = another file
# delete old files
if file0 older than 2 hours, delete file0
if file1 older than 2 hours, delete file1
# select newest file, and delete on alternating hours
if current hour mod 2 = 0 then
newest file = file0;
delete file1;
else
newest file = file1;
delete file0;
# save data to end of file
print data to file0;
print data to file1;
# the file to use is: newest file
这与您想要的有点不同,因为它长达2小时,但如果主要想法是您总是想要最后一小时,那么此方法将起作用。
这是一个细分。 F0 = file0; F1 = file1; a,b,c =数据
time mod data clear F0 F1 fileToUse
23:45 1 a F0 a a F1
00:15 0 b F1 ab b F0
00:45 0 c F1 abc c F0
10:05 0 d F0,F1 d d F0
11:30 1 e F0 e de F1
答案 1 :(得分:0)
对@michaelCodes回答,但使用了三个文件。这可以保证data_file中有一整小时的数据。它一次只能记录两个文件。
public async static void Login()
{
try
{
var scopes = new[] {
"onedrive.readwrite",
"onedrive.appfolder",
"wl.signin"
};
_client = Microsoft.OneDrive.Sdk.OneDriveClient.GetMicrosoftAccountClient("d5f4ce5f-116a-4b77-a5a7-bd81802cdc7e","urn:ietf:wg:oauth:2.0:oob", scopes, null, null, null);
OnedriveClient._client = _client;
var session = await _client.AuthenticateAsync();
// AppSettings.SkyDriveLogin = true;
var AccessToken = _client.AuthenticationProvider.CurrentAccountSession.AccessToken;
//REST API to request info about the signed-in user
var uri = new Uri($"https://apis.live.net/v5.0/me?access_token={AccessToken}");
答案 2 :(得分:0)
换句话说,日志中的任何记录仅在创建后的60分钟内有效。您可以使用内存存储系统,如memcached / redis。此类系统具有垃圾收集功能,您可以将它们设置为每小时对磁盘执行快照,或者您可以查询有效密钥。