Go singlefight 源码详解|图解
写在前面
通俗的来说就是 singleflight 将相同的并发请求合并成一个请求,进而减少对下层服务的压力,通常用于解决缓存击穿的问题。
详解
基础结构
golang.org/x/sync/singleflight
singleflight结构体:
type call struct {wg sync.WaitGroup// 这些字段在 WaitGroup 结束前写入一次// 只有在 WaitGroup 结束后才会被读取。val interface{}err error// 这些字段在 WaitGroup 结束前使用 singleflight 互斥锁进行读写// 在 WaitGroup 结束后读取但不写入。dups intchans []chan<- Result
}
Group 代表分成多个工作组,形成一个命名空间,在这个命名空间中,各工作单元可以重复执行。
type Group struct {mu sync.Mutex // 互斥锁m map[string]*call // 懒加载
}
Result 保存 Do 方法的结果,以便在通道上传递。做异步处理。
type Result struct {Val interface{}Err errorShared bool
}
简单demo
func TestSingleFightExample(t *testing.T) {var group singleflight.Group// 模拟一个并发请求for i := 0; i < 5; i++ {go func(i int) {key := "example"tmp := i // 将tmp放进去val, err, _ := group.Do(key, func() (interface{}, error) {// 模拟一次耗时操作time.Sleep(time.Second)return fmt.Sprintf("result_%d", tmp), nil})if err != nil {fmt.Println("Error:", err)}fmt.Println("Value:", val)}(i)}// 等待所有请求完成time.Sleep(3 * time.Second)
}
结果:这是一个很随机的过程,0~4都有可能,主要看哪个协程最先进来。
Value: result_2
Value: result_2
Value: result_2
Value: result_2
Value: result_2
Do 执行函数:对同一个 key 多次调用的时候,在第一次调用没有执行完的时候, 只会执行一次 fn,其他的调用会阻塞住等待这次调用返回, shared 表示fn的结果是否被共享
func (g *Group) Do(key string, fn func() (interface{}, error)) (v interface{}, err error, shared bool)
DoChan 和 Do 类似,只是 DoChan 返回一个 channel,也就是同步与异步的区别
func (g *Group) DoChan(key string, fn func() (interface{}, error)) <-chan Result
Forget:用于通知 Group 删除某个 key 这样后面继续这个 key 的调用的时候就不会在阻塞等待了
func (g *Group) Forget(key string){g.mu.Lock()if c, ok := g.m[key]; ok {c.forgotten = true}delete(g.m, key)g.mu.Unlock()
}
singleflight的本质是对某次函数调用的复用,只执行1次
,并将执行期间相同的函数返回相同的结果。由此产生一个问题,如果实际执行的函数出了问题,比如超时,则在此期间的所有调用都会超时,由此需要一些额外的方法来控制。
在一些对可用性要求极高的场景下,往往需要一定的请求饱和度来保证业务的最终成功率。一次请求还是多次请求,对于下游服务而言并没有太大区别,此时使用 singleflight 只是为了降低请求的数量级,那么使用 Forget()
提高下游请求的并发。
常见面试题
singleflight 是什么?什么时候用的?
缓存失效,合并请求的时候用的,这样我们就可以减少对DB的请求压力。
如果这个goruntine超时怎么办?
singleflight 内部使用 waitGroup 来让同一个 key 的除了第一个请求的后续所有请求都阻塞。直到第一个请求执行 func 返回后,其他请求才会返回。
这意味着,如果 func 执行需要很长时间,那么后面的所有请求都会被一直阻塞。
这时候我们可以使用 DoChan 结合ctx + select
做超时控制
func TestSingleFightTimeout(t *testing.T) {ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)go doFly(ctx)time.Sleep(2 * time.Second)cancel() // 2秒后超时
}func doFly(ctx context.Context) {var g singleflight.Groupkey := "example"// 使用 DoChan 结合 select 做超时控制result := g.DoChan(key, func() (interface{}, error) {time.Sleep(5 * time.Second) // 模拟超时return "result", nil})select {case r := <-result:fmt.Println("r", r.Val)case <-ctx.Done():fmt.Println("done")return}
}
结果输出:
done
上述代码中,我们将主进程先sleep 2
秒,然后再进行cancel
,那么此时我们将会让DoChan
这个方法 time.Sleep 5秒模拟超时。那么我们会发现函数过了2秒之后就会输出done
。
doChan方法具体是怎么实现的?
在DoChan方法中,有一个 go g.doCall(c, key, fn)
的操作,当一个 goroutine 来执行,并通过channel
来返回数据,这样外部可以自定义超时逻辑,防止因为 fn 的阻塞,导致大量请求都被阻塞。
func (g *Group) DoChan(key string, fn func() (interface{}, error)) <-chan Result {ch := make(chan Result, 1)g.mu.Lock()if g.m == nil {g.m = make(map[string]*call)}if c, ok := g.m[key]; ok { // 如果没有这个keyc.dups++c.chans = append(c.chans, ch)g.mu.Unlock()return ch}c := &call{chans: []chan<- Result{ch}} // 构造异步返回结构体,可以接参数进行超时c.wg.Add(1)g.m[key] = cg.mu.Unlock()go g.doCall(c, key, fn) // 异步执行return ch
}
如果请求失败了怎么办?
如果第一个请求失败了,那么后续所有等待的请求都会返回同一个 error。但实际上可以根据下游能支撑的 rps 定时 forget 这个 key
,让更多的请求能有机会走到后续逻辑。
go func() {time.Sleep(100 * time.Millisecond)g.Forget(key)}()
比如1秒内有100个请求过来,正常是第一个请求能执行queryDB,后续99个都会阻塞。增加这个 Forget 之后,每 100ms 就能有一个请求执行 queryDB,相当于是多了几次尝试的机会,相对的也给DB造成了更大的压力,需要根据具体场景进去取舍。 因为有可能前几次是因为DB的抖动导致的查询失败,重试之后就能实现了。
参考链接
[1] https://pkg.go.dev/golang.org/x/sync/singleflight
[2] https://www.lixueduan.com/posts/go/singleflight
[3] https://juejin.cn/post/7093859835694809125
相关文章:
Go singlefight 源码详解|图解
写在前面 通俗的来说就是 singleflight 将相同的并发请求合并成一个请求,进而减少对下层服务的压力,通常用于解决缓存击穿的问题。 详解 基础结构 golang.org/x/sync/singleflight singleflight结构体: type call struct {wg sync.WaitGro…...
vue面试题2-根据以下问题回答
以下是针对提供的关于Vue的问题的回答: Vue的基本原理: Vue.js是一个流行的JavaScript框架,用于构建用户界面和单页面应用。其基本原理包括响应式数据、模板、组件系统、指令、生命周期钩子和虚拟DOM。 双向数据绑定的原理: Vue通…...
Go微服务: 分布式之通过可靠消息实现最终一致性
通过可靠消息实现最终一致性 可靠消息,就是靠普消息,还是基于之前的这个案例 比如这个订单服务,无论你是先发送消息,还是先新建订单,它其实都是发送的不可靠消息就是说如果这个消息,像mysql事务那样&#…...
无线领夹麦克风哪款好?哪个无线麦克风好用?本期文章带你了解
演讲、表演或录制视频时,高质量的无线麦克风能极大提升整体体验。它保证了声音的清晰度和真实感,让演讲者或表演者更自信舒适。基于市场研究和用户体验,我挑选了几款表现突出的无线领夹麦克风,均为我个人使用过并推荐的产品&#…...
【杂谈】-不同种类放大器及其区别
不同种类放大器及其区别 文章目录 不同种类放大器及其区别1、概述2、放大器种类2.1 如何衡量保真度2.2 如何测量放大器的效率 3、放大器分类3.1 A类放大器3.2 B 类放大器3.3 AB类放大器3.4 C类放大器3.5 其他放大器类别 1、概述 放大器是电子产品中最常用的电路之一。有几种类…...
车载电子电气架构 - 智能座舱技术及功能应用
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…...
C++ bfS
岛屿的最大面积 . - 力扣(LeetCode) 1.刚开始mn又加了int 2.bfs里符合条件了,不push,,,在写什么几把 class Solution { public:int dx[4] {0, 0, 1, -1};int dy[4] {1, -1, 0, 0};bool vis[50][50];int…...
搜索与图论:所有可达路径(DFS算法)
搜索与图论:所有可达路径(DFS算法) 题目描述参考代码邻接表方法邻接矩阵方法 题目描述 题目描述 给定一个有 n 个节点的有向无环图,节点编号从 1 到 n。请编写一个函数,找出并返回所有从节点 1 到节点 n 的路径。每条…...
2024年大数据、区块链与物联网国际会议(ICBDBLT 2024)
2024 International Conference on Big Data, Blockchain, and Internet of Things 【1】大会信息 会议简称:ICBDBLT 2024 大会地点:中国青岛 审稿通知:投稿后2-3日内通知 会议官网:www.icbdblt.com 【2】会议简介 即将召开的…...
6.13作业
自由发挥登录窗口的应用场景,实现一个登录窗口界面 #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//设置窗口标题this->setWindowTitle("QQ");//设置窗口图标this->setWindowIcon(QIcon("C:/Users/…...
Pygame常用模块
自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 Pygame做游戏开发的优势在于不需要过多考虑与底层开发相关的内容,而可以把工作重心放在游戏逻辑上。例如,Pygame中集成了很多…...
结构体的定义以及使用结构体存储学生信息的例子
结构体(struct)是C或C等编程语言中的一种复合数据类型,它允许你将多个不同类型的变量组合成一个单一的实体。这个实体可以包含数据成员(变量)和成员函数(对于C的类)。结构体在需要组织复杂数据时…...
c++防止头文件重复
在C的头文件中,为了防止重复包含,需要使用预处理指令#pragma once或者传统的条件编译方式。下面分别详细说明这两种方式的写法及作用: #pragma once 使用#pragma once指令: #pragma once是一种简便的方式,可以确保头文…...
数据结构---查找
个人介绍 hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 🦁作者简介:一名喜欢分享和记录学习的…...
Qt | QTextStream 类(文本流)
01、字符编码 1、怎样将字符转换为二进制形式进行存储,存在一个编码的问题,通常都需进行两次编码, 2、字符集:字符的第一次编码是将字符编码为与一个数值(如一个 10 进制整数)相对应,比如把字符 A 编码为 10 进制的 65,B 编码为 66 等。把每一个字符都编码为与一个数值…...
React Native将 ipad 端软件设置为横屏显示后关闭 Modal 弹窗报错
问题: 将 ipad 端软件设置为横屏显示后,关闭 Modal 弹窗报错。 Modal was presented with 0x2 orientations mask but the application only supports 0x18.Add more interface orientations to your apps Info.plist to fix this.NOTE: This will cras…...
1、项目介绍:为什么要做此项目。
项目介绍:为什么要做此项目。 全栈开发博客实战项目:前后端开发流程以及项目部署 随着互联网的蓬勃发展,全栈开发成为了越来越受欢迎的趋势。前端开发和后端开发之间的紧密合作和协同工作已经成为了现代软件开发中的重要组成部分。然而&…...
Day31 - Day35
Day31 - Day35 Day31(1999年text5) Science, in practice, depends far less on the experiments it prepares than on the preparedness of the minds of the men who watch the experiments. 在实践中,科学对实验的依赖远少于对实验观察者…...
Shell脚本 if语句
条件测试: $? 返回码 判断命令或者脚本是否执行成功(最近的一条) 0 true 为真就是成功 成立 非0 false 失败或者异常 test命令 可以进行条件测试 然后根据的是返回值来判断条件是否成立。 -e 测试目录或者文件是否存在 exist -d 测试…...
audio标签怎么使用
<audio> 标签在 HTML 中用于嵌入音频内容,如音乐、歌曲、音效等。这个标签允许你在网页上直接播放音频,而无需依赖任何外部播放器或插件(如过去的 Flash 插件)。 以下是如何使用 <audio> 标签的基本示例:…...
又一个对标Sora的AI视频工具,Dream Machine,开始免费试用
新的AI视频工具又又来了-Dream Machine,开始免费试用。 地址:https://lumalabs.ai/dream-machine 该工具需要科学上网 先看一下官网的宣传视频 luma AI 发布 Dream Machine 我生成了几个视频,效果还可以 生成视频很简单 只需要输入描述就可…...
k8s学习--kubernetes服务自动伸缩之垂直伸缩(资源伸缩)VPA详细解释与安装
文章目录 前言VPA简介简单理解详细解释VPA的优缺点优点1.自动化资源管理2.资源优化3.性能和稳定性提升5.成本节约6.集成性和灵活性 缺点1.Pod 重启影响可用性2.与 HPA 冲突3.资源监控和推荐滞后:4.实现复杂度: 核心概念Resource Requests 和 Limits自动调…...
计算机网络 —— 运输层(TCP三次握手)
计算机网络 —— 运输层(TCP三次握手) 三次握手第一次握手第二次握手第三次握手两次握手行不行? 我们今天来学习TCP的三次握手: 三次握手 TCP三次握手是TCP协议中建立连接的过程,旨在确保双方准备好进行可靠的通信。…...
QT--DAY1
不使用图形化界面实现一个登陆界面 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {//设置窗口标题this->setWindowTitle("登录界面");//设置窗口大小this->resize(535,410);//固定窗口大小this->setFixedSize(535,410)…...
【笔记】APN设置中ApnEditor在新建和编辑的代码实现差异
问题 新增和编辑APN都是使用ApnEditorActivity,但是进入的方式不同,如果APN做成插件的话,点击添加按钮的时候会提示“选择要使用的应用”,因为Settings本身也有这个界面被安装进去了 。 新增功能通过Intent.ACTION_INSERT跳转界…...
网络编程2----UDP简单客户端服务器的实现
首先我们要知道传输层提供的协议主要有两种,TCP协议和UDP协议,先来介绍一下它们的区别: 1、TCP是面向连接的,UDP是无连接的。 连接的本质是双方分别保存了对方的关键信息,而面向连接并不意味着数据一定能正常传输到对…...
Mybatis认识与学习
前言 在客户端工具中,编写增删改查的SQL语句,发给MySQL数据库管理系统,由数据库管理系统执行SQL语句并返回执行结果。 增删改操作:返回受影响行数 查询操作:返回结果集(查询的结果) 我们做为后端程序开发人员ÿ…...
雷卯推出小封装高压防静电二极管SD60C
1. 高电压通讯信号线静电防护的为何有难度 高电压通讯信号线静电防护很多公司普遍可以做到1.8至36V,48V ESD静电防护,比如上海雷卯的36V ESD二极管SD36C,LC36CI,GBLC36C ,分别可以用于低数据速率到高数据速率静电防护。48V 的ESD二极管有SD4…...
项目经验:别啥事都跟甲方讲
看过一个港片,片名一时想不起来了(脑子不好,根本记不住多少名字),情节大概是一个学拍电影的副导演和一个职业杀手,副导演给杀手拍片记录杀人过程给金主看,电影蛮逗的,里面一个情节挺…...
Selenium - 启动后报org.openqa.selenium.InvalidArgumentException: invalid argument错
● 出现的异常: Build info: version: 3.141.59, revision: e82be7d358, time: 2018-11-14T08:25:48 System info: host: DESKTOP-H7TOMMO, ip: 192.168.64.1, os.name: Windows 10, os.arch: amd64, os.version: 10.0, java.version: 1.8.0_131 Driver info: dr…...
k8s之deployments相关操作
k8s之deployments相关操作 介绍 官网是这样说明如下: 一个 Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力。 你负责描述 Deployment 中的目标状态,而 Deployment 控制器(Controller) 以受控速率更改实际状态…...
Unity学习要点
前言 学习Unity作为游戏开发的强大工具,对于初学者来说,掌握一些基础而实用的技巧是非常重要的。这不仅能帮助你更快地上手,还能在项目开发过程中提高效率。以下是一些Unity初学者的使用技巧,希望能为你的学习之旅提供帮助。 ##…...
[数据集][目标检测]中国象棋检测数据集VOC+YOLO格式300张12类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):300 标注数量(xml文件个数):300 标注数量(txt文件个数):300 标注类别…...
Spring系统学习 - Bean的作用域
bean作用域介绍 Spring框架提供了不同的作用域来管理Bean的生命周期和可见性,这对于控制不同类型的组件和处理并发请求尤其重要。 singleton(默认): 每个Spring IoC容器只有一个bean实例。当容器创建bean后,它会被缓存…...
计算机网络(3) 字节顺序:网络字节序与IPv4
一.小端与大端 小端(Little endian):低字节保存在内存低地址,高字节保存在内存高地址。 大端(Big endian):低字节保存在内存高地址,高字节保存在内存低地址。 例如(14…...
Linux shell编程基础
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问 Linux 内核的服务。 Shell 脚本&#x…...
【全开源】图书借阅管理系统源码(ThinkPHP+FastAdmin)
📚图书借阅管理系统:打造你的私人图书馆 一款基于ThinkPHPFastAdmin开发的简易图书借阅管理系统,一款轻量级的图书借阅管理系统,具有会员管理,图书管理,借阅及归还管理,会员充值等基本功能&…...
C数据结构:排序
目录 冒泡排序 选择排序 堆排序 插入排序 希尔排序 快速排序 hoare版本 挖坑法 前后指针法 快速排序优化 三数取中法 小区间优化 快速排序非递归 栈版本 队列版本 归并排序 归并排序非递归 编辑 计数排序 各排序时间、空间、稳定汇总 冒泡排序 void Bub…...
C#——析构函数详情
析构函数 C# 中的析构函数(也被称作“终结器”)同样是类中的一个特殊成员函数,主要用于在垃圾回收器回收类实例时执行一些必要的清理操作。 析构函数: 当一个对象被释放的时候执行 C# 中的析构函数具有以下特点: * 析构函数只…...
基于Django和Vue的商城管理系统
文章目录 前言一、系统运行结果二、相关技术简介三、系统设计四、系统测试五、总结 前言 近年来,互联网技术的飞速发展极大地改变了人们的生活方式。网络购物作为一种新的购物模式,因其方便、快捷、选择多样等优点,迅速普及。为了满足人们日…...
Kubernetes(K8s)从入门到精通系列之十九:Operator模式
Kubernetes K8s从入门到精通系列之十九:Operator模式 一、动机二、Operators in Kubernetes三、Operator示例四、部署Operator五、使用Operator六、编写自己的operator Operator 是 Kubernetes 的软件扩展,它利用自定义资源来管理应用程序及其组件。 Ope…...
Redis Key过期监听配置
默认情况下在Windows系统中双击redis-server.exe用的是内置的配置文件 如果希望用这两个配置文件 redis.windows.conf:这是用于在Windows上运行Redis服务器的标准配置文件。可以使用这个文件通过命令行启动Redis服务器。redis.windows-service.conf:这是…...
gpt、llama大模型模型结构细节探索
参考: https://github.com/naklecha/llama3-from-scratch(一定要看看) https://github.com/karpathy/build-nanogpt/blob/master/play.ipynb 视频: https://www.youtube.com/watch?vl8pRSuU81PU https://tiktokenizer.vercel…...
争取比ChatGPT多知道一点,如何创建和使用embedding?
如何生成embedding? 这个问题很简单,可以直接问ChatGPT。即使是3.5的版本,也可以得到不错的回复: 我这里贴一下它给出的代码,首先是TensorFlow2版本: 接着是pytorch版本: 这两个版本的embeddin…...
Python学习笔记7:入门知识(七)
前言 之前说过我更换了新的学习路线,现在是根据官方文档和书籍Python crash course来进行学习的,在目前的学习中,对于之前的知识有一些遗漏,这里进行补充。 学习资料有两个,书籍中文版PDF,关注我私信发送…...
C语言详解(预编译)
Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…...
ARM-V9 RME(Realm Management Extension)系统架构之系统安全能力的架构差异
安全之安全(security)博客目录导读 RME系统中的应用处理单元(PE)之间的架构差异可能会带来潜在的安全风险并增加管理软件的复杂性。例如,通过在ID_AA64MMFR0_EL1.PARange中为每个PE设置不同的值来支持不同的物理范围,可能会妨碍内存隔离的执行。通过CTR_EL0.L1Ip支持不同的…...
互联网应用主流框架整合之SpringMVC基础组件开发
多种传参方式 在前一篇文章互联网应用主流框架整合之SpringMVC初始化及各组件工作原理中讨论了最简单的参数传递,而实际情况要复杂的多,比如REST风格,它往往会将参数写入请求路径中,而不是以HTTP请求参数传递;比如查询…...
如果R是唯一析因整环,那么R[x]也是唯一析因整环
【定义1】商域 如果 R R R是整环,那么则 R R R上的商域 K R K_{R} KR定义为 K R { a b ∣ a , b ∈ R , b ≠ 0 } K_{R} \left\{ \frac{a}{b}|a,b \in R,b \neq 0 \right\} KR{ba∣a,b∈R,b0} 其中 a b a ′ b ′ ∈ K R ⇔ a b ′ a ′ b ∈ R \frac…...
后端主流框架--Spring
常见的设计模式 什么是设计模式 前人开发过程总结出来,一套开发代码优秀实践,被总结提炼处理成为一种开发代码模式。我们使用这些模式能让我们代码可读性更高、效率更高。 创建型模式:对象实例化的模式,创建型模式用于解耦对象…...
向佐回应收钱加粉丝群 坚决维护个人权益
近日,娱乐圈内一桩关于公众人物肖像权与粉丝互动界限的争议事件引发了广泛关注。知名演员向佐通过其个人社交媒体平台发表声明,针对自己的头像被非法用于拍照签到活动以及部分粉丝群内以加他微信为由收取费用的不当行为,呼吁各方尊重个人权益,停止侵权行为。向佐表达了对长…...
泰山机器狗未来或能驮人上山 游客期待新体验
近日,在山东泰安泰山景区,一只用于搬运垃圾的机器狗吸引了众多游客的目光。视频中,这只机器狗在工作人员的操作下,能够携带近80斤重物爬上台阶,步伐稳健,行动敏捷,还能原地掉头调整方向,有人称赞其速度很快。一名游客表示,看到机器狗爬山时还与它合影,并希望未来这种…...
哈尔滨市公安局原副局长涉黑,警方征集线索,最高奖励十万
10月14日黑龙江省鸡西市警方发布公告征集涉嫌黑恶违法犯罪线索“关于公开征集哈尔滨市于涛、张绪霞、于波等人涉嫌黑恶违法犯罪线索的通告”知情人介绍,其中的于涛为哈尔滨市公安局原副局长,在哈尔滨公安系统工作多年,对于其工作能力和作风褒贬不一。此前…...
曝拜仁或与大巴黎争签拉什福德 马赛也有意 曼联要价一亿买不起 转会肥皂剧再起
曝拜仁或与大巴黎争签拉什福德 马赛也有意 曼联要价一亿买不起德甲的拜仁慕尼黑正准备与巴黎圣日耳曼争夺曼联前锋拉什福德。26岁的拉什福德本赛季表现出色,在前12场比赛中贡献了4球3助攻,但他的未来仍不确定。尽管拉什福德依然是滕哈格麾下的主力球员,但英媒称他有可能离开…...
居民称衡阳小学生坠井地此前有井盖 古井悲剧引发关注
10月21日,湖南省衡阳市蒸湘区胜利小学门外发生了一起悲剧,一名小学生在放学后意外坠入古井不幸身亡。属地政府、校方和当地教育局正在妥善处理此事。22日上午,蒸湘区消防部门接到报警称,一名学生在21日下午2点左右掉入井内。消防队员迅速赶往现场进行救援,但遗憾的是,该学…...
报告称去年男性消费占比均高于女性 男性消费力雄起
报告称去年男性消费占比均高于女性近日,男性消费领域迎来好消息。商务部国际贸易经济合作研究院发布的《中国电子商务区域发展大数据分析报告》显示,2023年男性在各类商品消费中的占比均高于女性。当前,男性互联网月活跃用户已超过6亿,其中90后和00后的年轻男性用户表现出更…...