引言
小小的 Redis 大大的不简单,本文将结合风控名单服务在使用 Redis 存储数据时的数据结构设计及优化,并详细分析 redis 底层实现对数据结构选型的重要性。
上篇文章 性能调优——小小的 log 大大的坑 已将详细的介绍了高并发下,不正确的使用日志姿势,可能会导致服务性能急剧下降问题。文末也给各位留下了解决方案——日志级别动态调整。
本文将详细介绍“动态日志”的实现原理及源码,希望各位能在今后的生产环境中应对日志问题能“得心应手”!
日志的重要性不言而喻,是我们排查问题,解决 BUG 的重要手段之一,但是在高并发环境下,又会存在悖论:
大量打印日志,消耗 I/O,导致 CPU 占用率高;减少日志,性能是下来了,但是排查问题的链路断掉了。
痛点:一方面需要借助日志可快速排查问题,另一方面要兼顾性能,二者能否得兼?
那么本文的动态日志调整实现就是为了能解决这个痛点所构思开发的。
“只有被线上服务问题毒打过的人才明白日志有多重要!”
我先说结论,谁赞成,谁反对?如果你深有同感,那恭喜你是个社会人了:)
日志对程序的重要性不言而喻,轻巧、简单、无需费脑,程序代码中随处可见,帮助我们排查定位一个有一个问题问题。但看似不起眼的日志,却隐藏着各式各样的“坑”,如果使用不当,不仅不能帮助我们,反而会成为服务“杀手”。
本文主要介绍生产环境日志使用不当导致的“坑”及避坑指北,高并发系统下尤为明显。同时提供一套实现方案能让程序与日志“和谐共处”。
本章节我将介绍过往线上遇到的日志问题,并逐个剖析问题根因。
场景
1 | // 格式1 |
如上三种写法,我相信大家或多或少都在项目代码中看到过,那么他们之前有区别呢,会对性能造成什么影响?
如果此时关闭 DEBUG 日志级别,差异就出现了,格式 1 依然还是要执行字符串拼接,即使它不输出日志,属于浪费。