需求
现在在开发应用审计系统的原型,功能就是旁路的方式对http协议进行还原、审计。除了提取基本的http头信息外,还要对负载进行还原存储。当网络流量较大时,如何能快速存储,并且支持跨进程搜索就成了问题。
方案
了解了内存数据库之后,决定采用redis作为中间件缓存最新的数据,并定时归档到mongodb的方案。
例子
存储
这里使用了python的redis库操作数据库。
使用http请求头的第一行内容作为key,将还原出的http对象经过cPickle序列化后存储进去。
1
2
3
4
5
6
7
8import redis
pool = redis.ConnectionPool(host='127.0.0.1', port=6379,db=1)
r = redis.Redis(connection_pool=pool)
#存对象
HTTP_COM.__module__ = "common"
data = cPickle.dumps(self)
r.hmset(self.request.first_line.split(" ")[1],{"data":data})
查询
1
2
3
4
5
6
7
8import redis
pool = redis.ConnectionPool(host='192.168.1.101', port=6379,db=1)
r = redis.Redis(connection_pool=pool)
data = r.hgetall("/zxpic_imtt/2018/03/07/1600/originalimage/160156_2551183010_5_700_275.jpg")
#取出对象
from common import TCPSTREAM,TCPSTREAM_POOL,HTTP_POOL,TCP_POOL,HTTPRequest,HTTPResponse,HTTP_COM
import cPickle
obj=cPickle.loads(data["data"])