redis因为器操作简单,高性能等特点深受开发者喜爱
开始我也觉得麻烦,例如最近做的log日志的功能,因为是微服务的logs日志,都在容器中运行服务。所以操作的接口多而且散离 ,每个都添加公共接口方法发现服务会增加耗时1000%,原来3秒左右的请求现在需要30多秒,因为使用了DDD思路拆分的微小功能请求多,同时并发加剧了磁盘IO的耗时。
说下大概的思路:将日志按照流的方式记录到log文件中,结束使用———————–或者=================分割。
每个请求之前会加上 tips 以及请求的方式,返回值前也会加上tips以及返回值。就是流水账似的。
一个请求的动作就是打开log文件,添加数据到结尾,关闭log文件。另外一个借口继续重复这个动作。
所以我用上了redis的list类型来做队列,一个请求压入一次。集满一定的数100或者其他的值,就清空一次队列。减少IO的读和写的次数。
先设置redis 使用 lpop和rpush或者lpush和rpop 他们是成对的使用的,其实这个功能我只用了lpush功能,往队列里压一个个的值
每次压完都会使用llen来看下队列的长度,如果到了我设置的阈值100,就使用保存的函数。
保存函数的逻辑是 使用之前的长度的值,使用lrange来回去0到长度的值的范围的队列,使用0,-1来获取整个队列的时候如果队列为空会抛异常,所以我会使用llen来判断下长度或者直接使用llen的值来做队尾值。
然后使用ltrim来清空队列 。
原先是计划做一个定时任务和队列一模一样的,在后面一个个的pop拉出队列,但是aws还在蹲着,这个功能被pending住了,等回复了可以用了再写个后续的队列式的log。使用的是cloudwatch的就没有IO问题了,都是数据流保存的方式,快捷方便,适合集群使用