我正在考虑将Redis用于web应用程序日志记录。我在谷歌上搜索到,有人使用这种方法,将日志转储到Redis队列/列表中,然后安排一个工作者写入磁盘。
http://nosql.mypopescu.com/post/8652869828/another-redis-use-case-centralized-logging
我希望寻求理解,为什么不直接使用Redis持久化到磁盘?如果我分配了一台小服务器,Redis会写,与数据库、app服务器分开,用Redis直接持久化日志行不行?
我还需要帮助查询Redis的日期时间,用户等。例如,每个日志如下。
datetime=>2012-03-24 17:45:12
userid=>123
message=>test message
category=>my category如何按特定用户、特定类别查询日期时间范围内的结果?
谢谢!
发布于 2012-11-01 16:07:43
您需要记住,Redis是一个内存中的数据库(即使它可以将数据持久化到磁盘)。你放到Redis中的数据必须放入内存中。
您在文章中提到的建议是关于使用Redis作为分布式排队系统。工作进程将这些项出队并将它们写入磁盘,因此Redis内存中没有那么多项。这种设计有一个缺陷:如果工作进程不能足够快地将数据写入磁盘,Redis内存消耗将爆炸式增长-因此它必须受到配置(Redis最大内存参数)或软件(在插入时修剪队列,或在队列已满时清空队列)的限制。
现在,您的建议并不能真正起作用,因为您在Redis中编写的所有数据都将保存在内存中(即使它们是由Redis本身持久存储到磁盘中的)。
另外一点是你不能查询Redis。Redis不是关系数据库,它不支持即席查询机制,只支持涉及先前定义的访问路径的命令。如果您想用不同的参数搜索数据,您必须预测所有可能的搜索并构建相关的数据结构(集合、排序集等)。在插入时。
另一个存储(MongoDB或关系数据库)可能更适合您的用例。
发布于 2015-03-24 23:53:27
您可以使用以下结构存储日志:
"logs:{category}:{userid}:{datetime}" = message然后按如下方式请求:
"logs:*:{userid}:{datetime}"或
"logs:{category}:*:{datetime}"发布于 2013-11-20 13:00:28
Redis在内存数据存储中。可以使用Save或BGSAVE命令将数据直接持久化到磁盘。持久性(RDB/AOF)是内存中存储之外的一个特性。
提到的要求是将日志存储到磁盘。使用任何消息队列(如RabbitMQ)而不是内存中的数据存储应该会使事情变得简单。(日志不会占用内存)
生成日志的应用程序可以将它们发布到队列上,并由单独的使用者使用日志消息并将其写入磁盘。
如何按特定用户、特定类别查询日期时间范围内的结果?
每个日志块都应该保存为一个结构(例如C/C++),如下所示:
struct log{
long datatime;
string userId;
string message;
string category;
};将此结构序列化为字符串,并将其作为值存储在Redis中。这些值的键应该是这样的:键= userId +分隔符+类别+分隔符+数据
你可以有一个函数,它可以得到所有的关键字,并将它们拆分,以获得特定关键字的数据列表。
https://stackoverflow.com/questions/13169842
复制相似问题