首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于日志记录的redis

用于日志记录的redis
EN

Stack Overflow用户
提问于 2012-11-01 09:37:24
回答 4查看 20.4K关注 0票数 13

我正在考虑将Redis用于web应用程序日志记录。我在谷歌上搜索到,有人使用这种方法,将日志转储到Redis队列/列表中,然后安排一个工作者写入磁盘。

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

我希望寻求理解,为什么不直接使用Redis持久化到磁盘?如果我分配了一台小服务器,Redis会写,与数据库、app服务器分开,用Redis直接持久化日志行不行?

我还需要帮助查询Redis的日期时间,用户等。例如,每个日志如下。

代码语言:javascript
运行
复制
datetime=>2012-03-24 17:45:12
userid=>123
message=>test message
category=>my category

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

谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-11-01 16:07:43

您需要记住,Redis是一个内存中的数据库(即使它可以将数据持久化到磁盘)。你放到Redis中的数据必须放入内存中。

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

现在,您的建议并不能真正起作用,因为您在Redis中编写的所有数据都将保存在内存中(即使它们是由Redis本身持久存储到磁盘中的)。

另外一点是你不能查询Redis。Redis不是关系数据库,它不支持即席查询机制,只支持涉及先前定义的访问路径的命令。如果您想用不同的参数搜索数据,您必须预测所有可能的搜索并构建相关的数据结构(集合、排序集等)。在插入时。

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

票数 24
EN

Stack Overflow用户

发布于 2015-03-24 23:53:27

您可以使用以下结构存储日志:

代码语言:javascript
运行
复制
"logs:{category}:{userid}:{datetime}" = message

然后按如下方式请求:

代码语言:javascript
运行
复制
"logs:*:{userid}:{datetime}"

代码语言:javascript
运行
复制
"logs:{category}:*:{datetime}"
票数 11
EN

Stack Overflow用户

发布于 2013-11-20 13:00:28

Redis在内存数据存储中。可以使用Save或BGSAVE命令将数据直接持久化到磁盘。持久性(RDB/AOF)是内存中存储之外的一个特性。

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

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

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

每个日志块都应该保存为一个结构(例如C/C++),如下所示:

代码语言:javascript
运行
复制
   struct log{
     long datatime;
     string userId;
     string message;
     string category;
   };

将此结构序列化为字符串,并将其作为值存储在Redis中。这些值的键应该是这样的:键= userId +分隔符+类别+分隔符+数据

你可以有一个函数,它可以得到所有的关键字,并将它们拆分,以获得特定关键字的数据列表。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13169842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档