当前位置: 首页 > news >正文

轻量级日志管理平台:Grafana Loki搭建及应用(详细篇)

前言

Grafana Loki是Grafana Lab团队提供的一个水平可扩展、高可用性、多租户的日志聚合系统,与其他日志系统不同的是,Loki最初设计的理念是为了为日志建立标签索引,而非将原日志内容进行索引。

现在目前成熟的方案基本上都是:Logstash + Elasticsearch + Kibana (LEK),但是LEK对资源要求比较高,少了8H8G用起来都是一卡一卡的,所以我们可以转向比较轻量的方案 Promtail + Loki + Grafana (PLG),本文就介绍PLG这种方案,可以对接各种云存储,比如Minio、S3、COS、OSS等等。

介绍

Grafana Loki

官方:Grafana Loki OSS | Log aggregation system

开源地址:GitHub - grafana/loki: Like Prometheus, but for logs.

Loki 是一个日志聚合系统,旨在存储和查询来自所有应用程序和基础设施的日志。

Grafana

官方:Grafana | Query, visualize, alerting observability platform

开源地址:GitHub - grafana/grafana: The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.

一个监控面板,查询、可视化、警报和理解您的数据,无论数据存储在何处。借助 Grafana,您可以通过美观、灵活的仪表板创建、探索和共享所有数据。

Promtail

Promtail 是一个代理,它将本地日志的内容发送到私有 Grafana Loki 。它通常部署到运行需要监视的应用程序的每台计算机。

开始部署

推荐配置2H4G比较丝滑。

参考官方部署手册:Quickstart to run Loki locally | Grafana Loki documentation

官方docker-compose快速部署架构图有下面这些组件:使用的最新版本3.1.x

轻量级日志管理平台Grafana Loki搭建及应用

flog :生成日志行。 flog是常见日志格式的日志生成器。

Grafana Alloy :从 flog 中刮取原木线,并通过网关将它们推送给 Loki。

网关(nginx),接收请求并根据请求的 URL 将它们重定向到适当的容器。

Loki 读取组件:运行查询前端和查询器。

Loki 写入组件:运行分发器和接收器。

Loki 后端组件:运行 Index Gateway、Compactor、Ruler、Bloom Compactor(实验性)和 Bloom Gateway(实验性)。

Minio :Loki 用它来存储索引和块。

Grafana :提供 Loki 中捕获的日志行的可视化。

上面官方采用的是读写分离以及minio存储后端,启动的组件比较多,本人调整了成单节点部署测试,想初步体验的可以使用我下面的 docker-compose.yaml 快速部署。

version: "3"networks:loki:services:
# minio对象存储minio:image: minio/minioentrypoint:- sh- -euc- |mkdir -p /data/loki-data && \mkdir -p /data/loki-ruler && \minio server --console-address ':9001' /dataenvironment:- MINIO_ROOT_USER=lcry- MINIO_ROOT_PASSWORD=www.51it.wang- MINIO_PROMETHEUS_AUTH_TYPE=public- MINIO_UPDATE=offports:- 19000:9000- 19001:9001volumes:- ./minio-data:/datahealthcheck:test: [ "CMD", "curl", "-f", "http://localhost:9000/minio/health/live" ]interval: 15stimeout: 20sretries: 5networks:- loki
# grafana面板grafana:image: grafana:latestenvironment:- GF_SECURITY_ADMIN_PASSWORD=www.51it.wangentrypoint:- sh- -euc- |mkdir -p /etc/grafana/provisioning/datasourcescat <<EOF > /etc/grafana/provisioning/datasources/ds.yamlapiVersion: 1datasources:- name: Lokitype: lokiaccess: proxyurl: http://backend:3100jsonData:httpHeaderName1: "X-Scope-OrgID"secureJsonData:httpHeaderValue1: "tenant-lcry"EOF/run.shports:- "3000:3000"healthcheck:test: [ "CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:3000/api/health || exit 1" ]interval: 10stimeout: 5sretries: 5networks:- loki# loki后端服务backend:image: grafana/loki:3.1.1depends_on:- miniovolumes:- ./loki-config.yaml:/etc/loki/config.yamlports:- "3100:3100"- "7946"- "9095"command: "-config.file=/etc/loki/config.yaml -target=all"healthcheck:test: [ "CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:3100/ready || exit 1" ]interval: 10stimeout: 5sretries: 5networks:- loki# 采集promtail:image:promtail:3.1.1depends_on:- backendvolumes:- ./log:/var/log- ./promtail-config.yaml:/etc/promtail/config.yamlcommand: -config.file=/etc/promtail/config.yamlnetworks:- loki

loki-config.yaml 配置文件:

auth_enabled: false
server:http_listen_address: 0.0.0.0http_listen_port: 3100memberlist:join_members: ["backend"]dead_node_reclaim_time: 30sgossip_to_dead_nodes_time: 15sleft_ingesters_timeout: 30sbind_addr: ['0.0.0.0']bind_port: 7946gossip_interval: 2sschema_config:configs:- from: 2021-08-01store: tsdbobject_store: s3schema: v13index:prefix: index_period: 24h
common:path_prefix: /lokireplication_factor: 1compactor_address: http://backend:3100storage:s3:endpoint: minio:9000insecure: truebucketnames: loki-dataaccess_key_id: lcrysecret_access_key: www.51it.wangs3forcepathstyle: truering:kvstore:store: memberlist
ruler:storage:s3:bucketnames: loki-rulercompactor:working_directory: /tmp/compactor

promtail-config.yaml 配置文件:

server:http_listen_port: 9080grpc_listen_port: 0positions:filename: /tmp/positions.yamlclients:- url: http://backend:3100/loki/api/v1/pushscrape_configs:- job_name: systemstatic_configs:- targets:- localhostlabels:job: varlogs__path__: /var/log/*log

然后执行命令:docker-compose up -d 运行

随后访问Grafana UI :http://服务器地址:3000/,账号:admin,密码:admin

Loki作为一个活跃的开源项目,持续地接受着来自全球开发者社区的贡献和维护,确保了它能够适应不断变化的云原生环境需求。对于那些寻求高效、经济的日志管理解决方案的开发团队和企业来说,Loki是一个值得深入探索的强大工具。

默认已经在配置文件中加入了loki数据源,直接点击测试是否可用:

轻量级日志管理平台Grafana Loki搭建及应用

直接预览日志,搜索自己手动添加的测试日志,没问题搭建完成。

轻量级日志管理平台Grafana Loki搭建及应用

物理部署protmail

若你需要采集其他机器上的日志,那么你只需要安装采集组件protmail,docker版本在上面已经演示过了,下面演示使用物理部署。

首先到loki发布版本这里下载对应操作系统的安装包:Releases · grafana/loki · GitHub

新建配置文件promtail-config.yaml

server:http_listen_port: 9080grpc_listen_port: 0positions:filename: /tmp/positions.yamlclients:- url: http://服务端IP:3100/loki/api/v1/pushscrape_configs:- job_name: service-logstatic_configs:- targets:- xxx.xxx.xxx.xxxlabels:job: varlogs__path__: /var/log/*log

编写启停脚本:ubuntu为例

start.sh

#!/bin/bash
nohup ./promtail-linux-amd64 -config.file=./promtail-config.yaml > ./server.log 2>&1 &
echo "$!" > pid

stop.sh

#!/bin/bash
kill -9 `cat pid`
echo "关闭成功!"

执行启动 ./start.sh

查看日志 tail -300f server.log ,无报错,观察Grafana UI日志已经能看到了则成功

更多protmail配置可参考链接:Promtail agent | Grafana Loki documentation

资源占用

最后我们来看下轻量级的Promtail + Loki + Grafana + Minio 整个容器占用的内存大小。

轻量级日志管理平台Grafana Loki搭建及应用

总共加起来300MB不到,相当的丝滑,若你只是需要收集一些自己折腾玩的服务日志太合适不过了。

总结

本文通过对比不同的日志平台,最终实战搭建了Promtail + Loki + Grafana + Minio,实打实的可以用于生产,但是要注意生产环境的HA部署以及参考官方文档进行优化,比如不同租户的请求速度频率的限制大小,日志的保留时长,最大上传的日志大小等等配置,希望本文对大家有所帮助。

相关文章:

轻量级日志管理平台:Grafana Loki搭建及应用(详细篇)

前言 Grafana Loki是Grafana Lab团队提供的一个水平可扩展、高可用性、多租户的日志聚合系统&#xff0c;与其他日志系统不同的是&#xff0c;Loki最初设计的理念是为了为日志建立标签索引&#xff0c;而非将原日志内容进行索引。 现在目前成熟的方案基本上都是&#xff1a;L…...

React和Vue.js的相似性和差异性是什么?

React和Vue.js都是现代前端开发中广泛使用的JavaScript框架&#xff0c;它们都旨在提高开发效率和组件化开发。以下是他们的一些相似性和差异性&#xff1a; 相似性 组件化&#xff1a;两者都支持组件化开发&#xff0c;允许开发者将UI拆分成独立的、可复用的组件。虚拟DOM&a…...

跨域 Cookie 共享

跨域请求经常遇到需要携带 cookie 的场景&#xff0c;为了确保跨域请求能够携带用户的认证信息或其他状态&#xff0c;浏览器提供了 withCredentials 这个属性。 如何在 Axios 中使用 withCredentials 为了在跨域请求中携带 cookie&#xff0c;需要在 Axios 配置中设置 withCr…...

全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之计数器与累加器(一)

学习背景&#xff1a; 在现实生活中一些需要计数的场景下我们会用到计数器&#xff0c;如空姐手里记录乘客的计数器&#xff0c;跳绳手柄上的计数器等。累加器是累加器求和&#xff0c;以得到最后的结果。计数器和累加器它们虽然是基础知识&#xff0c;但是应用广泛&#xff0…...

红黑树(Red-Black Tree)

一、概念 红黑树&#xff08;Red Black Tree&#xff09;是一种自平衡的二叉搜索树&#xff0c;通过添加颜色信息来确保在进行插入和删除操作时&#xff0c;树的高度保持在对数级别&#xff0c;从而保证了查找、插入和删除操作的时间复杂度为 O(log n)。这种树可以很好地解决普…...

火电厂可视化助力提升运维效率

图扑智慧火电厂综合管理平台实现对火电厂关键设备和系统的实时监控和数据分析。图扑可视化不仅优化了运维流程&#xff0c;还增强了安全管理&#xff0c;有效提升了电厂整体运营效率。...

application.yml 和 bootstrap.yml

在 Spring Boot 中&#xff0c;application.yml 和 bootstrap.yml 都是用来配置应用程序的属性文件&#xff0c;通常用于环境配置、服务配置等。但是&#xff0c;它们有一些不同的用途和加载顺序。以下是它们之间的主要区别&#xff1a; 1. application.yml&#xff1a; 主要…...

电子应用设计方案-49:智能拖把系统方案设计

智能拖把系统方案设计 一、引言 随着人们生活水平的提高和对清洁效率的追求&#xff0c;智能拖把作为一种创新的清洁工具应运而生。本方案旨在设计一款功能强大、操作便捷、清洁效果出色的智能拖把系统。 二、系统概述 1. 系统目标 - 实现自动清洁地面&#xff0c;减轻用户劳…...

Model Context Protocol 精选资源列表

Model Context Protocol 精选资源列表 Model Context Protocol 精选资源列表什么是MCP&#xff1f;教程社区说明服务器实现&#x1f4c2; 浏览器自动化☁️ 云平台&#x1f4ac; 社交&#x1f464; 数据平台&#x1f5c4;️ 数据库&#x1f4bb; 开发者工具&#x1f9ee; 数据科…...

Windows 11 12 月补丁星期二修复了 72 个漏洞和一个零日漏洞

微软于 2024 年 12 月为 Windows 11 发布的补丁星期二修复了其产品生态系统中的 72 个漏洞&#xff0c;包括 Windows 通用日志文件系统驱动程序中一个被积极利用的零日漏洞。 这个严重漏洞可以通过基于堆的缓冲区溢出授予攻击者系统权限&#xff0c;使其成为此版本中优先级最高…...

Python毕业设计选题:基于Hadoop 的国产电影数据分析与可视化_django+spider

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 免费电影管理 在线论坛 留言反馈 看板展示 系统…...

蓝桥杯我来了

最近蓝桥杯报名快要截止了&#xff0c;我们学校开始收费了&#xff0c;我们学校没有校赛&#xff0c;一旦报名缴费就是省赛&#xff0c;虽然一早就在官网上报名了&#xff0c;但是一直在纠结&#xff0c;和家人沟通&#xff0c;和朋友交流&#xff0c;其实只是想寻求外界的支持…...

大模型qiming面试内容整理-编码能力评估

编码能力评估是大模型相关岗位面试中非常关键的一环,面试官通常希望通过这个环节了解候选人对编程语言、算法与数据结构的掌握情况,以及其在实践中解决实际问题的能力。以下是编码能力评估的常见内容和类型,特别是针对机器学习、大模型和深度学习方向: 编程语言熟练度 ● P…...

Vivado ILA数据导出MATLAB分析

目录 ILA数据导出 分析方式一 分析方式二 有时候在系统调试时&#xff0c;数据在VIVADO窗口获取的信息有限&#xff0c;可结合MATLAB对已捕获的数据进行分析处理 ILA数据导出 选择信号&#xff0c;单击右键后&#xff0c;会有export ILA DATA选项&#xff0c;将其保存成CS…...

Linux内核 -- 字符设备之read write poll基本实现

Linux字符设备&#xff1a;read、write和poll函数实现及完整代码 1. read函数 原型 ssize_t read(struct file *file, char __user *buf, size_t count, loff_t *pos);实现步骤 检查用户缓冲区&#xff1a;使用copy_to_user将数据从内核空间复制到用户空间。返回已读取的字…...

linux部署ansible自动化运维

ansible自动化运维 1&#xff0c;编写ansible的仓库&#xff08;比赛已经安装&#xff0c;无需关注&#xff09; 1、虚拟机右击---设置---添加---CD/DVD驱动器---完成---确定 2、将ansible.iso的光盘连接上&#xff08;右下角呈绿色状态&#xff09; 3、查看光盘挂载信息 df -h…...

springboot421社区医疗服务可视化系统(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装社区医疗服务可视化系统软件来发挥其高效地信息处理的作用…...

vue渲染时闪光白屏问题怎么解决(笔记)

Vue渲染时出现闪光白屏问题&#xff0c;可能是因为页面内容需要较长时间才能加载完成&#xff0c;而在加载期间&#xff0c;页面会显示白屏或者空白内容&#xff0c;给用户体验带来负面影响。 解决方法&#xff1a; 为标签绑定 v-cloak 在样式中写 v-clock {displa&#xff…...

duxapp 2024-12-09 更新 PullView可以弹出到中间,优化CLI使用体验

UI库 修复 Button 禁用状态失效的问题Modal 组件即将停用&#xff0c;请使用 PullView 基础库 PullView side 新增 center 指定弹出到屏幕中间PullView 新增 duration 属性&#xff0c;指定动画时长新增 useBackHandler hook 用来阻止安卓端点击返回键 RN端 修复 windows …...

vue调试插件vue Devtools下载安装

Vue.js Devtools_6.6.3_Chrome插件下载_极简插件 进图官网点击推荐下载下载该调试工具 解压缩找到扩展程序开启开发者模式 将解压缩的文件拖拽到该页面空白处&#xff0c;点击添加扩展程序 点击详情允许访问文件网址 页面右键检查可以发现已经成功添加该页面调试插件...

.net core使用AutoMapper

AutoMapper 是一个用于 .NET 平台的对象映射工具&#xff0c;它简化了不同对象类型之间的转换过程。在软件开发中&#xff0c;尤其是在分层架构的应用程序里&#xff0c;常常需要在不同的对象模型之间进行数据传递&#xff0c;例如从数据库实体到视图模型、DTO&#xff08;数据…...

HTTP头注入

注入类漏洞经久不衰&#xff0c;多年保持在owasp Top 10的首位。今天就聊聊那些被人遗忘的http头注入。用简单的实际代码进行演示&#xff0c;让每个人更深刻的去认识该漏洞。 3|0HOST注入 在以往http1.0中并没有host字段&#xff0c;但是在http1.1中增加了host字段&#xff…...

110.【C语言】编写命令行程序(1)

目录 1.前置知识 "命令"的含义 运行C语言程序 2.介绍 main函数的参数 实验1 执行结果 实验2 执行结果 修改代码 实验3 分析 方法:遍历数组argv[]中的所有参数 执行结果 修改代码 执行结果 1.前置知识 "命令"的含义 WINR输入cmd,在cmd窗口下…...

k8s 之 StatefulSet

深入理解StatefulSet&#xff08;一&#xff09;&#xff1a;拓扑状态 k8s有状态与无状态的区别 无状态服务&#xff1a;deployment Deployment被设计用来管理无状态服务的pod,每个pod完全一致.什么意思呢? 无状态服务内的多个Pod创建的顺序是没有顺序的. 无状态服务内的多…...

PTA 7-2 从身份证号码中提取出出生年月

分数 12 作者 崔孝凤 单位 山东理工大学 输入一个18位的身份证号码&#xff0c;提取出年份和月份并输出&#xff0c;请判断输入的号码是否是18位&#xff0c;如果不是请提示"Invalid data,input again!"&#xff0c;并重新输入新的号码。 输入格式: 输入一个18位…...

Plugin - 插件开发04_Spring Boot中的SPI机制与Spring Factories实现

文章目录 Pre方案概览使用插件的好处Spring Boot中的SPI机制与Spring Factories实现1. Spring Boot中的SPI机制Spring Factories文件 2. Spring Factories实现原理3. Code3.1 定义一个服务接口3.2 定义 实现类3.3 配置 spring.factories 文件3.4 创建一个Controller来加载插件3…...

GUNS搭建

一、准备工作 源码下载&#xff1a; 链接: https://pan.baidu.com/s/1bJZzAzGJRt-NxtIQ82KlBw 提取码: criq 官方文档 二、导入代码 1、导入后端IDE 导入完成需要&#xff0c;需要修改yml文件中的数据库配置&#xff0c;改成自己的。 2、导入前端IDE 我是用npm安装的yarn npm…...

路径规划之启发式算法之十四:蜘蛛蜂优化算法(Spider Wasp Optimizer, SWO)

蜘蛛蜂优化算法(Spider Wasp Optimizer, SWO)是一种受自然界中蜘蛛蜂行为启发的元启发式智能优化算法。由Mohamed Abdel-Basset等人于2023年提出,算法模拟了雌性蜘蛛蜂的狩猎、筑巢和交配行为,具有独特的更新策略,适用于具有不同探索和开发需求的广泛优化问题。 一、算法背…...

OpenGL ES详解——多个纹理实现混叠显示

目录 一、获取图片纹理数据 二、着色器编写 1. 顶点着色器 2. 片元着色器 三、绑定和绘制纹理 1. 绑定纹理 2. 绘制纹理 四、源码下载 一、获取图片纹理数据 获取图片纹理数据代码如下&#xff1a; //获取图片1纹理数据 mTextureId loadTexture(mContext, R.mipmap.…...

Java多线程与线程池技术详解(八)

《星游记》 “如果只有傻瓜才相信梦想&#xff0c;那么就叫我大傻瓜吧&#xff01;” 《一人之下》 “想走的路不好走&#xff0c;想做人不好做&#xff0c;都说是身不由己&#xff0c;不是废话么。己不由心&#xff0c;身又岂能由己&#xff01;” 目录 上一篇博客习题讲解 编…...

2024年12月11日Github流行趋势

项目名称&#xff1a;maigret 项目维护者&#xff1a;soxoj, kustermariocoding, dependabot, fen0s, cyb3rk0tik项目介绍&#xff1a;通过用户名从数千个站点收集个人档案信息的工具。项目star数&#xff1a;12,055项目fork数&#xff1a;870 项目名称&#xff1a;uv 项目维护…...

ThinkPHP 6.0 PHP新手教程

1、系统配置文件 下面系统自带的配置文件列表及其作用&#xff1a; 配置文件名描述app.php应用配置cache.php缓存配置console.php控制台配置cookie.phpCookie配置database.php数据库配置filesystem.php磁盘配置lang.php多语言配置log.php日志配置middleware.php中间件配置rou…...

【Excel学习记录】02-单元格格式设置

1.单元格格式工具美化表格 单元格格式位置 选中单元格&#xff0c;右键→设置单元格格式 合并居中 跨越合并 字体类型、大小、颜色、填充底纹、边框 斜线 软回车&#xff1a;alt enter 格式刷 2.单元格数字格式 格式不影响数值&#xff0c;只是展示形式 日期本质也是数…...

Paimon Tag和Branch创建文件存储过程

结论&#xff1a; 如果data-file被引用则不会被压缩&#xff0c;压缩仅针对未被引用的文件&#xff0c;创建tag时候根据当前快照进行创建 1、实际表和Manifest的内容 查看tag的内容 select * from table$tags;或者直接查看tag ossutil cat oss://test-dataware/warehouse/te…...

HCIA笔记8--DHCP、Telnet协议

1. DHCP介绍 对于主机的网络进行手动配置&#xff0c;在小规模的网络中还是可以运作的&#xff0c;但大规模网络是无力应对的。因此就有了DHCP协议来自动管理主机网络的配置。 DHCP(Dynamic Host Configuration Protocol): 动态主机配置协议&#xff0c;主要需要配置的参数有…...

Tableau数据可视化与仪表盘搭建

1.Tableau介绍 可视化功能 数据赋能 数据赋能就是将我们的数据看板发布到我们的线上去 这里的IP地址是业务部门可以通过账号密码登入的 我们也可以根据需要下载&#xff0c;选中并点击下载即可 下载下来之后&#xff0c;自己就能根据数据进行自定义的分析 也可以下载图片 还有…...

Django结合websocket实现分组的多人聊天

其他地方和上一篇大致相同&#xff0c;上一篇地址点击进入, 改动点1&#xff1a;在setting.py中最后再添加如下配置&#xff1a; # 多人聊天 CHANNEL_LAYERS {"default":{"BACKEND": "channels.layers.InMemoryChannelLayer"} }因此完整的se…...

自动驾驶控制与规划——Project 1: 车辆纵向控制

目录 零、任务介绍一、环境配置1.1 CARLA的配置1.2 Docker Ubuntu 20.04 ROS2 Foxy的配置 二、算法2.1 定速巡航2.2 自适应巡航2.3 离散PID控制 三、代码实现3.1 代码补全3.2仿真验证 零、任务介绍 课程主页 配置Carla仿真器配置carla-ros-bridge补全src\ros-bridge\carla_s…...

基于python实现自动化的验证码识别:探索与实践

基于python实现自动化的验证码识别&#xff1a;探索与实践 一、验证码的类型及特点&#xff08;一&#xff09;图像验证码&#xff08;二&#xff09;短信验证码&#xff08;三&#xff09;语音验证码 二、验证码识别的方法*&#xff08;一&#xff09;传统图像处理方法&#x…...

如何保证消息队列的高可用?(RabbitMQ)

RabbitMQ 是基于主从&#xff08;非分布式&#xff09;做高可用性的&#xff0c;RabbitMQ 有三种模式&#xff1a;单机模式、普通集群模式、镜像集群模式 1、单机模式&#xff1a;一般没人生产用单机模式 2、普通集群模式&#xff1a; 普通集群模式用于提高系统的吞吐量&…...

es的join是什么数据类型

在 Elasticsearch 中,parent 并不是一个独立的数据类型,而是与 join 数据类型一起使用的一个概念。join 数据类型用于在同一个索引中建立父子文档之间的关系,允许你在一个索引内表示层级结构或关联关系。通过 join 字段,你可以定义不同类型的文档(如父文档和子文档),并指…...

爬虫基础之代理的基本原理

在做爬虫的过程中经常会遇到一种情况&#xff0c;就是爬虫最初是正常运行、正常抓取数据的&#xff0c;一切看起来都是那么美好&#xff0c;然而一杯茶的工夫就出现了错误&#xff0c;例如 403 Forbidden&#xff0c;这时打开网页一看&#xff0c;可能会看到“您的IP访问频率太…...

golang实现简单的reids服务2

golang实现redis兼容的redis服务实现redis兼容的redis服务思路 golang实现redis兼容的redis服务 之前做的redis服务是通过tcp封装的自定义协议 原版项目地址:https://github.com/dengjiayue/my-redis.git 那么能不能实现一个redis兼容的redis服务,这样一般的redis包也可以调…...

CSS常用的尺寸单位

像素px 以屏幕上的一个点为单位&#xff0c;比较稳定和精确用的最多 em 以字体大小为参考&#xff0c;&#xff08;是自身字体大小的倍数&#xff09;当自身的字体大小改变时&#xff0c;em也会随着改变em * font-size px rem 以根元素 < html > 作为参考&#xff…...

计算机网络 备查

OSI 七层模型 七层模型协议各层实现的功能 简要 详细 TCP/IP协议 组成 1.传输层协议 TCP 2.网络层协议 IP 协议数据单元&#xff08;PDU&#xff09;和 封装 数据收发过程 数据发送过程 1. 2.终端用户生成数据 3.数据被分段&#xff0c;并加上TCP头 4.网络层添加IP地址信息…...

JavaEE 【知识改变命运】05 多线程(4)

文章目录 单例模式什么是单例模式饿汉模式懒汉模式多线程- 懒汉模式分析多线程问题第一种添加sychronized的方式第二种添加sychronized的方式改进第二种添加sychronized的方式&#xff08;DCL检查锁&#xff09; 阻塞队列什么是阻塞队列什么是消费生产者模型标准库中的阻塞队列…...

迭代器和生成器

一、迭代器&#xff08;Iterator&#xff09; 1. 什么是迭代器&#xff1f; 迭代器是一个可以在某一集合&#xff08;如列表、元组等&#xff09;中逐个访问元素的对象。它提供了一个方法&#xff0c;可以记住遍历的位置&#xff0c;每次取出一个元素&#xff0c;直到所有元素…...

小发现,如何高级的顺序输出,逆序输出整数的每一位(栈,队列)

当我还是初学者的时候&#xff0c;我经常思考有没有比慢慢求每一位数字然后考虑正序&#xff0c;逆序输出要快的办法...长期琢磨&#xff0c;必有所获&#xff01; 我刚学数据结构的时候还没意识到栈&#xff0c;队列还能这样用&#xff0c;虽然说有点杀鸡用牛刀的感觉&#x…...

前端换行、空格的多种表现形式

换行 1、<br> 标签 这是最直接的方式&#xff0c;用于在文本中插入一个简单的换行。<br> 标签是一个空元素&#xff0c;意味着它不需要结束标签。 示例&#xff1a; <p>这是第一行。<br>这是第二行。</p>2、CSS white-space 属性 通过CSS的w…...

自己总结:selenium高阶知识

全篇大概10000字&#xff08;含代码&#xff09;&#xff0c;建议阅读时间30min 一、等待机制 如果有一些内容是通过Ajax加载的内容&#xff0c;那就需要等待内容加载完毕才能进行下一步操作。 为了避免人为操作等待&#xff0c;会遇到的问题&#xff0c; selenium将等待转换…...