bootstrap为什么设置的这个active无效呢?

bootstrap为什么设置的这个active无效呢?,第1张

<nav class="navbar-default">

<ul class="nav navbar-nav" >

<li class="active"><a href="">首页</a></li>

<li><a href="">博文</a></li>

<li><a href="">留言</a></li>

</ul>

<nav>

不能直接使用的,bootstrapcss里面不会直接写active类选择的

本文通过实例代码给大家介绍了spring集成mybatis实现mysql数据库读写分离,需要的朋友可以参考下

前言

在网站的用户达到一定规模后,数据库因为负载压力过高而成为网站的瓶颈。幸运的是目前大部分的主流数据库都提供主从热备功能,通过配置两台数据库主从关系,可以将一台数据库的数据更新同步到另一台服务器上。网站利用数据库的这一功能,实现数据库读写分离,从而改善数据库负载压力。如下图所示:

应用服务器在写数据的时候,访问主数据库,主数据库通过主从复制机制将数据更新同步到从数据库,这样当应用服务器读数据的时候,就可以通过从数据库获得数据。为了便于应用程序访问读写分离后的数据库,通常在应用服务器使用专门的数据库访问模块,使数据库读写分离对应用透明。

而本博客就是来实现“专门的数据库访问模块”,使数据库读写分离对应用透明。另外,mysql数据库的主从复制可以参考我的mysql5718的安装与主从复制。注意,数据库实现了主从复制,才能做数据库的读写分离,所以,没有实现数据库主从复制的记得先去实现数据库的主从复制

配置读写数据源(主从数据库)

mysqldbproperties

#主数据库数据源

jdbcdriverClassName=commysqljdbcDriver

jdbcurl=jdbc:mysql://19216804:3306/mybatisuseUnicode=true&characterEncoding=utf-8&useSSL=false

jdbcusername=root

jdbcpassword=123456

jdbcinitialSize=1

jdbcminIdle=1

jdbcmaxActive=20

jdbcmaxWait=60000

jdbcremoveAbandoned=true

jdbcremoveAbandonedTimeout=180

jdbctimeBetweenEvictionRunsMillis=60000

jdbcminEvictableIdleTimeMillis=300000

jdbcvalidationQuery=SELECT 1

jdbctestWhileIdle=true

jdbctestOnBorrow=false

jdbctestOnReturn=false

#从数据库数据源

slavejdbcdriverClassName=commysqljdbcDriver

slavejdbcurl=jdbc:mysql://1921680221:3306/mybatisuseUnicode=true&characterEncoding=utf-8&useSSL=false

slavejdbcusername=root

slavejdbcpassword=123456

slavejdbcinitialSize=1

slavejdbcminIdle=1

slavejdbcmaxActive=20

slavejdbcmaxWait=60000

slavejdbcremoveAbandoned=true

slavejdbcremoveAbandonedTimeout=180

slavejdbctimeBetweenEvictionRunsMillis=60000

slavejdbcminEvictableIdleTimeMillis=300000

slavejdbcvalidationQuery=SELECT 1

slavejdbctestWhileIdle=true

slavejdbctestOnBorrow=false

slavejdbctestOnReturn=false主、从数据库的地址记得改成自己的,账号和密码也需要改成自己的;其他配置项,大家可以酌情自行设置

mybatis-springxml

<xml version="10" encoding="UTF-8">

<beans xmlns="http://wwwspringframeworkorg/schema/beans"

xmlns:xsi="http://wwww3org/2001/XMLSchema-instance" xmlns:context="http://wwwspringframeworkorg/schema/context"

xmlns:aop="http://wwwspringframeworkorg/schema/aop" xmlns:tx="http://wwwspringframeworkorg/schema/tx"

xsi:schemaLocation="http://wwwspringframeworkorg/schema/beans

http://wwwspringframeworkorg/schema/beans/spring-beansxsd

http://wwwspringframeworkorg/schema/context

http://wwwspringframeworkorg/schema/context/spring-contextxsd

http://wwwspringframeworkorg/schema/aop

http://wwwspringframeworkorg/schema/aop/spring-aopxsd

http://wwwspringframeworkorg/schema/tx

http://wwwspringframeworkorg/schema/tx/spring-txxsd">

<!-- master数据源 -->

<bean id="masterDataSource" class="comalibabadruidpoolDruidDataSource">

<!-- 基本属性 url、user、password -->

<property name="driverClassName" value="${jdbcdriverClassName}" />

<property name="url" value="${jdbcurl}" />

<property name="username" value="${jdbcusername}" />

<property name="password" value="${jdbcpassword}" />

<property name="initialSize" value="${jdbcinitialSize}" />

<property name="minIdle" value="${jdbcminIdle}" />

<property name="maxActive" value="${jdbcmaxActive}" />

<property name="maxWait" value="${jdbcmaxWait}" />

<!-- 超过时间限制是否回收 -->

<property name="removeAbandoned" value="${jdbcremoveAbandoned}" />

<!-- 超过时间限制多长; -->

<property name="removeAbandonedTimeout" value="${jdbcremoveAbandonedTimeout}" />

<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->

<property name="timeBetweenEvictionRunsMillis" value="${jdbctimeBetweenEvictionRunsMillis}" />

<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->

<property name="minEvictableIdleTimeMillis" value="${jdbcminEvictableIdleTimeMillis}" />

<!-- 用来检测连接是否有效的sql,要求是一个查询语句-->

<property name="validationQuery" value="${jdbcvalidationQuery}" />

<!-- 申请连接的时候检测 -->

<property name="testWhileIdle" value="${jdbctestWhileIdle}" />

<!-- 申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能 -->

<property name="testOnBorrow" value="${jdbctestOnBorrow}" />

<!-- 归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能 -->

<property name="testOnReturn" value="${jdbctestOnReturn}" />

</bean>

<!-- slave数据源 -->

<bean id="slaveDataSource" class="comalibabadruidpoolDruidDataSource">

<property name="driverClassName" value="${slavejdbcdriverClassName}" />

<property name="url" value="${slavejdbcurl}" />

<property name="username" value="${slavejdbcusername}" />

<property name="password" value="${slavejdbcpassword}" />

<property name="initialSize" value="${slavejdbcinitialSize}" />

<property name="minIdle" value="${slavejdbcminIdle}" />

<property name="maxActive" value="${slavejdbcmaxActive}" />

<property name="maxWait" value="${slavejdbcmaxWait}" />

<property name="removeAbandoned" value="${slavejdbcremoveAbandoned}" />

<property name="removeAbandonedTimeout" value="${slavejdbcremoveAbandonedTimeout}" />

<property name="timeBetweenEvictionRunsMillis" value="${slavejdbctimeBetweenEvictionRunsMillis}" />

<property name="minEvictableIdleTimeMillis" value="${slavejdbcminEvictableIdleTimeMillis}" />

<property name="validationQuery" value="${slavejdbcvalidationQuery}" />

<property name="testWhileIdle" value="${slavejdbctestWhileIdle}" />

<property name="testOnBorrow" value="${slavejdbctestOnBorrow}" />

<property name="testOnReturn" value="${slavejdbctestOnReturn}" />

</bean>

<!-- 动态数据源,根据service接口上的注解来决定取哪个数据源 -->

<bean id="dataSource" class="comyzbutilDynamicDataSource">

<property name="targetDataSources">

<map key-type="javalangString">

<!-- write or slave -->

<entry key="slave" value-ref="slaveDataSource"/>

<!-- read or master -->

<entry key="master" value-ref="masterDataSource"/>

</map>

</property>

<property name="defaultTargetDataSource" ref="masterDataSource"/>

</bean>

<!-- Mybatis文件 -->

<bean id="sqlSessionFactory" class="orgmybatisspringSqlSessionFactoryBean">

<property name="configLocation" value="classpath:mybatis-configxml" />

<property name="dataSource" ref="dataSource" />

<!-- 映射文件路径 -->

<property name="mapperLocations" value="classpath:dbmappers/xml" />

</bean>

<bean class="orgmybatisspringmapperMapperScannerConfigurer">

<property name="basePackage" value="comyzbdao" />

<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />

</bean>

<!-- 事务管理器 -->

<bean id="transactionManager"

class="orgspringframeworkjdbcdatasourceDataSourceTransactionManager">

<property name="dataSource" ref="dataSource" />

</bean>

<!-- 声明式开启 -->

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" order="1"/>

<!-- 为业务逻辑层的方法解析@DataSource注解 为当前线程的HandleDataSource注入数据源 -->

<bean id="dataSourceAspect" class="comyzbutilDataSourceAspect" />

<aop:config proxy-target-class="true">

<aop:aspect id="dataSourceAspect" ref="dataSourceAspect" order="2">

<aop:pointcut id="tx" expression="execution( comyzbserviceimpl()) "/>

<aop:before pointcut-ref="tx" method="before" />

</aop:aspect>

</aop:config>

</beans>AOP实现数据源的动态切换

DataSourcejava

package comyzbutil;

import javalangannotationElementType;

import javalangannotationRetention;

import javalangannotationRetentionPolicy;

import javalangannotationTarget;

/

RUNTIME

编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。

/

@Retention(RetentionPolicyRUNTIME)

@Target(ElementTypeMETHOD)

public @interface DataSource

{

String value();

}DataSourceAspectjava

package comyzbutil;

import javalangreflectMethod;

import orgaspectjlangJoinPoint;

import orgaspectjlangreflectMethodSignature;

public class DataSourceAspect

{

/

在dao层方法获取datasource对象之前,在切面中指定当前线程数据源

/

public void before(JoinPoint point)

{

Object target = pointgetTarget();

String method = pointgetSignature()getName();

Class&lt

天梯符文之语是比如眼光一类的原来单机不能用的符文,安装就有的

天梯任务是超级菠萝出现在地表,杀了有个很不错的护符,

具体可以看见开游戏时显示 xxx个乔丹之石卖给商人就代表激活了

Page Cache是通过将磁盘中的数据缓存到内存中,减少磁盘I/O操作,从而提高性能。此外,还要确保Page Cache中的数据更改能够同步到磁盘上,这称之为page回写(page writeback)。一个inode对应一个page cache对象,一个page cache对象包含多个物理page。

对磁盘的数据进行缓存,从而提高性能主要基于两个因素:一:磁盘访问速度比内存慢几个数量级。第二是访问过的数据,很大概率再次访问(局部性原理)。

Page Cache是内核管理的内存,也就是说,它属于内核,而不属于用户。

在Linux上,可以直接查看Page Cache的方式有很多, 包括/proc/meminfo、free 、/proc/vmstat 命令,它们的内容实际上是一致的。

以/proc/meminfo命令来说:

其中: Buffers + Cached + SwapCached = Active(file) + Inactive(file) + Shmem + SwapCached

等式两边的内容就是平时说的Page Cache ,两边都有SwapCached,只是为了说明它也是Page Cache的一部分。

在Page Cache中,Active(file) + Inactive(file) 是File-backed page(与文件对应的内存页),是最需要关注的部分,因为平时用的mmap()内存映射方式和buffered I/O来消耗的内存就是这部分。

SwapCached是打开了Swap分区后,把Inactive(anno) + Active(anno)两项匿名页交换到磁盘(swap out)之后,然后在读入到内存(swap in)之后分配的内存。 由于读入到内存后,原来的Swap File还存在,所以SwapCached也可以认为是File-backed page,属于Page Cache。 注意:SwapCached只有在Swap分区打开的请求下才会有,但是Swap过程产生的I/O很容易引起性能抖动,因此,线上环境Swap分区一般是关闭的。

Shmen是指匿名共享映射这种方式分配的内存(free 命令中的shared一项)。

当内核发起一个读请求时,会先检查请求的数据是否缓存到了page cache中,如果有则直接从内存中读取,不需要访问磁盘。如果cache没有请求的数据,就必须从磁盘中读取数据,然后内核将数据缓存到cache中。这样后续读请求就可以命中cache了。page可以只缓存一个文件部分的内容,不需要把整个文件都缓存进来。

当内核发起一个写请求时,同样直接写入到cache中。内核会将被写入的page标记为dirty,并将其加入到dirty list中。内核会周期性的将dirty list中的page回写到磁盘上。从而使磁盘上的数据和内存中缓存的数据一致。

Page Cache的产生有两种不同的方式:

两种方式产生如下图:

对于标准I/O的写,是写用户缓冲区,然后再讲用户缓冲区的数据拷贝到内核缓冲区。如果是读的话,则先从内核缓冲区拷贝到用户缓冲区,再从用户缓冲区中读数据。

对于存储映射I/O,是直接将Pagecache 的Page 给映射到用户地址空间,用户直接读写Pagecache Page中的内容。

以标准I/O为例,解释一下,Page Cache如何产生。具体如下图:

1)往用户缓冲区buffer写入数据。然后buffer中的数据拷贝到内核缓冲区(Pagecache page)。

2)如果内核缓冲区中没有这个Page,就会发生Page Fault,会去分配一个Page。

3)拷贝数据,该Pagecache Page就是一个Dirty Page(脏页)。

4)然后Dirty Page的内容会同步到磁盘,同步到磁盘后,该Pagecache Page就会变成Clean Page并且继续存在系统中。

如果是读文件产生的PageCache ,它的内容和磁盘内容一样,所以它一开始就是Clean Page,除非改写了里面的内容才会变成Dirty Page。

cat /proc/vmstat | egrep "dirty|writeback“

nr_dirty 表示当前系统中积压了多少脏页,nr_writeback 则表示有多少脏页正在回写到磁盘中,他们两个的单位都是 Page(4KB)。

先看写内存分配的图:

可以得出,应用在申请内存的时候,即使没有free内存了,只要还有足够的可回收逇Page Cache,也可以通过回收Page Cache的方式来申请到内存,所以,回收的方式主要有两种: 直接回收和后台回收。

也就是对应的两种页面回收机制:

1)周期性的检查:后台运行的守护进程kswapd完成。该进程定期检查当前系统的内存使用情况,发现系统内空闲的物理内存数目少于特定的阈值(参数是什么?),该进程就会发起页面回收的操作。

2)“内存严重不足”事件触发:如果需要很大内存,而当时系统的内存没有办法提供足够多的物理内存以满足内存请求。这时,操作系统就必须尽快进行页面回收,以便释放一些内存空间从而满足内存请求。

可以通过命令sar来观察内存回收行为,也可以通过查看/proc/vmstat里面的指标进行查看。

Linux中的页面回收是基于LRU(Lease recently used ,最近最少使用)算法。Linux操作系统对LRU的实现是基于一对双向链表,active链表和inactive链表。经常被访问的处于活跃状态的页面会被放到activre链表上,并不经常使用的页面则会放到inactive聊表上。页面会在两个双向链表中移动。页面可能从active链表移动到inactive链表,反之也有可能。但是移动并不是每次页面访问都会发生(要通过自旋锁来保证对链表并发访问操作不会出错,为了降低锁竞争,LInux提供了一种特殊的缓存,LRU缓存,用于批量的向LRU链表中快速的添加页面。有了 LRU 缓存之后,新页不会被马上添加到相应的链表上去,而是先被放到一个缓冲区中去,当该缓冲区缓存了足够多的页面之后,缓冲区中的页面才会被一次性地全部添加到相应的 LRU 链表中去),页面的移动发生的间隔有可能比较长。对于最近最少使用的页面会被逐个放到inactive链表的尾部。进行页面回收时,Linux操作系统会从inactive链表的尾部开始回收。

而第一次读取文件后,文件内容都是Inactive的,只有再次读取这些内容后,才会把它放到active链表上。处于Inactive链表上的pagecache在内存紧张的时候,是会首先被回收掉。有很多情况下,文件内容往往只被读取一次,它们占用的pagecache需要首先被回收掉;对于业务数据,往往都会读取几次,那么他们就会被放到active链表上,以此来达到保护的目的。

在内存紧张的情况下,会进行内存回收,回收会把Inactive list的部分page给回收掉。为了维护inactive和active的平衡,就需要把active list的部分page给demote到inactive list,demote的原则也是LRU。

疑问:active list和inactive list的比例是多少?,线上环境看,这里两个的比例还是比较大,超过1:2

不是file-backed pages,即为匿名页(anonymous page),如堆、栈和数据段等,不是以文件形式存在,因此无法和磁盘文件交换,但可以通过磁盘上划分额外的swap分区或使用swap文件进行交换。

1)水位(watermark)控制

min:如果剩余内存减少到触及这个水位,可认为内存严重不足,当前进程就会被阻塞,kernel会直接在这个进程的进程上下文做内存回收(direct reclaim)。

low:当剩余内存慢慢减少,触及到这个水位,就会触发kswapd线程进行内存回收。(后台回收)

high:进行内存回收时,内存慢慢增加,触及到这个水位时,就停止回收。

由于每个ZONE是分别管理各自的内存的,因此每个ZONE都有这个三个水位。

水位计算:/proc/sys/vm/min_free_kbytes 是一个用户可配置的值,默认值是min_free_kbytes = 4 sqrt(lowmem_kbytes)。然后根据min算出来low和high水位的值:low=5/4min,high=6/4min。(计算不是这里的重点,如果有需要见参考资料7)

1)swapness

回收的时候,会回收file-backed page和 anonymous page ,但是谁回收的多一些,可以通过/proc/sys/vm/swapness来控制谁回收多一些。swapness的值越大,越倾向于回收匿名页。值越小,越倾向于税后file-backed的页面。回收方法都是LRU算法。

Page cache毕竟是为了提高性能占用的物理内存,随着越来越多的磁盘数据被缓存到内存中,Page Cache也变得越来越大,如果一些重要的任务需要被Page cache占用的内存,内核将回收page cache以此来支持。

1)空间层面

当系统的“dirty”的内存大于某个阈值,该阈值是在总共的“可用内存”(包括free pages 和reclaimable pages)中的占比。

参数“dirty_background_ratio”(默认值10%),或者是绝对字节数“dirty_background_bytes”(默认值为0,表示生效)。两个参数只要谁先达到即可执行,此时就会交给专门负责writeback的background线程去处理。

参数“dirty_ratio”(默认值30%)和“dirty_bates”(默认值为0,表示生效),当“dirty”的内存达到这个比例或数量,进程则会停下write操作(被阻塞),先把“dirty”进行writeback。

2)时间层面

周期性的扫描,扫描间隔用参数:dirty_writeback_interval表示,以毫秒为单位。发现存在最近一次更新时间超过某个阈值(参数:dirty_expire_interval,单位毫秒)的pages。如果每个page都维护最近更新时间,开销会很大且扫描会很耗时,因此具体实现不会以page为粒度,而是按inode中记录的dirtying-time来计算。

3)用户主动发起。

调用sync()/msync()/fsync()。

参数设置可以在:/proc/sys/vm下。

其中dirty_writeback_interval实际的参数为:dirty_writeback_centisecs(默认值为500,单位为1/100秒,也就是5秒)

dirty_expire_interval实际的参数为:dirty_expire_centisecs(默认值为3000,单位为1/100秒,也就是30秒)

24内核,用一个叫bdflush的线程专门负责writeback操作。因为磁盘I/O操作很慢,而线程操作系统有多个块设备,如果bdflush在其中一个块设备上等待I/O操作的完成,可能会需要很长的时间,此时单线程模式的bdfoush就会成为影响性能的瓶颈。而且bdflush没有周期扫描功能。

在26内核中,bdflush和kupdated一起被pdflush(page dirty flush)取代了。pdflush是一组线程,根据块设备的I/O负载情况,数量从最少2个到最多8个不等。如果1秒内没有空闲的pdflush线程,则会创建一个;如果pdflush线程的空闲时间超过1秒,则会被销毁。一个块设备可能有多个可以传输数据的队列,为了避免在队列上的拥塞(congestion),pdflush线程会动态的选择系统中相对空闲的队列。

在2632版本上,直接一个块设备对应一个thread(算法效果不明显),这种内核线程被称为flusher threads。

无论是内核周期性的扫描,还是用户手动触发,flusher threads的write back都是间隔一段时间才进行的。如果这段时间内系统掉电了,那么还没有来得及write back的数据修改就面临丢失的风险,算是page cache机制存在的一个缺点。

free命令中,存在buff/cache的内容,如下。但是不太好区分。

通过man free查看指标含义,可以看到buffer和cache的区别。

通过man proc,可以得到proc文件系统的详细文档,其中就包括了/proc/meminfo的信息

通过这个文档,可以得到:

实际上,写文件时会用到Cache缓存数据(虽然文档上,Cache值提到是文件的读缓存),写磁盘则会用到Bufffer来缓存数据。

读文件时,数据会缓存到Cache中。而读磁盘时数据会缓存到Buffer中。

综上:

0)Linux中的内存回收[一] https://zhuanlanzhihucom/p/70964195

1) Linux中的Page Cache [二] https://zhuanlanzhihucom/p/71217136

2)Linux内核中的页面回收算法 http://liujunmingtop/2017/09/28/Linux%E5%86%85%E6%A0%B8%E4%B8%AD%E7%9A%84%E9%A1%B5%E9%9D%A2%E5%9B%9E%E6%94%B6%E7%AE%97%E6%B3%95/

3)Linux内存回收机制 http://baijiahaobaiducom/sid=1632115061958384848

4)Linux 内核源码分析-Page Cache 刷脏源码分析 https://leviathanvip/2019/06/01/Linux%E5%86%85%E6%A0%B8%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90-Page-Cache%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90/

5)Page Cache与Page回写 https://wwwcnblogscom/linhaostudy/p/10196915html#_label2

6)极客时间 《LInux内核技术实战课》

7)内存管理参数min_free_kbytes 分析 http://linuxlaoqinrennet/kernel/vm-sysctl-min_free_kbytes/

ActiveMQ持久化消息的二种方式;  1、持久化为文件  这个装ActiveMQ时默认就是这种,只要设置消息为持久化就可以了。涉及到的配置和代码有:        producerSend(request,MsgDeliveryModePersistent,level,TimeSpanMinValue);  2、持久化为MySql  首先需要把MySql的驱动放到ActiveMQ的Lib目录下,我用的文件名字是:mysql-connector-java-504-binjar  接下来修改配置文件        在配置文件中的broker节点外增加                  从配置中可以看出数据库的名称是activemq,需要手动在MySql中增加这个库。  然后重新启动消息队列,会发现多了3张表  1:activemq_acks  2:activemq_lock  3:activemq_msgs

欢迎分享,转载请注明来源:品搜搜测评网

原文地址:https://pinsoso.cn/meirong/4097822.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2024-04-12
下一篇2024-04-12

随机推荐

  • 身体乳哪个牌子好,求推荐

    以下是多位用户对各身体乳产品的使用评价,希望能够帮助到您:1 凡士林润肤乳:使用感很棒,气味是高级香水香氛,非常清爽好推开和好吸收,皮肤嫩嫩滑滑没有黏腻感,肉眼就可以看到肌肤细腻不少,皮肤也会变白。2 香奈儿邂逅清新身体乳:头香是清新茉莉花

    2024-04-15
    43800
  • 国产天气丹几个系列什么功效

    天气丹的五个系列拱辰享系列,津率享系列,美白系列,水妍系列,天气丹系列。功效如下,天气丹拱辰享系列,适合25至30岁的人使用,对皮肤干燥,发黄有着显著的效果,它里面含有的黄精和拱辰丹成分,能快速被皮肤吸收,有效促进细胞再生,保持肌肤的弹性,

    2024-04-15
    37300
  • jovisse富勒烯白金套盒和黑松露黑金套盒哪个好

    黑松露和富勒烯功效不同,都很好的成分哦。富勒烯美容功能:1、抗皱,且能防止皱纹的产生,并在皱纹产生后,可得到有效改善。并能降低皮肤中胶原蛋白分解酶的活性,从而避免肌肤中胶原蛋白的分解流失。2、清除活性氧,富勒烯对皮肤中的活性氧具有清除效果,

    2024-04-15
    37600
  • 求助大侠 铁塔上装天线的定额选取

    通信铁塔无法通过通信定额计算安装费用。工信部200875号文发布的最新通信工程概预算定额中没有铁塔安装、抱杆安装、塔基和机房建设等内容。通信铁塔、塔基、抱杆、机房等得参考土建或铁件安装等相关定额(各省单独发布的相关定额)。问题一:一般弱电接

    2024-04-15
    30100
  • 精华露和精华液的顺序

    精华露和精华液的顺序,其实并没有固定的标准。不同品牌、不同产品之间,使用顺序也可能存在一些差异。但是,一般来说,我们可以这样理解:我们需要明确两者的功能区别。精华液是一种具有高浓度活性成分的保养品,可以为肌肤提供深层营养滋润,在保持肌肤水油

    2024-04-15
    36600
  • eec黑松露奢养护肤套怎么用

    eec黑松露奢养护肤套装的使用顺序如下:1 先用eec套装中的洁面产品进行面部清洁,早晚各一次。2 使用爽肤水,这可以帮助肌肤补充水分,保持水油平衡。3 使用精华液,它的营养成分浓度较高,能够让肌肤看起来更加有光泽和弹性。使用时可以适当按摩

    2024-04-15
    42700
  • 化妆品行业的前景及优势

    ——2023年中国化妆品行业市场现状及发展前景分析 中国化妆品企业在国际化妆品市占率较低组图行业主要上市公司:珀莱雅(603605)、上海家化(600315)、丸美股份(603983)、水羊股份(300740)、贝泰妮(300740)、青岛

    2024-04-15
    37500

发表评论

登录后才能评论
保存