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

请简述网站建设的一般流程网站是怎么做出来的

请简述网站建设的一般流程,网站是怎么做出来的,wordpress安装使用教程,网站建设仟首先金手指141. setnx(lockkey, 当前时间过期超时时间) ,如果返回1,则获取锁成功;如果返回0则没有获取到锁,转向2。2. get(lockkey)获取值oldExpireTime ,并将这个value值与当前的系统时间进行比较,如果小于当前系统时间…

1. setnx(lockkey, 当前时间+过期超时时间) ,如果返回1,则获取锁成功;如果返回0则没有获取到锁,转向2。

2. get(lockkey)获取值oldExpireTime ,并将这个value值与当前的系统时间进行比较,如果小于当前系统时间,则认为这个锁已经超时,可以允许别的请求重新获取,转向3。

3. 计算newExpireTime=当前时间+过期超时时间,然后getset(lockkey, newExpireTime) 会返回当前lockkey的值currentExpireTime。

4. 判断currentExpireTime与oldExpireTime 是否相等,如果相等,说明当前getset设置成功,获取到了锁。如果不相等,说明这个锁又被别的请求获取走了,那么当前请求可以直接返回失败,或者继续重试。

5. 在获取到锁之后,当前线程可以开始自己的业务处理,当处理完毕后,比较自己的处理时间和对于锁设置的超时时间,如果小于锁设置的超时时间,则直接执行delete释放锁;如果大于锁设置的超时时间,则不需要再锁进行处理。

代码如下:

/**

* 带超时时间的锁

*

* @param lockKey 锁的键值

* @param timeUnit 锁的时间单位

* @param timeout 锁的时间长度

* @param relyOnRedisAvailable 是否依赖redis可用性

* true则redis不可用或异常情况下返回加锁失败;

* false则redis不可用或异常情况下返回加锁成功。

* @return 是否添加锁成功

*/

@Override

public boolean lock(String lockKey, TimeUnit timeUnit, long timeout, boolean relyOnRedisAvailable) {

//获取当前时间

long currentTimeMillis = System.currentTimeMillis();

String repeatSign = UUID.randomUUID().toString().replace("-", "");//重复标记

//获取超时时间的ms

long lockTimeMs = timeUnit.toMillis(timeout);

long setNx;

try {

//这里我们以 超时时间为value+标记

String setLockValue = String.valueOf(currentTimeMillis + lockTimeMs)+repeatSign;

setNx = redisClientUtil.setnx(lockKey, setLockValue);

logger.info("键值[{}]设置的setNx为:{}, setLockValue为:{}", lockKey, setNx, setLockValue);

} catch (Exception e) {

logger.error("{}设置锁异常",lockKey,e);

pubEvent(lockKey,e);

return true;

}

//如果成功了,那么我们就设置超时时间

if (setNx == 1 ) {

logger.info("键值{}获取redis锁成功",lockKey);

try {

redisClientUtil.expire(lockKey, (int)timeUnit.toSeconds(timeout));

} catch (Exception e) {

logger.error("{}设置超时时间异常,异常信息为",lockKey,e);

}

return true;

}

//以下是不成功的处理情况,即 setNx 等于0的时候,我们先获取旧的值

String lockValue = redisClientUtil.getValueByKey(lockKey);

logger.info("键值[{}],设置的lockValue为:{},重复标记为:{}", lockKey, lockValue, repeatSign);

if (StrUtil.isBlank(lockValue)) {

//如果锁value为空,直接返回成功

return true;

}

if(lockValue.contains(repeatSign)){

//如果锁value包含重复标记,则说明其为本次设置,直接返回成功

return true;

}

String lockTime = lockValue.substring(0, lockValue.indexOf("|"));//锁超时时间

if (null == lockTime) {

logger.warn("键值[{}]获取到时间戳为空, 按照获取成功返回!", lockKey);

return true;

} else {

try {

logger.info("键值[{}]redis存储的时间戳:{}, 格式化后:{}", lockKey, lockTime, DateUtil.dateToString(new Date(Long.valueOf(lockTime)), DateUtil.DEFAULT_TIMESTAMP_FORMAT));

} catch (Exception e) {

logger.warn("键值[{}]redis存储的时间戳:{}, 格式化时出现异常,不影响流程", lockKey, lockTime, e);

}

}

if (lockTime != null && Long.valueOf(lockTime)

< System.currentTimeMillis() ) {

String oldValue = redisClientUtil.getSet(lockKey,

String.valueOf(currentTimeMillis + lockTimeMs)+ "|" + repeatSign);

String oldLockTime = oldValue.substring(0, lockValue.indexOf("|"));//锁超时时间

//将两次获取的值对比,这里也就是文章第五条,如果相等说明没有被其他线程修改

if (oldValue != null && oldLockTime.equals(lockTime)) {

//这里用该还要在设置一次超时时间,可以用lua 脚本保持一致性

return true;

}

}

return false;

}

http://www.hkea.cn/news/427019/

相关文章:

  • 网站文字代码常见的网络营销工具
  • 计算机毕设网站建设怎么改长沙网站设计拓谋网络
  • 类似红盟的网站怎么做aso优化推广
  • vs2013做网站怎样制作免费网页
  • b2c网站的开发无锡网络优化推广公司
  • 网站做视频在线观看营销活动推广方案
  • wordpress多站点统计google图片搜索引擎入口
  • 麻章手机网站建设百度网盘提取码入口
  • 网站后台管理系统的重要技术指标sem竞价托管费用
  • 包头怎样做网站我想做电商怎么加入
  • 株洲企业网站建设品牌2023免费b站推广大全
  • 仿制单页面网站多少钱免费制作网站app
  • 商城网站制作网站长尾词挖掘工具
  • 夹克定制公司trinseo公司
  • 四川智能网站建设制作网站链接分析工具
  • 制作销售网站有哪些宁波网络营销推广咨询报价
  • 佛山做外贸网站服务新闻发稿平台
  • 做网站前怎么写文档域名收录
  • 中信建设有限责任公司钟宁关键词优化的方法有哪些
  • 建站之星平台优化推广网站排名
  • wordpress 网盘 插件郑州seo外包阿亮
  • 怎样建设网站首页广告营销平台
  • wordpress调起淘宝app什么叫做seo
  • 嘉兴做网站优化的公司网站维护公司
  • css层叠样式会不会影响打开网站的速度百度免费下载安装百度
  • 网站模板制作流程nba交易最新消息汇总
  • 近的网站在线客服系统网络优化工程师前景如何
  • 网站制作职业google入口
  • 广州网站 制作信科便宜网络营销软文范例500
  • 网站建设公开课长沙网站推广和优化