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

短链接服务

一 功能描述

1.短链接是将长连接转化为短连接使得链接变得美观清爽,让用户点击率更高,同时规避原始链接中一些关键词、域名屏蔽等问题,最终利用短链每次跳转都需要经过后端的特性,在跳转过程中做异步埋点,用于效果数据统计

2.本系统支持,同一个短链,不同浏览器跳转不同链接地址(如:谷歌,火狐,360浏览器等),不同区域跳转不同链接地址(如:cn,us等),不同系统跳转不同链接地址(如android,ios,windows等),不同平台跳转不同地址(如:手机端,pc端)

二 难点

1.短链接生成规则(保证唯一且简短)
这里的"短链码",在本文中它的含义是短链接URL的路径部分(为了节省长度,除了协议和域名部分,短链的URL只有第一段路径):
其中,协议部分基本是固定为https://(从安全性来看不建议使用http://),短链域名可以购买尽可能长度短的域名如t.cn,不过有先见之明的资本家一般会把所有优质的短域名买下并且把价格提到很高,所以域名的长度基本也是很难控制的因素,剩下可控的就是短链码部分。短链码部分是可控的,但因为它是URL的一部分,只要确保所使用的字符不会被URL编码转义,那么长度是人为可控的。假设我们使用的是26个字母的大小写,加上10个数字,那么对于N位压缩码可以表示的最大组合数量为:


N = 4,组合数为62 ^ 4 = 14_776_336,147万接近148万

N = 5,组合数为62 ^ 5 = 916_132_832,9.16亿左右

N = 6,组合数为62 ^ 6 = 56_800_235_584,568亿左右

下面是短链码生成规则:

  public String getCompressionCode(int length) {long sequence = snowflakeHelper.next();String code = ConversionUtils.X.encode62(sequence);if(length>code.length()) {throw new RuntimeException("输入的压缩码长度超过序列长度,压缩码长度不能超过"+code.length());}code = code.substring(code.length() - length);return code;}

2.重定向安全与高并发设计
黑名单,限流等手段的设计保证了重定向的安全性,同时缓存的设计保证了并发的性能,布隆过滤器对恶意请求的拦截保证了系统的稳定性

三 代码结构

在这里插入图片描述

四 架构设计

在这里插入图片描述

五 技术栈

1.springboot
2.redis缓存
3.ipbd,ip2region
4.布隆过滤器

六 项目演示

在这里插入图片描述
在这里插入图片描述

七 部分代码

1.限流代码

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ApiRateLimiter {String name();
}
@Component
@Aspect
public class ApiRateLimitAspect {@Autowiredprivate RedissonClient redissonClient;@Autowiredprivate ShlinkProperties shlinkProperties;@Pointcut("@annotation(com.zenglx.shlink.server.helper.aop.ApiRateLimiter)")public void rateLimitPoint() {}@Around("rateLimitPoint()")public Object aroundAop(ProceedingJoinPoint joinPoint) throws Throwable {if(shlinkProperties.getRateLimit().getEnabled()) {Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();ApiRateLimiter apiRateLimiter = AnnotationUtils.getAnnotation(method, ApiRateLimiter.class);if (null == apiRateLimiter) {return joinPoint.proceed();}ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();String accessKey = request.getHeader(ShlinkConstant.ACCESS_KEY);List<String> rateLimtAccessKeyList = shlinkProperties.getRateLimit().getAccessKeyList();if(rateLimtAccessKeyList.contains(accessKey)) {log.debug("限流启动...:{}",accessKey);long rate = shlinkProperties.getRateLimit().getRate();long rateInterval = shlinkProperties.getRateLimit().getRateInterval();//时效时间,分钟long expire = shlinkProperties.getRateLimit().getExpire();RRateLimiter rateLimiter = redissonClient.getRateLimiter(accessKey);//设置过期时间rateLimiter.expire(Duration.ofMinutes(expire));//1s内总许可数不超过3个rateLimiter.trySetRate(RateType.OVERALL, rate, rateInterval, RateIntervalUnit.SECONDS);//申请1份许可,如果2s内未申请到就放弃if (rateLimiter.tryAcquire(shlinkProperties.getRateLimit().getPermits(), shlinkProperties.getRateLimit().getTimeout(), TimeUnit.SECONDS)) {return joinPoint.proceed();} else {throw new RuntimeException("服务器繁忙,请稍后重试......");}} else {return joinPoint.proceed();}} else {return joinPoint.proceed();}}
}
  @ApiRateLimiter(name = "generator")public SingleResult<ShortLinkVo> generator(@RequestBody ShortLinkFo shortLinkFo, HttpServletRequest request) {String accessKey = request.getHeader(ShlinkConstant.ACCESS_KEY);ShortLinkVo shortLinkVo = shortLinkService.generator(shortLinkFo,accessKey);return SingleResult.success(shortLinkVo);}

2.布隆过滤器使用

@Order(value = Integer.MIN_VALUE + 2)
@Component
public class BloomFilter implements WebFilter, InitializingBean,BaseFilter {@Autowiredprivate WebFluxServerResponseWriter webFluxServerResponseWriter;@Autowiredprivate ShortLinkMapper shortLinkMapper;@Autowiredprivate ShlinkProperties shlinkProperties;@Autowiredprivate RedissonClient redissonClient;private RBloomFilter<Object> bloomFilter;@Override@NonNullpublic Mono<Void> filter(ServerWebExchange exchange, @NonNull WebFilterChain chain) {ServerHttpRequest request = exchange.getRequest();String path = request.getPath().toString();if(ignore(path)) {return chain.filter(exchange);}if(shlinkProperties.getBloom().getEnabled()) {String compressCode = path.replace("/","");if(bloomFilter.contains(compressCode)) {return chain.filter(exchange);}log.warn("请求异常,bloom异常压缩码[compressCode:{}:{}]", compressCode, request.getURI());return webFluxServerResponseWriter.redirect(exchange, shlinkProperties.getBloom().getErrorPage());} else {return chain.filter(exchange);}}@Overridepublic void afterPropertiesSet() throws Exception {if(shlinkProperties.getBloom().getEnabled()) {bloomFilter = redissonClient.getBloomFilter(CacheKey.BLOOM_FILTER.getKey());if(!bloomFilter.isExists()) {bloomFilter.tryInit(shlinkProperties.getBloom().getExpectedSize(),shlinkProperties.getBloom().getFpp());log.warn("bloom过滤器初始化......");}//查询最近两天的,初始化List<String> compressCodeList = shortLinkMapper.listCompressCode();if(CollectionUtils.isEmpty(compressCodeList)) {bloomFilter.add("init");}Optional.of(compressCodeList).orElse(new ArrayList<>()).forEach(compressCode -> {if(!bloomFilter.contains(compressCode)) {bloomFilter.add(compressCode);}});log.warn("bloom过滤器初始化......完成,数量:{}",compressCodeList.size());}}
}

相关文章:

短链接服务

一 功能描述 1.短链接是将长连接转化为短连接使得链接变得美观清爽&#xff0c;让用户点击率更高&#xff0c;同时规避原始链接中一些关键词、域名屏蔽等问题&#xff0c;最终利用短链每次跳转都需要经过后端的特性&#xff0c;在跳转过程中做异步埋点&#xff0c;用于效果数据…...

【Vue3学习】setup语法糖中的ref,reactive,toRef,toRefs

在 Vue 3 的组合式 API&#xff08;Composition API&#xff09;中&#xff0c;ref、reactive、toRef 和 toRefs 是四个非常重要的工具函数&#xff0c;用于创建和管理响应式数据。 一、ref 用ref()包裹数据,返回的响应式引用对象&#xff0c;包含一个 .value 属性&#xff0…...

Halcon中dots_image(Operator)算子原理及应用详解

在HALCON中&#xff0c;dots_image算子是一个用于增强图像中圆点效果的强大工具&#xff0c;特别适合于点的分割&#xff0c;以及OCR&#xff08;光学字符识别&#xff09;应用程序中增强点状印刷字体。以下是对dots_image (ImageResult, DotImage, 5, ‘dark’, 2)算子原理及应…...

【C语言】库函数常见的陷阱与缺陷(四):内存内容操作函数[5]--memchr

C语言中的memchr函数用于在内存块中搜索一个特定的字符(实际上是unsigned char类型的值),并返回该字符第一次出现的指针。虽然这个函数在内存搜索中非常有用,但它也存在一些陷阱。 一、功能与用法 功能:memchr函数在指定的内存块中搜索第一次出现的特定字符,并返回一个…...

【P2P】【Go】采用go语言实现udp hole punching 打洞 传输速度测试 ping测试

服务器端 udpserver/main.go package mainimport ("fmt""net""sync""sync/atomic" )var (clientCounter uint64 0 // 客户端连接计数器mu sync.Mutex )func main() {addr, err : net.ResolveUDPAddr("udp", &q…...

【附源码】Electron Windows桌面壁纸开发中的 CommonJS 和 ES Module 引入问题以及 Webpack 如何处理这种兼容

背景 在尝试让 ChatGPT 自动开发一个桌面壁纸更改的功能时&#xff0c;发现引入了一个 wallpaper 库&#xff0c;这个库的入口文件是 index.js&#xff0c;但是 package.json 文件下的 type:"module"&#xff0c;这样造成了无论你使用 import from 还是 require&…...

【SpringBoot 调度任务】

在 Spring Boot 中实现调度任务&#xff08;Scheduled Tasks&#xff09;&#xff0c;通过使用 EnableScheduling 和 Scheduled 注解来完成。 添加依赖启用调度任务支持创建调度任务运行应用程序 添加依赖 pom.xml 文件中有以下依赖项&#xff1a; <dependency><gro…...

Android v4和v7冲突

android.useAndroidXtrue android.enableJetifiertruev4转成AndroidX...

【HarmonyOS之旅】HarmonyOS开发基础知识(一)

目录 1 -> 应用基础知识 1.1 -> 用户应用程序 1.2 -> 用户应用程序包结构 1.3 -> Ability 1.4 -> 库文件 1.5 -> 资源文件 1.6 -> 配置文件 1.7 -> pack.info 1.8 -> HAR 2 -> 配置文件简介 2.1 -> 配置文件的组成 3 -> 配置文…...

【排序算法】——插入排序

目录 前言 简介 基本思想 1.直接插入排序 2.希尔排序 代码实现 1.直接插入排序 2.希尔排序 总结 1.时空复杂度 2.稳定性 尾声 前言 排序(Sorting) 是计算机程序设计中的一种重要操作&#xff0c;它的功能是将一个数据元素&#xff08;或记录&#xff09;的任意序列&…...

Vue todoList小项目记录

最初代码 简单搭一个vue2的小项目 App.vue <template><div id"app"><!-- 容器 --><div class"todo-container"><div class"todo-wrap"><!-- 头部 --><MyHeader :addTodo"addTodo"></…...

SQL题目笔记

一、根据需求创建表&#xff08;设计合理的数据类型、长度)...

电脑开机提示error loading operating system怎么修复?

前一天电脑还能正常运行&#xff0c;但今天启动时却显示“Error loading operating system”&#xff08;加载操作系统错误&#xff09;。我已经仔细检查了硬盘、接线、内存、CPU和电源&#xff0c;确认这些硬件都没有问题。硬盘在其他电脑上可以正常使用&#xff0c;说明不是硬…...

Nginx 在不同操作系统下的安装指南

Nginx 在不同操作系统下的安装指南 一、Linux 系统下 Nginx 的安装 &#xff08;一&#xff09;基于 Ubuntu 系统 更新软件包列表 打开终端&#xff0c;首先执行sudo apt-get update命令。这一步是为了确保系统的软件包列表是最新的&#xff0c;能够获取到最新版本的 Nginx 及…...

景联文科技入选中国信通院发布的“人工智能数据标注产业图谱”

近日&#xff0c;由中国信息通信研究院、中国人工智能产业发展联盟牵头&#xff0c;联合中国电信集团、沈阳市数据局、保定高新区等70多家单位编制完成并发布《人工智能数据标注产业图谱》。景联文科技作为人工智能产业关键环节的代表企业&#xff0c;入选图谱中技术服务板块。…...

Nginx - 负载均衡及其配置(Balance)

一、概述 定义&#xff1a;在多个计算机&#xff08;计算机集群&#xff09;、网络连接、CPU、磁盘驱动器或其他资源中分配负载目标&#xff1a;最佳化资源使用、最大化吞吐率、最小化响应时间、避免过载功能&#xff1a;使用多台服务器提供单一服务&#xff08;服务器农场&am…...

MySQL存储引擎-存储结构

Innodb存储结构 Buffer Pool(缓冲池)&#xff1a;BP以Page页为单位&#xff0c;页默认大小16K&#xff0c;BP的底层采用链表数据结构管理Page。在InnoDB访问表记录和索引时会在Page页中缓存&#xff0c;以后使用可以减少磁盘IO操作&#xff0c;提升效率。 ○ Page根据状态可以分…...

数据资产入表 解锁智慧城市新潜力

在21世纪的科技浪潮中&#xff0c;智慧城市以信息技术为核心&#xff0c;以数据为血液&#xff0c;通过智能化、精细化的管理&#xff0c;让城市变得更加智慧、更加宜居。而数据资产入表&#xff0c;正是这一变革中的关键一环&#xff0c;它不仅推动了科技的进步&#xff0c;更…...

按类别调整目标检测标注框的写入顺序以优化人工审核效率

引言 在目标检测数据标注审核过程中&#xff0c;我们常常会遇到以下情况&#xff1a;某些小目标的检测框嵌套在大目标检测框内&#xff0c;而在模型进行预标注后&#xff0c;这些小目标的框可能被写入到了大目标框的下层。在人工审核阶段&#xff0c;标注审核人员需要手动移动…...

深入理解YOLO系列目标检测头的设定方式

目录 YOLOv1的检测头结构 1. 网络结构概述 2. 结构细节 3. 优缺点 YOLOv2的检测头结构 1. 网络结构概述 2. 结构细节 3. 优缺点 YOLOv3的检测头结构 1. 网络结构概述 2. 结构细节 3. 优缺点 总结&#xff1a;YOLO 系列检测头的结构演变 YOLOv1的检测头结构 1. 网络…...

智慧农业物联网解决方案:道品科技水肥一体化

在当今科技飞速发展的时代&#xff0c;农业也迎来了一场深刻的变革。智慧农业物联网解决方案中的水肥一体化技术&#xff0c;正逐渐成为现代农业发展的重要助推器。它不仅提高了农业生产效率&#xff0c;还实现了精准施肥和灌溉&#xff0c;为农业可持续发展带来了新的机遇。 …...

单片机上电后程序不运行怎么排查问题?

1.电源检查。使用电压表测量单片机的电源电压是否正常&#xff0c;确保电压在规定的范围内&#xff0c;如常见的5V。 2.复位检查。检查复位引脚的电压是否正常&#xff0c;在单片机接通电源时&#xff0c;复位引脚通常会有一个高电平&#xff0c;按下复位按钮时&#xff0c;复位…...

OceanBase 数据库分布式与集中式 能力

OceanBase分布式数据库与集中式数据库的差异 分布式数据库能解决金融行业最有挑战的高并发低延迟的核心交易系统的稳定性、扩展性、高性能问题。OB之所以一直强调分布式是说它具备很强的数据处理能力&#xff0c;当然从OB4.0开始也支持集中式了。 在实际业务场景中20%是分布式…...

C#多线程

C#中的多线程编程是开发高效并发应用程序的关键技术之一&#xff0c;它允许程序同时执行多个任务&#xff0c;从而提升应用程序的响应速度和性能。为了更好地理解C#中的多线程使用和定义&#xff0c;我们可以从以下几个方面来探讨&#xff1a;线程的基本概念、创建线程的方法、…...

Apache HTTP 服务器深度性能优化

引言 在前几篇文章中&#xff0c;我们讨论了基础和高级性能优化策略。现在&#xff0c;我们将深入探讨一些具体的优化实践&#xff0c;帮助您实现更精细的控制&#xff0c;并确保Apache服务器在各种复杂环境中都能保持最佳性能。 1. 细粒度的Apache配置调整 1.1 MPM参数微调…...

芯片级IO (Pad) Ring IP Checklist

SoC top顶层数字后端实现都会涉及到IO Ring &#xff08;PAD Ring&#xff09;的设计。这里面包括VDD IO,VDDIO IO, Signal IO, Corner IO&#xff0c;Filler IO&#xff0c;IO power cut cell等等。 数字后端零基础入门系列 | Innovus零基础LAB学习Day2 数字IC后端实现TOP F…...

无界wujie网址

文档网址&#xff1a;微前端是什么 | 无界 demo&#xff1a;https://wujie-micro.github.io/demo-main-vue/react17...

vulnhub靶场【DriftingBlues】之6

前言 靶机&#xff1a;DriftingBlues-6&#xff0c;IP地址192.168.1.63&#xff0c;因为重装靶机后期为192.168.1.64 攻击&#xff1a;kali&#xff0c;IP地址192.168.1.16 都采用虚拟机&#xff0c;网卡为桥接模式 主机发现 使用arp-scan -l或netdiscover -r 192.168.1.1…...

心情追忆- Nginx + OpenResty 构建高可用网关

之前&#xff0c;我独自一人开发了一个名为“心情追忆”的小程序&#xff0c;旨在帮助用户记录日常的心情变化及重要时刻。我从项目的构思、设计、前端&#xff08;小程序&#xff09;开发、后端搭建到最终部署。经过一个月的努力&#xff0c;通过群聊分享等方式&#xff0c;用…...

太速科技-527-基于3U VPX XCZU15EG+TMS320C6678的信号处理板

基于3U VPX XCZU15EGTMS320C6678的信号处理板 一、板卡概述 本板卡系我司自主研发的基于3U VPX风冷、导冷架构的信号处理板&#xff0c;适用于高速图像处理等。芯片采用工业级设计。 板卡采用标准3U VPX架构&#xff0c;板上集成一片Xilinx公司ZynqUltraScale系列F…...

Vue3源码笔记阅读1——Ref响应式原理

本专栏主要用于记录自己的阅读源码的过程,希望能够加深自己学习印象,也欢迎读者可以帮忙完善。接下来每一篇都会从定义、运用两个层面来进行解析 定义 运用 例子:模板中访问ref(1) <template><div>{{str}}</div> </template> <script> impo…...

多音轨视频使用FFmpeg删除不要音轨方法

近期给孩子找宫崎骏动画&#xff0c;但是有很多是多音轨视频但是默认的都是日语&#xff0c;电视上看没办法所以只能下载后删除音轨文件只保留中文。 方法分两步&#xff0c;先安装FFmpeg在转文件即可。 第一步FFmpeg安装 FFmpeg是一个开源项目&#xff0c;包含了处理视频的…...

AtomGit 开源生态应用开发赛报名开始啦

目录 1、赛项背景2、赛项信息3、报名链接4、赛题一&#xff1a;开发者原创声明&#xff08;DCO&#xff09;应用开发赛题要求目标核心功能 5、赛题二&#xff1a;基于 OpenHarmony 的开源社区应用开发简介赛题要求 6、参赛作品提交初赛阶段决赛阶段 7、参赛作品提交方式 1、赛项…...

使用 NVIDIA DALI 计算视频的光流

引言 光流&#xff08;Optical Flow&#xff09;是计算机视觉中的一种技术&#xff0c;主要用于估计视频中连续帧之间的运动信息。它通过分析像素在时间维度上的移动来预测运动场&#xff0c;广泛应用于目标跟踪、动作识别、视频稳定等领域。 光流的计算传统上依赖 CPU 或 GP…...

C语言学习day23:WriteProcessMemory函数/游戏内存数据修改工具开发

简言&#xff1a; 上一章我们说了获取应用进程的某数据&#xff08;data&#xff09;&#xff0c;这一章我们就说说修改内存地址的数据。想要修改内存&#xff0c;那么就需要我们另一个WinAPI函数&#xff1a;WriteProcessMemory()函数。 WriteProcessMemory()函数 函数原型…...

利用 html_table 函数轻松获取网页中的表格数据

背景/引言 在数据爬取的过程中&#xff0c;网页表格数据往往是研究人员和开发者的重要目标之一。无论是统计分析、商业调研还是信息整理&#xff0c;表格数据的结构化特性都使其具有较高的利用价值。然而&#xff0c;如何快速、准确地从网页中提取表格数据始终是爬虫技术的一个…...

Postman接口测试:全局变量/接口关联/加密/解密

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 全局变量和环境变量 全局变量&#xff1a;在postman全局生效的变量&#xff0c;全局唯一 环境变量&#xff1a;在特定环境下生效的变量&#xff0c;本环境内唯一 …...

手机银行模拟器,一款高仿真银行app的模拟器,可以修改姓名 卡号 余额 做转账记录 做流水

&#x1f4f1;手机银行模拟器让你自由定制你的金融生活。无论是流水账单、金额&#xff0c;还是个人信息&#xff0c;一切都可以按照你的意愿来模拟修改&#xff0c;让你体验模拟器带来的快乐&#xff01; 链接&#xff1a;https://pan.quark.cn/s/c2f614f3447f 提取码&#…...

HT7183:16V, 4.5A的DC-DC升压转换器,常用在数码相机里

HT7183描述&#xff1a; HT7183是一款高功率异步升压转换器&#xff0c;集成120mΩ功率开关管&#xff0c;为便携式系统提供高效的小尺寸解决方案。具有2.6V至5.5V输入电压范围&#xff0c;可为各类不同供电的应用提供支持。该器件具备3A开关电流能力&#xff0c;并且能够提供高…...

Cobalt Strike 4.8 用户指南-第十四节 Aggressor 脚本

14.1、什么是Aggressor脚本 Aggressor Script 是Cobalt Strike 3.0版及更高版本中内置的脚本语言。Aggressor 脚本允许你修改和扩展 Cobalt Strike 客户端。 历史 Aggressor Script 是 Armitage 中开源脚本引擎Cortana的精神继承者。Cortana 是通过与 DARPA 的网络快速跟踪计…...

【Qt】QWidget中的常见属性及其功能(二)

目录 六、windowOpacity 例子&#xff1a; 七、cursor 例子&#xff1a; 八、font 九、toolTip 例子&#xff1a; 十、focusPolicy 例子&#xff1a; 十一、styleSheet 计算机中的颜色表示 例子&#xff1a; 六、windowOpacity opacity是不透明度的意思。 用于设…...

对象的克隆 单例模式

1) 如何实现对象的克隆&#xff1f; 1、为什么需要实现对象的克隆&#xff1f; 在某些情况下&#xff0c;需要创建一个与现有对象完全相同的副本&#xff0c;这就是对象克隆。 例如&#xff0c;在需要对对象进行备份、在不同的上下文中使用相同的类型的对象或者实现某些设计…...

预处理内容

预处理是干什么的呢&#xff1f; 分为三点&#xff1a; 1.宏替换 2.头文件导入 3.删除注释 #ifdef #include <iostream> // 定义一个宏&#xff0c;表示当前处于调试模式&#xff0c;在实际调试时可以定义这个宏&#xff0c;发布时取消定义#define DEBUG MODE int ma…...

Docker笔记

1 安装docker b11et3un53m.feishu.cn/wiki/Rfocw7ctXij2RBkShcucLZbrn2d 项目的资料地址(飞书) 当使用docker pull +名字 拉取镜像时报 Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for co…...

条件随机场(CRF)详解:原理、算法与实现(深入浅出)

目录 1. 引言2. 什么是条件随机场&#xff1f;2.1 直观理解2.2 形式化定义 3. CRF的核心要素3.1 特征函数3.2 参数学习 4. 实战案例&#xff1a;命名实体识别5. CRF vs HMM6. CRF的优化与改进6.1 特征选择6.2 正则化 7. 总结与展望参考资料 1. 引言 条件随机场(Conditional Ra…...

C++类与对象学习笔记(一)

https://www.bilibili.com/video/BV1jm4y1w7pa?spm_id_from333.788.player.switch&vd_sourcee8984989cddeb3ef7b7e9fd89098dbe8&p6 &#x1f6a9;​&#x1f6a9;&#x1f6a9;来自b站“码农论坛”的视频“类与对象”做的笔记&#x1f6a9;​&#x1f6a9;&#x1f6a…...

wrk如何测试post请求

wrk git地址 https://github.com/wg/wrk wrk 默认是针对 GET 请求的&#xff0c;但它也可以通过添加自定义的 HTTP 请求体和 头部信息来进行 POST 请求的压测。以下是详细的步骤&#xff1a; wrk -t4 -c100 -d30s -s post.lua http://example.com-t4&#xff1a;使用 4 个线…...

rust使用log与env_logger两个crate实现同时向控制台和文件输出日志。并在隔日自动创建新日志文件。

还是老习惯,不用太多的废话。直接上代码。 不过我之说一句话,这块需要自定义一个输出的Target来实现这个功能。 log = { version="0.4.22", default-features = false } env_logger = "0.11.5"pub(crate) fn setup_log_env(log_level: LevelFilter) {...

异步将用户信息存入 Redis 缓存

主要是为了解决Redis的缓存问题&#xff0c;异步将用户信息存入Redis缓存 首先我们需要引入一部线性池 核心概念 异步执行&#xff1a; 异步执行是指任务提交后不会立即等待其完成&#xff0c;而是立即返回并继续执行其他任务。任务将在后台执行&#xff0c;执行结果可以通过…...

WebRTC服务质量(05)- 重传机制(02) NACK判断丢包

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…...