`
litaocheng
  • 浏览: 337137 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Redis应用-Log汇总

阅读更多

最近项目中使用Redis比较多,非常喜欢这个小巧而强大的家伙。

准备写一个简单的系列,讲述使用Redis可以做什么,我们将充分挖掘Redis的潜能。

这是第一篇,准备用Redis作为Log汇总。

 

Redis介绍

Reids是一个比较高级的开源key-value存储系统,采用ANSI C实现。其与memcached类似,但是支持持久化数据存储,同时value支持多种类型:字符串 (同memcached中的value),列表集合 (Set),有序集合 (OrderSet)和Hash 。所有的值类型均支持原子操作,如列表中追加弹出元素,集合中插入移除元素等。Rdids的数据大部分位于内存中,其读写效率非常高,其提供AOF(追加式操作记录文件)和DUMP(定期数据备份)两种持久化方式。Redis支持自定义的VM(虚拟内存)机制,当数据容量超过内存时,可以将部分Value存储到文件中。同时Redis支持Master-Slave机制,可以进行数据复制。

 

Redis目前有VMWare资助,其作者antirez也就职于VMWare。

 

我们可以这样理解Redis,其对传统的key-value系统中的Value进行了扩展,Value不再是一个二进制字符,其可以包含多种类型。多种数据类型的引入,可以大大的简化我们应用的开发。比如我们应用中,需要一个名为“L1”的列表,用来顺序记录用户ID,一般的key-value系统中,我们会设置key为"L1",value为列表序列化处理后的结果。每次要对L1操作时,需要下列步骤:

  1. 取出key L1的值
  2. 进行反序列化
  3. 对列表进行增删操作
  4. 进行序列化
  5. 存储结果到key L1对应的value

一次更新需要经历5个步骤,包含序列化/反序列化,以及两次网络交互。

如果我们使用Redis的列表类型来存储Value,那么其步骤如下:

  1. 列表增删操作

对,只有一步操作!由此可见,Redis在某些情景下会大大的简化我们的应用逻辑。

 

日志汇总

我们的系统中包含很多节点(分布在不同的机器),我们需要一个地方来汇总所有的数据,进行入库(mysql,hadoop)操作。要尽可能的减少系统的复杂度,这方面的项目已经很多,解决方法也有很多。以前尝试过Scribe,其为Facebook的开源项目,基于Thrift,显然有些庞大了,同样繁琐还有使用MQ(消息中间件,如RabbitMQ)。对于小团队,这些方案都不适合。而其他各种山寨的办法,如日志写入文件,定期拷贝等等都太松散,不易管理。因为在项目中使用了Redis,所以决定把它用透彻,尝试进行Log的中转。

 

如果使用Redis进行Log汇总,可能首先要考虑下面几个问题:

  1. Redis是否会成为瓶颈
  2. Redis是否会成为一个单点故障
  3. Redis进行日志数据的汇总和提取是否方便

第1个问题,Redis的性能很出色,数据首先是放在内存中。此外系统中主要记录一些关键的操作日志,日志的量不会很大大,因此不会成为性能瓶颈。具体的Redis性能评测参考这里

第2个问题,Redis是否成为单点故障,如果只有一台Redis服务器,其宕掉,日志肯定无法发送成功。可以有多种选择,在Client端存储发送失败的Log,Redis恢复时重发(这样做增加了系统复杂性,Client会涉及重试,Log临时缓存大小控制等);或者可以在加一台Redis服务器作为备份。当然如果你的Log不是非常重要,允许一些丢失,那一台也无妨,只要你能保证Redis服务器可以及时的发现问题,并很快恢复就好。

第3个我呢题,Redis进行数据汇总很方便,我们可以直接将每条日志都追加到一个列表中。我们设置可以为日志分类,比如日志分error和debug两种,那么我们可以在Redis中创建两个列表:key为"error",value为List;和key为"debug",value为List。增加一条日志,仅仅是一个列表追加操作(Redis命令RPUSH)。而提取日志也非常方便,我们可以使用一个阻塞的列表弹出操作(Redis命令BLPOP,从队列头部弹出元素),当队列为空,即没有日志时,将阻塞。直到有日志产生。这个操作循环执行,就可以提取所有的日志,然后进行分析处理直接入库。

原型

现在做一件事情之前,我跟喜欢做一个原型,作为验证。下面我用Bash来模拟一下这个日志的发送和处理。

 

1, 启动Redis服务器

$ redis-server redis.conf

 

2, 书写gen_log.sh,代码如下:

#! /bin/bash

COUNT=0

while true; do
    LOG=`date '+%F %T'`
    LOG="${LOG} this is a log record"

    if !( redis-cli LPUSH log "${LOG}" > /dev/null 2>&1 ); then
        echo "send log error!"
        exit 1
    fi
    COUNT=$((++COUNT))
    
    echo "sent ${COUNT} logs"
    sleep 2
done

 随后运行:

 

$ chmod +x gen_log.sh & ../gen_log.sh
sent 1 logs
sent 2 logs

 从输出得知,已经开始发送日志。

我们可以启动多个gen_log.sh,模拟多个client。

此时可以查看log队列是否增加:

 

$ redis-cli
redis > LLEN log
32

 可以看到log已经产生。

 

3, 书写analy_log.sh,其代码如下:

#! /bin/bash

COUNT=0

while true; do
    LOG=$(redis-cli BLPOP log 0 2> /dev/null)
    if [ $? -ne 0 ]; then
        echo "get log error!"
        exit 1
    fi
    COUNT=$((++COUNT))

    echo "(${COUNT}) analyzing ${LOG} ..."
    #sleep 1
done

执行

$ ./analy_log.sh
(1) analyzing log
2010-10-18 17:20:58 this is a log record ...
(2) analyzing log
2010-10-18 17:20:58 this is a log record ...
(3) analyzing log
2010-10-18 17:20:56 this is a log record ...
(4) analyzing log
2010-10-18 17:20:56 this is a log record ...

 可以看到Log被快速的处理。

gen_log中,我们加入了一个sleep,所以analy_log可以很快的取出所有的log,通过redis-cli查看大部分log队列为空。因为处理log的速度远远大于生成log的速度。如果生成log的速度远远大于处理log的速度也没有关系,redis会相当于一个缓冲。

 

好了,最后你可以把上面的代码,翻译成你使用的语言,如Erlang,PHP,Python,方便的处理日志了。

 

分享到:
评论

相关推荐

    redis-stack-server 7.2.0 安装包合集

    redis-stack-server-7.2.0-v9.arm64.snap redis-stack-server-7.2.0-v9.bionic.arm64.tar.gz redis-stack-server-7.2.0-v9.bionic.x86_64.tar.gz redis-stack-server-7.2.0-v9.bullseye.x86_64.tar.gz redis-stack-...

    redis2-nginx-module-0.15

    通过 Redis2-NGINX-Module,开发者可以构建更高效、更灵活的 Web 应用架构,同时利用 Redis 的高性能特性来优化数据处理。在实际项目中,根据业务需求,合理配置和优化 Redis2-NGINX-Module,能够显著提升 Web 服务...

    redis-5.0.14-1.el7.remi.x86-64.rpm安装包(含有部署手册)

    redis-5.0.14-1.el7.remi.x86_64.rpm安装包(含有部署手册) redis-5.0.14-1.el7.remi.x86_64.rpm安装包(含有部署手册) redis-5.0.14-1.el7.remi.x86_64.rpm安装包(含有部署手册) redis-5.0.14-1.el7.remi.x86_64.rpm...

    Redis-x64-3.2.100.zip

    启动了redis,但是只要一关闭cmd窗口,redis就会消失。所以要把redis设置成windows下的服务。...redis-server --service-install redis.windows-service.conf --loglevel verbose redis-server --service-start

    redis校验工具redis-full-check

    在实际应用中,为了确保 Redis 的稳定性和数据一致性,需要定期对 Redis 实例进行健康检查。`redis-full-check` 正是这样一款针对 Redis 的专业校验工具,它能够帮助管理员检测 Redis 集群或单实例的潜在问题,保障...

    redis-5.0.5.tar.gz

    redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-...

    redis64-2.6.12.1.rar 亲测好用

    Redis以其强大的数据结构支持、丰富的客户端库以及持久化功能,在分布式缓存、数据库和消息中间件等领域广泛应用。 在您提供的压缩包“redis64-2.6.12.1.rar”中,包含的是Redis 2.6.12版本的64位安装文件。这个...

    Redis-x64-5.0.14.msi和Redis-x64-5.0.14.zip

    Redis是一种开源、高性能的键值对存储系统,广泛应用于缓存、数据库和消息中间件等场景。本资源提供了Redis在Windows平台上的64位版本,包括`.msi`安装包和`.zip`压缩文件。 首先,`.msi`文件是Windows Installer的...

    redis++使用说明,windows下编译redis-plus-plus

    在实际应用中,Redis++可以作为缓存系统,用于存储临时数据,以提高应用程序的性能。同时,Redis++也可以用于消息队列,用于异步处理任务。除此之外,Redis++也可以作为数据存储系统,用于存储结构化数据。 Redis++...

    tomcat-redis-session-manager的jar包-包含Tomcat7和Tomcat8

    《深入理解Tomcat-Redis-Session-Manager:在Tomcat7和Tomcat8中的应用》 在现代Web应用程序开发中,session管理是一个至关重要的环节,它涉及到用户会话的持久化和跨请求的数据共享。传统的session管理方式在高...

    PyPI 官网下载 | redis-py-cluster-1.1.0.tar.gz

    总之,`redis-py-cluster`为Python开发者提供了一种高效且易于使用的接口,以便在Python应用程序中充分利用Redis集群的强大功能。无论是在小型项目还是大型分布式系统中,它都是一个值得信赖的工具。

    tomcat-redis-session-manager包集合下载(tomcat8)

    【标题】"tomcat-redis-session-manager包集合下载(tomcat8)"涉及的主要知识点是将Redis集成到Tomcat中管理会话(session),以提高Web应用的性能和可扩展性。 【描述】中提到的"所需的tomcat-redis-session-...

    redis-py-cluster-1.3.5.tar.gz

    总的来说,`redis-py-cluster`是Python开发者在处理Redis集群时的重要工具,它提供了方便、健壮的接口,使得在Python应用中使用Redis集群变得容易和可靠。通过学习和掌握这个库,你可以更好地利用Redis集群的潜力,...

    Redis-x64-5.0.14.1

    - `EventLog.dll`:可能用于Windows事件日志相关的库文件。 - `redis-server.exe`:Redis服务器进程,负责处理客户端请求和管理数据。 - `redis-check-aof.exe`:检查并修复AOF文件的工具。 - `redis-check-rdb....

    关于 phpredis2.2.5-5.5 ts-vc11-x64 的分享版本

    Visual C++ 11 是微软推出的开发工具,用于编译 Windows 平台的 C++ 应用程序。使用 VC11 编译的 PHPRedis 可以确保与该版本的运行时环境兼容,避免可能出现的版本不匹配问题。 4. **64 位系统支持** 在 64 位...

    Redis-x64-3.0.504&Redis;-x64-3.2.100&redis;-desktop-manager-0.9.3.817

    windows系统redis安装文件,Redis-x64-3.0.504(稳定版);Redis-x64-3.2.100(预发行版);redis-desktop-manager-0.9.3.817(redis界面工具)。具体安装方法详见:...

    jizq-redis-mq

    jizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-...

    session 共享 tomcat-redis-session-manager 所需要的jar (绝对可用)

    Jedis提供了丰富的API,支持连接池、事务处理、发布/订阅等功能,使得在Java应用中操作Redis变得简单。 2. "commons-pool2-2.0.jar":Apache Commons Pool是一个对象池设计模式的实现,主要用于管理和复用昂贵资源...

    redis+redis-desktop-manager-0.8.3.3850+笔记

    Redis以网络服务的方式运行,允许客户端通过网络连接进行读写操作,广泛应用于缓存、消息队列、实时统计等多种场景。 **Redis的优势** 1. 高性能:Redis是基于内存的操作,读写速度极快。 2. 数据结构丰富:支持...

    Redis稳定版 Redis-x64-5.0.14.1.zip

    Redis,全称Remote Dictionary Server,是一款高性能的键值对存储系统,被广泛应用于缓存、数据库和消息中间件等场景。本次提供的版本是Redis的稳定版——Redis-x64-5.0.14.1,针对64位操作系统设计。在深入探讨...

Global site tag (gtag.js) - Google Analytics