2012-11-01 74 views
8

我正在考虑将Redis用于Web应用程序日志记录目的。我搜索了一下,有人使用这种方法将日志转储到Redis队列/列表中,然后将计划工作人员写入磁盘。redis用于日志记录

http://nosql.mypopescu.com/post/8652869828/another-redis-use-case-centralized-logging

我希望寻求理解是,为什么不直接使用Redis的坚持到磁盘?如果我已经分配了Redis将要写入的小型服务器,与数据库应用程序服务器分开,使用Redis直接保存日志是否可行?

我还需要帮助通过datetime,user等查询Redis。例如,每个日志如下。

datetime=>2012-03-24 17:45:12 
userid=>123 
message=>test message 
category=>my category 

我怎样才能查询结果的日期时间范围内,由特定用户,特定类别的?

谢谢!

回答

19

您需要记住Redis是内存数据库(即使它可以将数据保留到磁盘)。您放入Redis中的数据必须适合内存。

您提到的文章中的建议是关于将Redis用作分布式排队系统。工作进程将这些项目出队并将其写入磁盘,因此Redis内存中没有那么多项目。这种设计有一个缺陷:如果工作进程不能将数据写入磁盘的速度足够快,Redis的内存消耗就会爆炸 - 所以它必须受到配置(Redis maxmemory参数)或软件的限制(在插入​​时修剪队列或空队列满时)。

由于您在Redis中编写的所有数据都将保存在内存中(即使它们由Redis本身持久保存到磁盘),现在您的提议并不奏效。

另一点是你无法查询Redis。 Redis不是关系数据库,它不支持临时查询机制,只支持涉及以前定义的访问路径的命令。如果要搜索具有不同参数的数据,则必须预计所有可能的搜索,并在插入时建立相关数据结构(集合,排序集合等)。

另一个商店(MongoDB或关系数据库)可能会更适合您的用例。

+0

我只是看着一个Redis的演示。 Peter Cooper说Redis是为伐木设计/实施的(他足够接近权威来源)。因此,尽管您的评论足够真实,但还需要额外阅读。 – Richard

+3

Redis旨在支持lloogg(http://lloogg.com/)。但lloogg服务并不是将所有内容都放在内存中,然后处理查询。它是在正确的数据结构内即时存储/聚合数据,以便轻松访问数据。这不是一回事。 –

1

Redis在内存数据存储中。使用Save或BGSAVE命令可以将数据直接保存到磁盘。持久性(RDB/AOF)除了在内存中存储之外,还是一项功能。

要求提到的是将日志存储到磁盘。使用任何消息队列(如RabbitMQ)而不是内存数据存储区应该使事情变得简单。 (日志不会吃掉内存)

生成日志的应用程序可以将它们发布到队列中,并让单独的使用者使用日志消息并将它们写入磁盘。

如何查询日期时间范围内由特定用户指定的特定类别的结果?

日志中的每块应该被存为一个结构(例如用于C/C++)是这样的:

struct log{ 
    long datatime; 
    string userId; 
    string message; 
    string category; 
    }; 

序列化此结构,以字符串,并将其在Redis的存储为值。 键这些值会像: 键=用户id + DELIMITER +类别+ DELIMITER + DATATIME

你可以有函数,得到所有的钥匙回来,分裂他们得到的数据列表为您的特定关键字。

+0

是否可以使用这种方法发布范围查询(在datetime上)? – Legend

7

您可以将日志与结构如下:

"logs:{category}:{userid}:{datetime}" = message 

,然后要求它如下:

"logs:*:{userid}:{datetime}" 

或者

"logs:{category}:*:{datetime}"