2021年2月1日星期一

2021年Shopify使用注意事项(建议收藏)

Shopify目前来说还是很多跨境卖家在使用的,几乎没有一家建站公司能与之匹敌,论市值,估计就BAT、FB、GG、AM、YZ这种级别的公司能相提并论。

Shopify建站平台无论是名气还是网站体验,以及生态都做得淋漓尽致,也是跨境卖家做独立站为什么会选择他们的原因之一。

但一个这么牛逼的系统必然会有更多的要求以及相关的约束,对商家销售的产品也更加严格。

对于咱们国内用户来说,必然有好有坏,暂且不说哪里好,哪里不好。

今天在这里小稣童重新梳理一下,以下内容为个人整理仅供参考,如有误差请自行到官方进行验证,关于2021年Shopify使用的注意事项

关于费用

Shopify主要分3个版本对应收费如下:

$29月租+2%佣金

$79月租+1%佣金

$229月租+0.5%佣金

假设你的月销售额1W美金,需要支付的月租费用如下:

来源网站:https://ecommerce-platforms.com/articles/shopify-pricing-starter-vs-basic-vs-professional-vs-unlimited-which-plan-is-best-for-you

这个是单单月租和佣金的费用,另外的一些费用则根据卖家的需求而定。

如模板的购买,插件的购买等属于额外的支出,卖家需要自己去选购和组装。

关于14天试用期

Shopify试用期很多人没搞懂,是不是14天试用也可以支持在线下单,可以推广发广告。

14天试用期,如果商家只是用于测试系统和体验,并不需要花钱,也不要提前购买月租付费计划,但是只有你自己能访问前台,其他人访问需要解锁密码才可以,而且不支持购物。

14天试用期,如果商家选择了付费的月租计划(套餐),绑定了自己的信用卡,确定了一个套餐计划,这个时候将会解锁前台访问密码限制,你可以绑定自己的域名和收款方式,可以进行一系列的推广,前台支持下单。14天到期后,才开始计算月租费用,中途你可以随时解绑,不会长生额外的费用。

这样对比一下,应该知道试用14天的规则了。

关于Shopify Payment

Shopify Payment暂时没有开放中国地区卖家使用。

必须在已经开放地区有实际运营的实体公司才可以通过审核,不过审核的Shopify payment会直接关闭。

简单的话,如果你没有美国香港实体就不要用Shopify payment了。

如海外实体公司员工需要提供Last 4 digits of your Social Security nember(SSN)

关于PayPal 支付

Shopify绑定PayPal账号,必须是企业的账号,不支持个人PayPal绑定。若是个人PP请先升级到企业账号。

关于其他第三方支付

目前有对接国内的支付公司有:ALLIPAY(通联)、Asiabill(AB)、iPayLinks、LianLian Pay(连连)、Oceanpayment(钱海)、PingPongPay。

其它海外支付:Stripe、2Checkout、MOLPay、,PayEase、Bogus Gateway(比特币)等。

关于产品政策

Shopify对商品审核严格,不支持违法违规、货不对板、不发货、任何侵权、仿品、擦边球产品、成人裸露等产品,容易出现封店情况。

遇到封店情况,可以通过官网客服进行申请,如果是本身就知道违规的,基本上是凉了。

非产品导致,而是自己操作失误造成误判,可以联系官网处理申诉。

关于做Shopify站群

Shopify虽然是可以月租,一些卖家觉得相比年费模式成本低一次开很多站,结果出现大量封店情况。

对于一个邮箱账号开多个站审核更加严格,同时会抽查网站。

做合规产品的卖家,建议用不同的邮箱去注册开通不同的站点,降低群体被封店的风险。

如果是做长久站群卖家,不是很建议选用Shopify, 卖家本身就具有广告基础才会考虑站群,那么就要考虑综合的成本,佣金也是一个不小的支出。

关于售后

目前Shopify在中国有自己公众号,卖家遇到问题可以通过公众号进行联系,服务时间:上午 9:00 到下午 5:00 (UTC+8)。

在英文官网的话需要通过邮件或者留言的形式进行沟通。

客服渠道链接:https://help.shopify.com/zh-CN/questions#/contact

另外他们也有社群,论坛社区等,在官网可以自行找到https://ecommerce.shopify.com/forums

关于这个服务,大部分卖家还是通过咨询网友、微信群聊、QQ群聊居多,或者自行百度搜索相关解决方案。

(来源:跨境日志)

文章来源:https://www.ikjzd.com/home/141745

跨境电商:https://www.ikjzd.com/

折扣网:https://www.ikjzd.com/w/74

dmm杂志:https://www.ikjzd.com/w/2026

hemingway:https://www.ikjzd.com/w/2344

2021年Shopify使用注意事项(建议收藏)

Shopify目前来说还是很多跨境卖家在使用的,几乎没有一家建站公司能与之匹敌,论市值,估计就BAT、FB、GG、AM、YZ这种级别的公司能相提并论。Shopify建站平台无论是名气还是网站体验,以及生态都做得淋漓尽致,也是跨境卖家做独立站为什么会选择他们的原因之一。但一个这么牛

亚马逊卖家,你的选品行不行,应该从这些方面进行考虑

亚马逊卖家,你的选品行不行,应该从这些方面进行考虑  

在新手卖家进入亚马逊平台后,其实相当长的一段时间都不知道自己究竟该选择什么产品。

其实这也是正常的,记得我们当时刚进入这个行业的时候,选的第一个产品也是靠"灵感"得来的。

只是那个时候知道亚马逊的人还不多,只要不是太烂的产品,随便做做listing都能笑着数钱。

但是,时移世易,现在的亚马逊早已不是当初那个可以闭着眼睛捡钱的地方。

当你初步选定几款产品以后,这些产品究竟能不能给你带来利润,能不能成为你亚马逊之路上的第一款成功的产品,还是需要做一些深入的分析和判断的。

换句话说,如果你在前期的选品摸索中,不幸选择了亚马逊上的"吉祥三宝"和"葫芦娃兄弟"等产品,那我劝你还是换点产品去运营。

那些产品所需要的资金和资源,真不是一般的新手卖家所能具备的。

很多新卖家可能还不知道什么是"吉祥三宝"和"葫芦娃兄弟"产品,那就先来给大家科普一下。

"吉祥三宝"是手机周边的三个最最常见的产品:手机膜、手机壳、数据线。↓↓↓

吉祥三宝这类产品,已经基本上被大卖家垄断,没有一定的各方面综合实力,贸然进入这几个产品,无异于直接扔钱。

还有"葫芦娃兄弟"产品,指的就是下面的7类产品:↓↓↓

这类产品,也是基本上呈现出了"血海"一片的情形。新手卖家进来,也基本捞不到什么好处。

新手卖家的选品,尽量还是选择不侵权、有利润、稍微蓝海一点的产品,上面的这些个超级红海产品,还是能避开就尽量避开吧。

今天我们就来讨论一下,卖家选品时,如何判断一款产品的市场前景?

1、市场的需求量

市场的需求量,也就是市场上有多少消费者需要这款商品。

这主要从该产品的主关键词的搜索量来判断。

比如说我们选择了"磨刀器"作为考察对象,那么我们就要去查询一下磨刀器的主关键词"Knife sharpener"的搜索量。

查询关键词搜索量的方式很多,像Jungle Scout、Merchant words、卖家精灵等软件都可以提供这个功能。

2、市场容量大小

市场容量大小,就是看一下在亚马逊的平台上,已经有多少卖家在卖这款产品,还有就是这些listing的实力如何。

有些卖家很兴奋的说,我选择了一款产品,自己搜了一下,该产品在亚马逊上基本没有人卖,应该是个蓝海产品。

其实这种情况要分别对待。

可能这款产品真的是蓝海产品,也可能你这款产品根本就是需求量不足,换言之就是根本卖不出去。

市场容量的大小,我们可以从亚马逊前台的搜索结果来判断,像"ipone case"这种前台搜索结果超过10万的产品,新手卖家还是不要尝试了。

还有就是要判断一下该小类目前端的listing的实力及销量。

如果类目前端的listing都是下面这样的实力型选手,说明该类目的寡头垄断已经基本形成,新手进去可能连喝汤的机会都没有。

3、产品的利润率

利润率是产品的生命线,没有利润的产品,就算再好也不能去做。

毛利的计算方式就是用你产品的售价,减去你的进货价、物流费、头程费、FBA费、佣金等等费用后的利润。

毛利率太低的产品,无法支撑后续的推广、广告、促销等活动,这点在产品上线前要考虑清楚。

4、资金周转率

亚马逊把更多的流量往FBA产品上倾斜,直接导致了亚马逊越来越成为了一个重资产的行业。

做FBA,产品一旦滞销,就成了一堆废品。

即使你选择销毁,还要支付亚马逊相关的费用。

做FBA,除了风险稍大,还有就是资金周转比较慢。

因为随着销量的增加,你发过去的货物数量也会相应增加。

你始终有大量的钱,是待在亚马逊账户和FBA仓库里的。

所以,新品上线时要计算好产品的资金周转率有多长,也就是你每投入一万块钱,大概多少天可以收回来。

这也是在计算你的风险抵抗能力,如果前面的钱没有收回来,而后面你又拿不出新的资金来运营,那亚马逊之路就是危在旦夕了。

5、产品的质量

亚马逊是个电商平台,电商平台的核心之一就是优质的产品。

质量差的产品在亚马逊上是不会有好的前景的。

有人说:只要流量够,垃圾都可以卖出去。

这句话在亚马逊上是行不通的。

即便你将垃圾卖了出去,后续的差评和退货你又该如何处理?

如果店铺因为绩效太低而被关店了,你又该如何处理?

所以产品的质量也是亚马逊卖家能否成功的关键因素之一。

如果亚马逊平台上已经存在你的这款产品,那就去好好研究一下这些listing的中差评和QA,看看产品是否存在无法解决的缺陷或弊端。

如果真的存在这些缺陷,而你又无法解决这些缺陷,那还是换一些产品吧。

6、侵权风险

在亚马逊,不侵权是运营店铺的红线之一。

侵权的产品,无论是对手举报,还是平台自查,都很难逃过知识产权这一关。

厂家持有专利的产品,上线前一定要取得厂家的授权。

没有专利的产品,也要自己去美国商标局官网或其他国家网站上去查询一下商标或专利的持有情况。

查询的方法在以前介绍过,这里就不再赘述了。

7、供应商的服务能力

爆款产品的出现,除了具备"天时、地利"的原因以外,"人和"也是一个重要的原因。

这里的"人和",就是指供应商的供应能力和配合程度。

没有一个强有力的供应商的支持,任何的畅销产品都只能是昙花一现。

供应商的考察,要从多方面进行,包括他的服务态度、配合程度、跟进速度、改款能力、交期保障、事故处理等方面。

8、产品线是否有垂直发展的可能

这属于是对产品长期发展的考虑。

亚马逊发展到现在,精品化和品牌化成为了大势所趋。

而人的精力和实力都是有限的,你不可能在很多的类目都大放异彩。

这就需要你专注于一个小的类目,在充分了解这个类目的基础上,去做精做深、做大做强。

就像我们的榜样Anker一样,刚开始不也是只专注于做数据线和充电器么。

深圳的某位卖家说的一句话我很赞同,那就是以后做产品要做"1厘米宽,100公里深",大意也就是表达出了产品垂直开发的重要性。

希望上述内容可以带给你一点点收获。

(来源:跨境老鸟Mike)


文章来源:https://www.ikjzd.com/home/141684

跨境电商:https://www.ikjzd.com/

笨鸟:https://www.ikjzd.com/w/2713

prime day:https://www.ikjzd.com/w/131.html

沃尔玛:https://www.ikjzd.com/w/220

亚马逊卖家,你的选品行不行,应该从这些方面进行考虑

在新手卖家进入亚马逊平台后,其实相当长的一段时间都不知道自己究竟该选择什么产品。其实这也是正常的,记得我们当时刚进入这个行业的时候,选的第一个产品也是靠"灵感"得来的。只是那个时候知道亚马逊的人还不多,只要不是太烂的产品,随便做做listing都能笑着数钱。但是,时移世易,现在的

Mybatis01

13:01:16

MyBatis是Apache软件基金会下的一个开源项目,前身是iBatis框架。

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射

MyBatis 采用的是 ORM(Object Relational Mapping) 对象关系映射

MyBatis 的两种映射方式:

  1. 通过

  2. 通过注解

MyBatis 的简单实现(

  1. 创建一个maven 模块
  2. 添加 pom 文件
<?

  3. 配置mybatis-config.

    配置 dataSource.properties(自己关联的数据库)

driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/study_mybatis_01_01?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername=rootpassword=root

    配置 log4j.properties(网上百度,看看需要啥)

log4j.rootLogger=DEBUG, stdoutlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

    配置mybatis-config.

<?     <!-- 貌似这里还可以插入一个驼峰命名--> </settings> <!-- 别名配置 --> <typeAliases>  <package name="cn.ttx.pojo"/> </typeAliases> <!--mybatis环境的配置--> <environments default="default">  <environment id="default">   <transactionManager type="JDBC"/>   <dataSource type="POOLED">    <property name="driver" value="${driver}"/>    <property name="url" value="${url}"/>    <property name="username" value="${username}"/>    <property name="password" value="${password}"/>   </dataSource>  </environment> </environments> <!--加载映射文件--> <mappers>  <package name="cn.ttx.dao" /> </mappers></configuration>

  完整配置

  实体类编写(个人比较懒,所以用了Lombok)

package cn.ttx.pojo;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import java.util.Date;@Data@NoArgsConstructor@AllArgsConstructorpublic class User { private Integer id; private String username; private Date birthday; private String sex; private String address;}

  测试

  1. 通过框架提供的Resources类,加载mybatis-config.

  2. 实例化会话工厂建造类SqlSessionFactoryBuilder

  3. 通过上面的SqlSessionFactoryBuilder对象,读取核心配置文件的输入流,得到会话工厂SqlSessionFactory

  4. 使用SqlSessionFactory对象,创建SqlSession对象

    1. 它相当于JDBC中的Connection对象,提供了操作数据库的CRUD方法

    2. 它提供了一个getMapper()方法,获取接口的实现对象。

  5. 获取接口的对象UserMapper,得到接口的代理对象

  6. 执行数据库的查询操作,输出用户信息

  7. 关闭会话,释放资源

package cn.ttx.dao;import cn.ttx.pojo.User;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.After;import org.junit.Before;import org.junit.Test;import java.io.InputStream;import java.util.List;public class UserMapperTest { private SqlSession sqlSession; private UserMapper userMapper; @Before public void setUp() throws Exception {  //1. 获取核心配置文件,得到输入流对象  InputStream is = Resources.getResourceAsStream("mybatis-config.

  

Mybatis执行流程

在Mybatis中一个会话(SqlSession)相当于一次访问数据库的过程,一个会话对象类似于一个Connection连接对象。

  1. Resources:Mybatis提供的一个加载资源的工具类,我们也可以使用其他方式获取配置文件的InputStream。

  2. SqlSessionFactoryBuilder:会话工厂建造类,用于创建会话工厂。

  3. SqlSessionFactory:会话工厂,全局共享一个会话工厂,用于创建会话对象。

  4. SqlSession: 会话,每次访问数据库都需要创建一个会话对象,这个会话对象不能共享。访问完成以后会话需要关闭。

 

IDEA 上面有很多 mybatis 的插件 free-mybatis (可以百度了解)

 

首次写这个东西,有什么错的地方,希望大家指出,谢谢各位大佬

 









原文转载:http://www.shaoqun.com/a/522301.html

跨境电商:https://www.ikjzd.com/

mav:https://www.ikjzd.com/w/2414

jpgoodbuy:https://www.ikjzd.com/w/1553


13:01:16MyBatis是Apache软件基金会下的一个开源项目,前身是iBatis框架。MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射MyBatis采用的是ORM(ObjectRelationalMapping)对象关系映射MyBatis的两种映射方式:通过通过注解MyBatis的简单实现(创建一个maven模块添加pom文件<?  3.配置mybat
epa认证:epa认证
五洲会海购:五洲会海购
强大关键词自动抓取软件,A到Z关键词抓取:强大关键词自动抓取软件,A到Z关键词抓取
聊聊新品推广如何选关键词:聊聊新品推广如何选关键词
2018年美联储或将加息4次,美联储加息对跨境卖家有什么影响?:2018年美联储或将加息4次,美联储加息对跨境卖家有什么影响?

106%英国人尝试新事物,宅经济和宠物行业持续火爆

受疫情影响,人们的生产生活都有了翻天覆地的变化。近日,Zenith发布了《社会热点事件对人口&消费者趋势和人文趋势影响》的分析报告,对消费习惯的改变做了总结,并预见2021年的消费趋势。

 

英国人的生活习惯发生改变

 

Zenith统计数据显示,受疫情影响,有106%的英国人开始培养新的兴趣,55%开始装修房屋;由于封锁限制,43%的英国人减少了健身房运动,购买新车下降了47%,节假日出游下降了49%。

 

相应的,人们的娱乐支出有所减少,尤其在交通、宾馆和娱乐文化方面,有的居民支出减少了25%,甚至有10%的家庭每周可减少350英镑。但在疫情结束后,有40%表示会继续健身,26%表示继续居家办公,与家庭健身、远程办公相关的产品销量也会继续上涨。

 

57%的英国人支持国货

 

Zenith在报告中预测,消费类型也会影响未来的消费趋势。如"轻奢型"(收入较高、保持乐观)和"不为所动型"(不受外因影响)消费者在未来的消费水平不会下降。有45%的消费者表示他们会继续保持"目的性消费"的状态,62%表示会购买好评产品。

 

疫情下防疫措施的严厉举措不可避免的致使民族主义抬头,如3月份有新闻称,瑞士居民不带口罩被德国边境拦截后产生愤怒。因此,"本地、国产"等成消费者购买产品的热搜关键词。其中,57%的受访者表示疫情过去后也会继续支持本地产品,41%会继续在本地商超购物。

 

宅经济和宠物行业持续火爆

 

宅经济热潮来袭:Zenith预测,疫情使人们一改聚餐、出游等传统习惯,更多的人开始享受在家的生活,超50%的受访者表示以后的娱乐活动都在家进行。在这一趋势下,有65%对自己的房屋进行了升级改造,64%将改变不健康的饮食习惯(饮料-64%、酒精-41%、红肉-33%)。

 

宠物市场继续扩大:数据显示,2020年有41%的英国人成为新晋铲屎官。其中,宠物狗的平均价格上升至1900英镑,狗狗零食的销量上涨了12%。如英国宠物零售商Pets at Home在2020年的总收入达到了3.02亿英镑,与去年相比增长18%,在线销售额增长了70.7%。

 

由此可见,社会事件会影响到人们生活的点点滴滴。卖家也要及时了解社会动态,把握未来的消费趋势。





原文转载:http://www.shaoqun.com/a/522286.html

跨境电商:https://www.ikjzd.com/

杨颜:https://www.ikjzd.com/w/1820

声网agora:https://www.ikjzd.com/w/2176


受疫情影响,人们的生产生活都有了翻天覆地的变化。近日,Zenith发布了《社会热点事件对人口&消费者趋势和人文趋势影响》的分析报告,对消费习惯的改变做了总结,并预见2021年的消费趋势。英国人的生活习惯发生改变Zenith统计数据显示,受疫情影响,有106%的英国人开始培养新的兴趣,55%开始装修房屋;由于封锁限制,43%的英国人减少了健身房运动,购买新车下降了47%,节假日出游下降了49
costco:costco
catch:catch
shopee关于重复刊登产品:shopee关于重复刊登产品
What!亚马逊抢夺第三方卖家订单?:What!亚马逊抢夺第三方卖家订单?
年轻人:为什么我不建议你盲目进入亚马逊?:年轻人:为什么我不建议你盲目进入亚马逊?

Redis分布式锁升级版RedLock及SpringBoot实现

本文讨论了普通Redis分布式锁存在的问题,图解Redis官方升级版分布式锁RedLock获取锁过程,最后基于SpringBoot实现Redis分布式锁RedLock

分布式锁概览

在多线程的环境下,为了保证一个代码块在同一时间只能由一个线程访问,Java中我们一般可以使用synchronized语法和ReetrantLock去保证,这实际上是本地锁的方式。但是现在公司都是流行分布式架构,在分布式环境下,如何保证不同节点的线程同步执行呢?因此就引出了分布式锁,它是控制分布式系统之间互斥访问共享资源的一种方式。

在一个分布式系统中,多台机器上部署了多个服务,当客户端一个用户发起一个数据插入请求时,如果没有分布式锁机制保证,那么那多台机器上的多个服务可能进行并发插入操作,导致数据重复插入,对于某些不允许有多余数据的业务来说,这就会造成问题。而分布式锁机制就是为了解决类似这类问题,保证多个服务之间互斥的访问共享资源,如果一个服务抢占了分布式锁,其他服务没获取到锁,就不进行后续操作。大致意思如下图所示:

分布式锁的特点

分布式锁一般有如下的特点:

  • 互斥性: 同一时刻只能有一个线程持有锁
  • 可重入性: 同一节点上的同一个线程如果获取了锁之后能够再次获取锁
  • 锁超时:和J.U.C中的锁一样支持锁超时,防止死锁
  • 高性能和高可用: 加锁和解锁需要高效,同时也需要保证高可用,防止分布式锁失效
  • 具备阻塞和非阻塞性:能够及时从阻塞状态中被唤醒

分布式锁的实现方式

我们一般实现分布式锁有以下几种方式:

  • 基于数据库
  • 基于Redis
  • 基于zookeeper

Redis普通分布式锁存在的问题

说到Redis分布式锁,大部分人都会想到:setnx+lua(redis保证执行lua脚本时不执行其他操作,保证操作的原子性),或者知道set key value px milliseconds nx。后一种方式的核心实现命令如下:

- 获取锁(unique_value可以是UUID等)SET resource_name unique_value NX PX 30000- 释放锁(lua脚本中,一定要比较value,防止误解锁)if redis.call("get",KEYS[1]) == ARGV[1] then  return redis.call("del",KEYS[1])else  return 0end

这种实现方式有3大要点(也是面试概率非常高的地方):

  1. set命令要用set key value px milliseconds nx
  2. value要具有唯一性;
  3. 释放锁时要验证value值,不能误解锁;

事实上这类锁最大的缺点就是它加锁时只作用在一个Redis节点上,即使Redis通过sentinel保证高可用,如果这个master节点由于某些原因发生了主从切换,那么就会出现锁丢失的情况:

  1. 在Redis的master节点上拿到了锁;
  2. 但是这个加锁的key还没有同步到slave节点;
  3. master故障,发生故障转移,slave节点升级为master节点;
  4. 导致锁丢失。

为了避免单点故障问题,Redis作者antirez基于分布式环境下提出了一种更高级的分布式锁的实现方式:Redlock。Redlock也是Redis所有分布式锁实现方式中唯一能让面试官高潮的方式。

Redis高级分布式锁:Redlock

antirez提出的redlock算法大概是这样的:

在Redis的分布式环境中,我们假设有N个Redis master。这些节点完全互相独立,不存在主从复制或者其他集群协调机制。我们确保将在N个实例上使用与在Redis单实例下相同方法获取和释放锁。现在我们假设有5个Redis master节点,同时我们需要在5台服务器上面运行这些Redis实例,这样保证他们不会同时都宕掉。

为了取到锁,客户端应该执行以下操作:

  • 获取当前Unix时间,以毫秒为单位。
  • 依次尝试从5个实例,使用相同的key和具有唯一性的value(例如UUID)获取锁。当向Redis请求获取锁时,客户端应该设置一个网络连接和响应超时时间,这个超时时间应该小于锁的失效时间。例如你的锁自动失效时间TTL为10秒,则超时时间应该在5-50毫秒之间。这样可以避免服务器端Redis已经挂掉的情况下,客户端还在死死地等待响应结果。如果服务器端没有在规定时间内响应,客户端应该尽快尝试去另外一个Redis实例请求获取锁。
  • 客户端使用当前时间减去开始获取锁时间(步骤1记录的时间)就得到获取锁使用的时间。当且仅当从大多数(N/2+1,这里是3个节点)的Redis节点都取到锁,并且使用的时间小于锁失效时间时,锁才算获取成功
  • 如果取到了锁,key的真正有效时间等于有效时间减去获取锁所使用的时间(步骤3计算的结果)。
  • 如果因为某些原因,获取锁失败(没有在至少N/2+1个Redis实例取到锁或者取锁时间已经超过了有效时间),客户端应该在所有的Redis实例上进行解锁(即便某些Redis实例根本就没有加锁成功,防止某些节点获取到锁但是客户端没有得到响应而导致接下来的一段时间不能被重新获取锁)。
  • 此处不讨论时钟漂移

Redlock源码

redisson已经有对redlock算法封装,接下来对其用法进行简单介绍,并对核心源码进行分析(假设5个redis实例)。

1. Redlock依赖

<!-- https://mvnrepository.com/artifact/org.redisson/redisson --><dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.3.2</version></dependency>

2. Redlock用法

首先,我们来看一下redission封装的redlock算法实现的分布式锁用法,非常简单,跟重入锁(ReentrantLock)有点类似:

Config config = new Config();config.useSentinelServers().addSentinelAddress("127.0.0.1:6369","127.0.0.1:6379", "127.0.0.1:6389")  .setMasterName("masterName")  .setPassword("password").setDatabase(0);RedissonClient redissonClient = Redisson.create(config);// 还可以getFairLock(), getReadWriteLock()RLock redLock = redissonClient.getLock("REDLOCK_KEY");boolean isLock;try { isLock = redLock.tryLock(); // 500ms拿不到锁, 就认为获取锁失败。10000ms即10s是锁失效时间。 isLock = redLock.tryLock(500, 10000, TimeUnit.MILLISECONDS); if (isLock) {  //TODO if get lock success, do something; }} catch (Exception e) {} finally { // 无论如何, 最后都要解锁 redLock.unlock();}

3. Redlock唯一ID

实现分布式锁的一个非常重要的点就是set的value要具有唯一性,redisson的value是怎样保证value的唯一性呢?答案是UUID+threadId。入口在redissonClient.getLock("REDLOCK_KEY"),源码在Redisson.java和RedissonLock.java中:

protected final UUID id = UUID.randomUUID();String getLockName(long threadId) { return id + ":" + threadId;}

4. Redlock获取锁

获取锁的代码为redLock.tryLock()或者redLock.tryLock(500, 10000, TimeUnit.MILLISECONDS),两者的最终核心源码都是下面这段代码,只不过前者获取锁的默认租约时间(leaseTime)是LOCK_EXPIRATION_INTERVAL_SECONDS,即30s:

<T> RFuture<T> tryLockInnerAsync(long leaseTime, TimeUnit unit, long threadId, RedisStrictCommand<T> command) { internalLockLeaseTime = unit.toMillis(leaseTime); // 获取锁时向5个redis实例发送的命令 return commandExecutor.evalWriteAsync(getName(), LongCodec.INSTANCE, command,    // 首先分布式锁的KEY不能存在,如果确实不存在,那么执行hset命令(hset REDLOCK_KEY uuid+threadId 1),并通过pexpire设置失效时间(也是锁的租约时间)    "if (redis.call('exists', KEYS[1]) == 0) then " +     "redis.call('hset', KEYS[1], ARGV[2], 1); " +     "redis.call('pexpire', KEYS[1], ARGV[1]); " +     "return nil; " +    "end; " +    // 如果分布式锁的KEY已经存在,并且value也匹配,表示是当前线程持有的锁,那么重入次数加1,并且设置失效时间    "if (redis.call('hexists', KEYS[1], ARGV[2]) == 1) then " +     "redis.call('hincrby', KEYS[1], ARGV[2], 1); " +     "redis.call('pexpire', KEYS[1], ARGV[1]); " +     "return nil; " +    "end; " +    // 获取分布式锁的KEY的失效时间毫秒数    "return redis.call('pttl', KEYS[1]);",    // 这三个参数分别对应KEYS[1],ARGV[1]和ARGV[2]    Collections.<Object>singletonList(getName()), internalLockLeaseTime, getLockName(threadId));}

获取锁的命令中,

  • KEYS[1]就是Collections.singletonList(getName()),表示分布式锁的key,即REDLOCK_KEY;
  • ARGV[1]就是internalLockLeaseTime,即锁的租约时间,默认30s;
  • ARGV[2]就是getLockName(threadId),是获取锁时set的唯一值,即UUID+threadId:

5. Redlock释放锁

释放锁的代码为redLock.unlock(),核心源码如下:

protected RFuture<Boolean> unlockInnerAsync(long threadId) { // 向5个redis实例都执行如下命令 return commandExecutor.evalWriteAsync(getName(), LongCodec.INSTANCE, RedisCommands.EVAL_BOOLEAN,   // 如果分布式锁KEY不存在,那么向channel发布一条消息   "if (redis.call('exists', KEYS[1]) == 0) then " +    "redis.call('publish', KEYS[2], ARGV[1]); " +    "return 1; " +   "end;" +   // 如果分布式锁存在,但是value不匹配,表示锁已经被占用,那么直接返回   "if (redis.call('hexists', KEYS[1], ARGV[3]) == 0) then " +    "return nil;" +   "end; " +   // 如果就是当前线程占有分布式锁,那么将重入次数减1   "local counter = redis.call('hincrby', KEYS[1], ARGV[3], -1); " +   // 重入次数减1后的值如果大于0,表示分布式锁有重入过,那么只设置失效时间,还不能删除   "if (counter > 0) then " +    "redis.call('pexpire', KEYS[1], ARGV[2]); " +    "return 0; " +   "else " +    // 重入次数减1后的值如果为0,表示分布式锁只获取过1次,那么删除这个KEY,并发布解锁消息    "redis.call('del', KEYS[1]); " +    "redis.call('publish', KEYS[2], ARGV[1]); " +    "return 1; "+   "end; " +   "return nil;",   // 这5个参数分别对应KEYS[1],KEYS[2],ARGV[1],ARGV[2]和ARGV[3]   Arrays.<Object>asList(getName(), getChannelName()), LockPubSub.unlockMessage, internalLockLeaseTime, getLockName(threadId));}

Redis实现的分布式锁轮子

下面利用SpringBoot + Jedis + AOP的组合来实现一个简易的分布式锁。

1. 自定义注解

自定义一个注解,被注解的方法会执行获取分布式锁的逻辑

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documented@Inheritedpublic @interface RedisLock { /**  * 业务键  *  * @return  */ String key(); /**  * 锁的过期秒数,默认是5秒  *  * @return  */ int expire() default 5; /**  * 尝试加锁,最多等待时间  *  * @return  */ long waitTime() default Long.MIN_VALUE; /**  * 锁的超时时间单位  *  * @return  */ TimeUnit timeUnit() default TimeUnit.SECONDS;}

2. AOP拦截器实现

在AOP中我们去执行获取分布式锁和释放分布式锁的逻辑,代码如下:

@Aspect@Componentpublic class LockMethodAspect { @Autowired private RedisLockHelper redisLockHelper; @Autowired private JedisUtil jedisUtil; private Logger logger = LoggerFactory.getLogger(LockMethodAspect.class); @Around("@annotation(com.redis.lock.annotation.RedisLock)") public Object around(ProceedingJoinPoint joinPoint) {  Jedis jedis = jedisUtil.getJedis();  MethodSignature signature = (MethodSignature) joinPoint.getSignature();  Method method = signature.getMethod();  RedisLock redisLock = method.getAnnotation(RedisLock.class);  String value = UUID.randomUUID().toString();  String key = redisLock.key();  try {   final boolean islock = redisLockHelper.lock(jedis,key, value, redisLock.expire(), redisLock.timeUnit());   logger.info("isLock : {}",islock);   if (!islock) {    logger.error("获取锁失败");    throw new RuntimeException("获取锁失败");   }   try {    return joinPoint.proceed();   } catch (Throwable throwable) {    throw new RuntimeException("系统异常");   }  } finally {   logger.info("释放锁");   redisLockHelper.unlock(jedis,key, value);   jedis.close();  } }}

3. Redis实现分布式锁核心类

@Componentpublic class RedisLockHelper { private long sleepTime = 100; /**  * 直接使用setnx + expire方式获取分布式锁  * 非原子性  *  * @param key  * @param value  * @param timeout  * @return  */ public boolean lock_setnx(Jedis jedis,String key, String value, int timeout) {  Long result = jedis.setnx(key, value);  // result = 1时,设置成功,否则设置失败  if (result == 1L) {   return jedis.expire(key, timeout) == 1L;  } else {   return false;  } } /**  * 使用Lua脚本,脚本中使用setnex+expire命令进行加锁操作  *  * @param jedis  * @param key  * @param UniqueId  * @param seconds  * @return  */ public boolean Lock_with_lua(Jedis jedis,String key, String UniqueId, int seconds) {  String lua_scripts = "if redis.call('setnx',KEYS[1],ARGV[1]) == 1 then" +    "redis.call('expire',KEYS[1],ARGV[2]) return 1 else return 0 end";  List<String> keys = new ArrayList<>();  List<String> values = new ArrayList<>();  keys.add(key);  values.add(UniqueId);  values.add(String.valueOf(seconds));  Object result = jedis.eval(lua_scripts, keys, values);  //判断是否成功  return result.equals(1L); } /**  * 在Redis的2.6.12及以后中,使用 set key value [NX] [EX] 命令  *  * @param key  * @param value  * @param timeout  * @return  */ public boolean lock(Jedis jedis,String key, String value, int timeout, TimeUnit timeUnit) {  long seconds = timeUnit.toSeconds(timeout);  return "OK".equals(jedis.set(key, value, "NX", "EX", seconds)); } /**  * 自定义获取锁的超时时间  *  * @param jedis  * @param key  * @param value  * @param timeout  * @param waitTime  * @param timeUnit  * @return  * @throws InterruptedException  */ public boolean lock_with_waitTime(Jedis jedis,String key, String value, int timeout, long waitTime,TimeUnit timeUnit) throws InterruptedException {  long seconds = timeUnit.toSeconds(timeout);  while (waitTime >= 0) {   String result = jedis.set(key, value, "nx", "ex", seconds);   if ("OK".equals(result)) {    return true;   }   waitTime -= sleepTime;   Thread.sleep(sleepTime);  }  return false; } /**  * 错误的解锁方法—直接删除key  *  * @param key  */ public void unlock_with_del(Jedis jedis,String key) {  jedis.del(key); } /**  * 使用Lua脚本进行解锁操纵,解锁的时候验证value值  *  * @param jedis  * @param key  * @param value  * @return  */ public boolean unlock(Jedis jedis,String key,String value) {  String luaScript = "if redis.call('get',KEYS[1]) == ARGV[1] then " +    "return redis.call('del',KEYS[1]) else return 0 end";  return jedis.eval(luaScript, Collections.singletonList(key), Collections.singletonList(value)).equals(1L); }}

4. Controller层控制

定义一个TestController来测试我们实现的分布式锁

@RestControllerpublic class TestController { @RedisLock(key = "redis_lock") @GetMapping("/index") public String index() {  return "index"; }}

站在巨人的肩膀上

1.Redlock:Redis分布式锁最牛逼的实现

2.基于Redis的分布式锁实现









原文转载:http://www.shaoqun.com/a/522280.html

跨境电商:https://www.ikjzd.com/

抢注商标:https://www.ikjzd.com/w/1053

mav:https://www.ikjzd.com/w/2414


本文讨论了普通Redis分布式锁存在的问题,图解Redis官方升级版分布式锁RedLock获取锁过程,最后基于SpringBoot实现Redis分布式锁RedLock分布式锁概览在多线程的环境下,为了保证一个代码块在同一时间只能由一个线程访问,Java中我们一般可以使用synchronized语法和ReetrantLock去保证,这实际上是本地锁的方式。但是现在公司都是流行分布式架构,在分布式环境
bsci:bsci
costco:costco
宁做鸡头不做凤尾,论亚马逊中小卖家的选品之道!:宁做鸡头不做凤尾,论亚马逊中小卖家的选品之道!
【资源】2020年Shopify常用的SEO工具软件整理合集:【资源】2020年Shopify常用的SEO工具软件整理合集
助力卖家提高销量,亚马逊推出Small Business Academy!:助力卖家提高销量,亚马逊推出Small Business Academy!

如何使用Elementor的图标框功能

如何使用Elementor的图标框功能

如何使用Elementor的图标框功能

在上一节课程中我们详细的讲解了《如何使用Elementor的图像框功能》,今天我们一起来学习Elementor的另外一个相似功能—图标框。图标框常见于B2B网站页面中一些需要强调要点的表达,比如说企业产品或者服务的优势,比方说一篇文章的相关论点等等。图标框功能的出现能够让我们更好的将页面核心内容进行提炼并加以强调。那么接下来,Jack老师就和同学们一起去学习 如何使用Elementor的图标框功能 。

第一步:将Elementor编辑器的图标框功能添加到内容编辑区域

如上图所示,我们在左侧的Elementor编辑器中找到箭头1所指的"图标框"功能元素,然后按住鼠标左键不松开,慢慢的拖到上图箭头2所指的地方,也就是内容编辑版块中。注意在没有将"图标框"功能元素添加到内容编辑版块区域之前,内容编辑版块外面是一个灰色的虚线框,只有当出现了一个蓝色的虚线外边框之后才代表着我们已经成功的将"图标框"功能元素添加到了内容编辑版块中!

第二步:对图标框的主体功能进行设置

2.1、"图标":指的就是上图中的五角星,我们点击之后可以在Elementor编辑器预设的图标库中选择自己需要的图标,如果系统的图标库中没有你想要的图标,那么还可以删除现有的系统图标,然后点击右下角的"上传SVG图像",上传自己已经准备好的icon。这里推荐一个比较好用的免费图标库网站—https://www.iconfont.cn/

2.2、"查看":指的是图标的展示效果,系统提供了三种表现样式,分别是默认、堆叠和框架,下面是三种样式的对比图:

2.3、"标题":指的是与该图标对应的标题文字,也就是我们需要进行强调的文字内容

2.4、"描述":与上面的标题进行对应,对标题文字进行补充和说明

2.5、"链接":指的是点击该图标之后,页面将要跳转到的目标页面URL

2.6、"图标的位置":指的是图标与文字描述部分的相对位置,分别是居左,顶部,居右三种选择

2.7、"标题HTML标签":指的是与图标对应的标题以h2或者h3或者h4等系列标签等级中的哪一种进行表现。这对谷歌SEO优化来说是有比较大的区别的,简单点说就是给谷歌搜索引擎表达这个是h系列标签中的等级。

第三步:对图标框的样式功能进行设置

3.1、"图标主要颜色和次要颜色":这里用文字描述比较拗口,Jack老师用一张颜色对比图进行了展示

主要颜色指的就是铃铛和外围的圆圈,次要颜色指的就是其他的填充区域,这样对比一下就很容易理解了

3.2、"间距":指的是图标与标题之间的距离

3.3、"尺寸":指的是整个图标甚至包括外部的圆圈的大小尺寸

3.4、"内距":指的是内部铃铛尺寸大小不变的情况下与外部的圆圈之间的距离

3.5、"旋转":指的是内部铃铛也就是图标主体的旋转角度,注意外部的圆圈或者说四方形是不会发生旋转的

3.6、"边框宽度":指的是铃铛外贸圆圈的粗细

3.7、"边框半径":因为外边框有圆圈和四方形两种表现样式,所以如果当我们选择边框半径的时候,四边形的4个直角边就会变成有一定圆弧程度的圆角,甚至还可以直接讲四边形变成圆形。

3.8、"内容对齐":指的是整个图标框,包括图标和文字部分在内容栏里面的水平对齐方式

3.9、"垂直对齐":指的是整个图标框的垂直对齐效果

3.10、"标题间距":指的是标题和下面的文字描述部分的间距

3.11、"颜色":指的是图标框中标题部分的文字颜色

3.12、"排版":指的是标题文字的字体、字号大小、字体粗细等效果设置。下面的文字描述和标题部分是一模一样的,所以这里就不再赘述了

好了,以上就是本章关于 如何使用Elementor的图标框功能 的全部内容,合理的利用Elementor编辑器的图标框功能,能够更好的为我们设计网站页面,强调我们需要表达的内容起到非常好的效果。

如果还有不理解的地方,请使用百度或者谷歌浏览器搜索关键词--Jack外贸建站,排名首页首位的就是我的网站,网站上有更多外贸建站、谷歌SEO优化、外贸客户开发等实操干货内容在等着你哦!


来源:Jack SEO

文章来源:https://www.ikjzd.com/home/141665

跨境电商:https://www.ikjzd.com/

首信易支付:https://www.ikjzd.com/w/1841

声网:https://www.ikjzd.com/w/2176

naver:https://www.ikjzd.com/w/1727

如何使用Elementor的图标框功能

如何使用Elementor的图标框功能在上一节课程中我们详细的讲解了《如何使用Elementor的图像框功能》,今天我们一起来学习Elementor的另外一个相似功能—图标框。那么接下来,Jack老师就和同学们一起去学习 如何使用Elementor的图标框功能 。

如何巧用素材,提高Facebook广告相关性得分?

1月21日(上周四),猎豹学院举办了《电商出海,素材设计如何推动营销增长》的主题直播,猎豹移动的Facebook高级优化师为大家分享了关于如何提高电商广告素材质量的一些基础操作技巧,点击"阅读原文"观看回放。今天将直播部分内容给大家整理出来,方便反复阅读并收藏!

同时应各位广告主需求,后期还会给大家安排关于广告素材的进阶课,耐心等待,进阶课更精彩哦~

一、"相关性得分"是什么?

Facebook广告的相关性得分代表广告与覆盖人群产生共鸣的程度,广告的相关性得分越高,广告的表现就越好。其包括质量排名、互动率排名、转化率排名。

质量排名(Quality Ranking):是对广告感知质量的评估。它是根据你的广告上收到的反馈和点击后体验来衡量的。这会将广告的感知质量与竞争相同受众群体的其他广告进行排名。

质量排名主要受素材质量的影响,提高创意素材的质量或定位更有可能认为广告具有较高质量的受众。避免广告创意中出现低品质内容属性。

互动率排名(Engagement Rate Ranking):根据目标受众对广告做出的反应,包括喜欢、评论、分享、点击(包括广告中任何位置的链接点击)等动作,来进行衡量评分。

互动率排和受众紧密相关,改善广告与受众的相关度(例如,让它更具吸引力、更能引起兴趣或更吸引眼球),或者定位更有可能与该广告互动的受众,可有效提升互动率排名

转化率排名(Conversion Rate Ranking):旨在说明您广告的预期转化率与竞争相同受众且具有相同优化目标的广告的对比情况。预期转化率可计算查看广告的用户完成优化目标的可能性。

提升转化率排名需要改善广告的行动号召或点击后体验,或者定位意向更高的受众。有些产品和服务的转化率自然会低于其他产品和服务。只要转化率符合预期,就可能无需调整广告。

二、广告素材的巧用

1.选择合适的广告尺寸

动态版位:建议图片采用正方形 1:1 格式,视频采用纵向 4:5 格式;

快拍版位:大多数人会竖持手机,因此快拍建议使用 9:16 格式以覆盖全屏;

视频轮播广告格式:建议所有轮播视频均使用正方形 1:1 格式和一致宽高比;

如何巧用素材,提高Facebook广告相关性得分?

2.掌握素材制作技巧

广告照片拍摄技巧

简单为上

要拍出精彩的照片,并不需要购置大批道具或是搭建复杂的场景

使用高清图片

图片模糊不清或灯光效果欠佳可能会导致人们直接略过您的广告,甚至对广告体验给出差评

优先考虑移动端体验

在移动设备上浏览照片,确保重点突出、文字清晰。

为图片设置单一焦点

画面内容过于繁杂可能会让观看者很难领会您要传达的信息。

遵守三分构图法

不要将拍摄对象置于画面正中央,建议您将拍摄主体安置在靠近图片的上下左右边缘的位置。

尝试各种拍摄角度,注意照片边缘

混用不同尺寸的物体,尝试不同的拍摄角度,营造对比效果

使用令人赏心悦目的配色

手边准备一张色轮图,方便在挑选拍摄对象时找出有趣的色彩搭配效果;

运用对比色能有效吸引人们停下来一探究竟,仔细查看您的广告;

视频广告拍摄技巧

1)在前3秒抓住受众注意力

编辑视频,先展示故事的核心部分。

尝试快速传递信息。

2)在结尾(开头)突显产品

在视频片头和片尾展示品牌或商品。

在整个广告中使用具有品牌特色的色彩、主题和图像,有助于提升品牌知名度和广告回想度。

3)提前准备内容大纲

提前准备视频脚本,最好详细到每一个片段

4)制作适于有声和静音播放的素材

采用叠加文字、排版处理和图片等信息传达方式帮助讲述故事的核心内容。还可尝试在广告中添加字幕(可使用广告管理工具中的自动字幕工具);

以创意方式使用徽标和带有品牌标识的商品照片,帮助宣传品牌;

为有声播放的用户提供音频。带音乐的广告可能更有吸引力。

5)在 Facebook 及Instagram 动态和快拍版位采用纵向宽高比: 

移动设备的屏幕尺寸比较小,因此请务必记住大多数用户都是竖握手机,以便充分利用屏幕空间。

如果您没有纵向视频,可以编辑现有视频或图片来创建纵向广告。

尝试采用不同的构图方式突出关键元素,从而吸引观看者的注意力并强化品牌信息。使用不同的空间维度或在前景和背景之间切换,打造新颖的视觉效果。

6)为静态图片添加了简单的动效

为了打造更富吸引力的广告,KAYAK为静态图片添加了简单的动态效果。 

他们为品牌徽标添加了动态效果,达到动态展示品牌信息的目的,以增强品牌知名度和记忆率。

与静图广告相比,这条广告每增加一位搜索用户所投入的费用降低了 39%。

7)一条主要信息

选择一条有影响力的营销信息。确保受众能够理解您想传达的内容,且该信息与相应的广告目标一致。

文案技巧

总而言之,移动广告领域还不成熟,您需要多多尝试,勤于总结,找出最合适的营销方案。除了巧用素材之外,品牌广告主还可以开展品牌提升调研,效果类营销广告主则可以开展拆分对比测试。


来源:猎豹移动-Facebook授权代理商

文章来源:https://www.ikjzd.com/home/141660

跨境电商:https://www.ikjzd.com/

c88:https://www.ikjzd.com/w/1017

e邮宝:https://www.ikjzd.com/w/594.html?source=tagwish

aca:https://www.ikjzd.com/w/1371

如何巧用素材,提高Facebook广告相关性得分?

同时应各位广告主需求,后期还会给大家安排关于广告素材的进阶课,耐心等待,进阶课更精彩哦~一、"相关性得分"是什么?Facebook广告的相关性得分代表广告与覆盖人群产生共鸣的程度,广告的相关性得分越高,广告的表现就越好。

硬不起来?阳痿?这7种食物助你成为“硬汉子”!

核心提示:男人硬不起来,着实是一件非常尴尬的事。男人阳痿硬不起来怎么办?吃什么可以拯救阳痿、硬不起来呢?

男人硬不起来?7类食物拯救你

1、韭菜

韭菜是深得民心的壮阳草,具有补肾益精、壮阳等功效,男性若有性功能障碍、阳痿、早泄等问题,每天可以适量吃点壮阳草。

2、枸杞

枸杞内含丰富的维生素C、维生素B1、胡萝卜素、锌、维生素B2等,是能提高男女性功能的健康良药,对肾虚者具有良好的治疗效果。

3、泥鳅

泥鳅其味甘,性平,具有益气补中、补肾养精之功效,而且含有丰富的蛋白质,成年男子常吃的话有助于滋补强身。

4、驴肉

"驴肉滚一滚,神仙站不稳",驴肉不仅美味可口,而且还是一种具有补血养气、滋阴壮阳功效的食物,对阳痿不举、腰酸腿软具有良好的治疗的效果。

5、羊肾

羊肾内含有丰富的维生素C、钙、铁、蛋白质、脂肪、维生素A等多种物质,具有壮阳益血、生精补肾等功效,阳痿肾虚的男性患者可食用。

6、荔枝

吃荔枝有助于改善人的性功能,对遗精、早泄、阳痿等疾病具有治疗效果,阳痿患者在治疗期间建议多吃些荔枝,也可以用水煎服。

7、麻雀

雀肉能补阴精,是壮阳益精的佳品,麻雀炖汤、麻雀浸酒均能起到一定食疗作用,既温补,又强壮,堪称补益佳品。

男人硬不起来,与5类食物相关

1、烟

男人烟抽多了,容易造成阴茎血循环不良,从而影响阴茎勃起。因此,烟民们为了自己的性福,建议及时戒烟。

2、酒

若男性有酗酒的习惯,容易使血液中雄激素睾酮的数量减少,造成性功能衰退、男性勃起功能障碍,或会导致精子畸形。因此预防阳痿,男人要减少酒精的摄入量。

3、腌制食物

腌制类食品内含有亚硝酸盐、硝酸盐等杂质,常吃对身体不利,不仅可以引起男性阳痿,甚至会诱发癌症。

4、霉变食物

粮食发霉后建议及时扔掉,因为霉变的食物会产生大量的病菌和黄曲霉素,一旦被人食用,轻则腹泻呕吐、重则诱发阳痿、早泄。


5、含过氧脂质的食物

过氧脂质是一种不饱和脂肪酸的过氧化物,可以损伤人体内某些正常的代谢酶系统,促使大脑早衰或导致痴呆。油炸的食物或者饼干、糕点茶油面等存放过久会产生过氧脂质,建议少吃。

许多男人得了阳痿后,经常会误信广告购买壮阳药来吃,以希望能快速回复自己性能力。其实,有时候食补比壮阳药管用,如果真的担心自己所存在的性功能障碍会影响生育、生活,建议阳痿患者积极就医,寻求医生的帮助。


原文转载:http://lady.shaoqun.com/a/265126.html

跨境电商:https://www.ikjzd.com/

inkfrog:https://www.ikjzd.com/w/668

f2c:https://www.ikjzd.com/w/1242


核心提示:男人硬不起来,着实是一件非常尴尬的事。男人阳痿硬不起来怎么办?吃什么可以拯救阳痿、硬不起来呢? 男人硬不起来?7类食物拯救你1、韭菜韭菜是深得民心的壮阳草,具有补肾益精、壮阳等功效,男性若有性功能障碍、阳痿、早泄等问题,每天可以适量吃点壮阳草。2、枸杞枸杞内含丰富的维生素C、维生素B1、胡萝卜素、锌、维生素B2等,是能提高男女性功能的健康良药,对肾虚者具有良好的治疗效果。3、泥鳅泥鳅其味
ola:ola
打折网站:打折网站
中国呼吁WTO成员方避免对新冠病毒作出贸易限制:中国呼吁WTO成员方避免对新冠病毒作出贸易限制
MaxAB获有史以来最大种子轮融资,埃及电商发展获突破?:MaxAB获有史以来最大种子轮融资,埃及电商发展获突破?
速卖通产品搜索排名规则,影响速卖通产品排名因素有哪些?:速卖通产品搜索排名规则,影响速卖通产品排名因素有哪些?

耻辱性1-9!热刺被英超倒数第四暴揍,穆里尼奥一根筋屡次跌倒_布莱顿

原标题:耻辱性1-9!热刺被英超倒数第四暴揍,穆里尼奥一根筋屡次跌倒

今天凌晨,英超第21轮继续进行:布莱顿VS热刺。面对英超倒数第四的球队,在没有凯恩的情况下,很多球迷会觉得热刺赢球没有多大问题。没想到在上半场,热刺被对手暴揍。

第16分钟,格罗斯助攻特罗萨德打破场上僵局。

之后,布莱顿围着热刺禁区,一次次冲击。幸运的是,热刺城池没有再次失守。半场比赛结束之后,双方的数据对比是(前热刺,后布莱顿):控球率55.4%-44.6%,射正0-2,射门1-9。

热刺身价7.3亿欧,布莱顿身价2.4亿欧。即使凯恩不在,热刺的身价也是秒杀后者,为何比赛踢得就如此艰难呢?看到热刺首发阵容之后,相信绝大多数球迷会认为是433:西索科+恩东贝莱+赫伊别尔踢三中场,贝尔+孙兴慜+贝尔温踢三叉戟。但是比赛真踢起来之后,我们发现竟然又是三中卫!

为何说"又"呢?上场1-3输给利物浦的那场比赛,热刺就是踢的三中卫。结果,进攻那叫一个烂;防守,更是漏洞百出。即使上赛季,热刺踢三中卫的时候,也是不咋滴!穆里尼奥,为何就屡抱着三中卫的想法不放呢?

我们看看西索科,在边翼卫上的表现,有吗?看看本-戴维斯,踢得叫什么?在进攻端,其就是一个倒脚角色,在防守端,却成为了大漏洞。热刺的丢球,他没有责任?现在的热刺这群球员(除了有伤的雷吉隆),就没有边翼卫的出色人选。后场5个人,让中场只有2个人,不仅在防守端人数单薄,就是在进攻端,恩东贝莱远离锋线三叉戟,也造成了中前场的脱节。

穆里尼奥的成名阵型是433,之后用4231也是屡创佳绩。为何,现在抱着一个三中卫就不放了呢?关键问题是,这三中卫效果奇差!穆帅,还屡次栽跟头!自己擅长的阵容都没调教出来,还想去弄一个不擅长的。真不知,穆里尼奥到底是怎么想的。难道,是不想干了,想被打下课?

热刺首发:洛里、桑切斯、阿尔德韦雷尔德、罗登、戴维斯、霍伊别尔、西索科、恩东贝莱、贝尔温、贝尔、孙兴慜

替补:哈特、多赫蒂、戴尔、坦甘加、温克斯、德韦恩、拉梅拉、卢卡斯、维尼修斯返回搜狐,查看更多

责任编辑:

原文转载:http://sport.shaoqun.com/a/389660.html

跨境电商:https://www.ikjzd.com/

tm商标:https://www.ikjzd.com/w/1069

启明星软件:https://www.ikjzd.com/w/1436


原标题:耻辱性1-9!热刺被英超倒数第四暴揍,穆里尼奥一根筋屡次跌倒今天凌晨,英超第21轮继续进行:布莱顿VS热刺。面对英超倒数第四的球队,在没有凯恩的情况下,很多球迷会觉得热刺赢球没有多大问题。没想到在上半场,热刺被对手暴揍。第16分钟,格罗斯助攻特罗萨德打破场上僵局。之后,布莱顿围着热刺禁区,一次次冲击。幸运的是,热刺城池没有再次失守。半场比赛结束之后,双方的数据对比是(前热刺,后布莱顿):控
6pm:6pm
damai:damai
美国电商销售税全面来袭?跨境电商该如何合理避税?:美国电商销售税全面来袭?跨境电商该如何合理避税?
口述:我爱上私生活混乱的已婚女人(2/2):口述:我爱上私生活混乱的已婚女人(2/2)
TikTok赚钱效应凸现:TikTok赚钱效应凸现

状元韧带撕裂!联盟确认其赛季报销 半亿大合同仅仅出场8次_尔茨

原标题:状元韧带撕裂!联盟确认其赛季报销 半亿大合同仅仅出场8次

北京时间今1月31日,联盟官方确认,魔术魔术已获得一个价值610万美元的伤病特例,这也相当于联盟确认了富尔茨的赛季报销

根据联盟的规定,伤病的检查工作必须通过官方指定的医疗机构予以确认,确认通过后,联盟才会准许球员所在的球队获得伤病特例。

今年23岁的富尔茨可谓命运多舛,三个多赛季的NBA生涯,跌宕起伏。他是2017年的状元,但出道以来备受怪病的折磨。数字人实在没有办法坚持,决定放弃富尔茨,他转头到魔术的怀抱。

外界普遍认为,控卫状元不会水!魔术给了他充分的信任,富尔茨也一点点从伤病中走出,逐渐坐稳了球队首发控卫的位置,并偶尔打出不错的比赛。

去年休赛期,奥兰多魔术官方宣布,和富尔茨签下3年5000万的合同,魔术方面认为,富尔茨将成为球队未来的重要一份子。

本赛季,富尔茨的数据也完全匹配一名先发控卫的水准,场均12.9分3.1篮板5.4助攻。但是,仅仅打了8场比赛,富尔茨就遭遇到了严重的伤病。

对阵骑士的比赛,富尔茨在突破的过程中突然倒地。没有和任何球员发生身体接触,富尔茨痛苦地捂住了膝盖。

两队的队员都围拢过来,但是没有人敢上前触碰这个命运多舛的状元,大家都已经预料到了问题的严重性,就连骑士的球员都捂住了头,不愿相信眼前这一幕。富尔茨也是一度痛到抽搐,在地板上连续翻滚。随后,富尔茨坐着轮椅离开球馆,经诊断,富尔茨遭遇左膝前十字韧带撕裂

目前,已经完成手术的富尔茨开启了漫长的康复旅程,在他受伤前,魔术的战绩是6胜2负,缺少富尔茨,魔术仅仅是2胜10负,这也足以说明富尔茨对于球队的重要性。

加油,富儿子,相信年轻的你会彻底康复,再次兑现状元的天赋!返回搜狐,查看更多

责任编辑:

原文转载:http://sport.shaoqun.com/a/389658.html

跨境电商:https://www.ikjzd.com/

extra:https://www.ikjzd.com/w/1736

心怡:https://www.ikjzd.com/w/1327


原标题:状元韧带撕裂!联盟确认其赛季报销半亿大合同仅仅出场8次北京时间今1月31日,联盟官方确认,魔术魔术已获得一个价值610万美元的伤病特例,这也相当于联盟确认了富尔茨的赛季报销。根据联盟的规定,伤病的检查工作必须通过官方指定的医疗机构予以确认,确认通过后,联盟才会准许球员所在的球队获得伤病特例。今年23岁的富尔茨可谓命运多舛,三个多赛季的NBA生涯,跌宕起伏。他是2017年的状元,但出道以来备
worldfirst:worldfirst
邮乐购物商城:邮乐购物商城
亚马逊无货源模式之五大运营技巧!:亚马逊无货源模式之五大运营技巧!
印度再次宣布产品关税,亚马逊不受影响继续收购印度零售商:印度再次宣布产品关税,亚马逊不受影响继续收购印度零售商
Facebook营销策略:独立站流量转化终极答案:Facebook营销策略:独立站流量转化终极答案

2021年1月31日星期日

Spring整合SpringMVC + Mybatis基础框架的配置文件

目录
  • 前言
  • 1. Mybatis层编写
  • 2. Spring层编写
    • 1. Spring整合Mybatis
    • 2. Spring整合service
  • 3. SpringMVC层编写
    • 1. 编写web.
    • 2. 编写spring-mvc.
  • 4. Spring配置整合文件,applicationContext.
  • 依赖

前言

新建一个普通的Maven项目

基本目录结构

├── src     	# │ ├── main    	# │ │	└── java   	# java代码目录│ │	└── resources  # 配置文件目录, 存放下面Spring配置文件│ ├── test   		# 单元测试目录├── web     	# web目录│ └── WEB-INF   	# web.


1. Mybatis层编写

1、在 resources 目录下新建数据库配置文件 database.properties

jdbc.driver=com.mysql.jdbc.Driver# 如果是使用 MySQL8.0+ 那么还需要增加一个时区的配置; serverTimezone=Asia/Shanghaijdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=true&useUnicode=true&characterEncoding=utf8jdbc.username=rootjdbc.password=123456

2、在 resources 目录下创建Mybatis配置文件 mybatis-config.

<?


2. Spring层编写

1. Spring整合Mybatis

  1. 配置Spring整合MyBatis,这里数据源使用c3p0连接池;

  2. 编写Spring整合Mybatis的相关的配置文件;在 resources 目录下创建 spring-dao.

注意:这里要引入上面Mybatis层的两个配置文件,配置文件的名称不要写错

<?

2. Spring整合service

将业务层的类注入到Spring中,在 resources 目录下创建 spring-service.

<?


3. SpringMVC层编写

resources 目录下创建 spring-mvc.

<?


依赖

<!--依赖--><dependencies> <dependency>  <groupId>org.projectlombok</groupId>  <artifactId>lombok</artifactId>  <version>1.18.10</version> </dependency> <!--Junit--> <dependency>  <groupId>junit</groupId>  <artifactId>junit</artifactId>  <version>4.13</version> </dependency> <!--数据库驱动--> <dependency>  <groupId>mysql</groupId>  <artifactId>mysql-connector-java</artifactId>  <version>5.1.47</version> </dependency> <!--数据库连接池--> <dependency>  <groupId>com.mchange</groupId>  <artifactId>c3p0</artifactId>  <version>0.9.5.2</version> </dependency> <!--Servlet - JSP --> <dependency>  <groupId>javax.servlet</groupId>  <artifactId>servlet-api</artifactId>  <version>2.5</version> </dependency> <dependency>  <groupId>javax.servlet.jsp</groupId>  <artifactId>jsp-api</artifactId>  <version>2.2</version> </dependency> <dependency>  <groupId>javax.servlet</groupId>  <artifactId>jstl</artifactId>  <version>1.2</version> </dependency> <!--Mybatis--> <dependency>  <groupId>org.mybatis</groupId>  <artifactId>mybatis</artifactId>  <version>3.5.2</version> </dependency> <dependency>  <groupId>org.mybatis</groupId>  <artifactId>mybatis-spring</artifactId>  <version>2.0.2</version> </dependency> <!--Spring--> <dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-webmvc</artifactId>  <version>5.1.9.RELEASE</version> </dependency> <dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-jdbc</artifactId>  <version>5.1.9.RELEASE</version> </dependency> <dependency>  <groupId>org.aspectj</groupId>  <artifactId>aspectjweaver</artifactId>  <version>1.9.4</version> </dependency></dependencies><!--静态资源导出问题--><build> <resources>  <resource>   <directory>src/main/java</directory>   <includes>    <include>**/*.properties</include>    <include>**/*.








原文转载:http://www.shaoqun.com/a/521234.html

跨境电商:https://www.ikjzd.com/

f2c:https://www.ikjzd.com/w/1242

凹凸曼:https://www.ikjzd.com/w/1392


目录前言1.Mybatis层编写2.Spring层编写1.Spring整合Mybatis2.Spring整合service3.SpringMVC层编写1.编写web.2.编写spring-mvc.4.Spring配置整合文件,applicationContext.依赖前言新建一个普通的Maven项目基本目录结构├──src #│├──main #││ └──java #java代码目录││ └──
环球市场:环球市场
f2c:f2c
火星人图片_火星人图片新闻资讯_火星人图片报道:火星人图片_火星人图片新闻资讯_火星人图片报道
注意!亚马逊又一站点卖家要求上传营业税ID!:注意!亚马逊又一站点卖家要求上传营业税ID!
阿里巴巴国际站公布扶持举措 面向全网商家增投海外流量:阿里巴巴国际站公布扶持举措 面向全网商家增投海外流量