Redis的日志记录(redis for logging)

2019-08-02 04:23发布

我想使用Redis的Web应用日志的目的。 我用Google搜索,有使用这种方法通过日志倾倒入Redis的队列/列表,然后安排工人写入到磁盘。

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

我要求的理解是,为什么不直接使用Redis的坚持到磁盘? 如果我已分配了一个小服务器,Redis的会写,从数据库,应用服务器分离,是可行使用Redis的直接持续的日志?

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

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

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

谢谢!

Answer 1:

你需要记住的Redis是一个内存数据库(即使它可以持续的数据到磁盘)。 你把Redis的数据必须装入内存。

你提到的文章中的建议是关于使用Redis的作为分布式排队系统。 工作进程出队的项目,并将其写入到磁盘,所以没有在Redis的内存,许多项目。 这种设计也有缺陷,如果工作进程无法将数据写入速度不够快盘,Redis的内存消耗会爆炸 - 所以它必须通过配置(Redis的maxmemory参数)或软件(修剪在插入时的队列,或空的限制当它是队列满)。

现在,您的建议并没有真正的工作,因为你在Redis的写入数据将被保存在内存中(即使它们被Redis的本身保存在磁盘上)。

还有一点是不能查询的Redis。 Redis的是不是一个关系数据库,它不支持任何即席查询机制,只有命令涉及先前定义的访问路径。 如果要使用不同的参数搜索数据,你必须预测到所有可能的搜索,并建立相关的数据结构,在插入时(设定,整理台,等...)。

另一家商店(MongoDB的,或者关系型数据库)可能会成为你的使用情况更加适合。



Answer 2:

您可以存储与以下结构日志:

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

然后要求它如下:

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

要么

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


Answer 3:

Redis的是内存中的数据存储。 数据到磁盘直接持久性是可能的保存或BGSAVE命令。 持久性(RDB / AOF)是除了存储在内存中的一个特征。

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

应用程序生成日志可以把它们发布到队列,并有独立的消费者消费的日志信息,并将其写入磁盘。

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

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

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

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

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



Answer 4:

它的工作原理相当不错,如果您使用的是有序集合带时间戳的分数。 缺点是内存问题(如在其他的答案中提到)和手动查询,你会做。

我一直在玩弄它,如果有人感兴趣: https://github.com/hugollm/redis-logs-example



文章来源: redis for logging
标签: logging redis