我想使用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
我如何可以查询日期时间范围内的结果,由特定用户,特定类别的?
谢谢!
你需要记住的Redis是一个内存数据库(即使它可以持续的数据到磁盘)。 你把Redis的数据必须装入内存。
你提到的文章中的建议是关于使用Redis的作为分布式排队系统。 工作进程出队的项目,并将其写入到磁盘,所以没有在Redis的内存,许多项目。 这种设计也有缺陷,如果工作进程无法将数据写入速度不够快盘,Redis的内存消耗会爆炸 - 所以它必须通过配置(Redis的maxmemory参数)或软件(修剪在插入时的队列,或空的限制当它是队列满)。
现在,您的建议并没有真正的工作,因为你在Redis的写入数据将被保存在内存中(即使它们被Redis的本身保存在磁盘上)。
还有一点是不能查询的Redis。 Redis的是不是一个关系数据库,它不支持任何即席查询机制,只有命令涉及先前定义的访问路径。 如果要使用不同的参数搜索数据,你必须预测到所有可能的搜索,并建立相关的数据结构,在插入时(设定,整理台,等...)。
另一家商店(MongoDB的,或者关系型数据库)可能会成为你的使用情况更加适合。
您可以存储与以下结构日志:
"logs:{category}:{userid}:{datetime}" = message
然后要求它如下:
"logs:*:{userid}:{datetime}"
要么
"logs:{category}:*:{datetime}"
Redis的是内存中的数据存储。 数据到磁盘直接持久性是可能的保存或BGSAVE命令。 持久性(RDB / AOF)是除了存储在内存中的一个特征。
提到的要求是日志存储到磁盘上。 使用的,而不是在内存中的数据存储的任何消息队列(如RabbitMQ的)应使事情变得简单。 (日志不会吃存储器)
应用程序生成日志可以把它们发布到队列,并有独立的消费者消费的日志信息,并将其写入磁盘。
我如何可以查询日期时间范围内的结果,由特定用户,特定类别的?
日志的每个块应该被存为一个结构(例如用于C / C ++)是这样的:
struct log{
long datatime;
string userId;
string message;
string category;
};
序列化此结构字符串,并将其在Redis的存储为值。 这些值的密钥会是这样:键=用户id + DELIMITER +类别+ DELIMITER + DATATIME
你可以有函数,得到所有的钥匙回来,分裂他们得到的数据列表为您的特定关键字。
它的工作原理相当不错,如果您使用的是有序集合带时间戳的分数。 缺点是内存问题(如在其他的答案中提到)和手动查询,你会做。
我一直在玩弄它,如果有人感兴趣: https://github.com/hugollm/redis-logs-example