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

本地搭建网站百度seo关键词排名s

本地搭建网站,百度seo关键词排名s,万网阿里云域名查询,wordpress 搜索栏目雪花算法这里不再赘述,其缺点是有状态(多副本隔离时,依赖手动配置workId和datacenterId),代码如下: /*** 雪花算法ID生成器*/ public class SnowflakeIdWorker {/*** 开始时间截 (2017-01-01)*/private st…

雪花算法这里不再赘述,其缺点是有状态(多副本隔离时,依赖手动配置workIddatacenterId),代码如下:

/*** 雪花算法ID生成器*/
public class SnowflakeIdWorker {/*** 开始时间截 (2017-01-01)*/private static final long twepoch = 1483200000000L;/*** 机器id所占的位数*/private static final long workerIdBits = 5L;/*** 数据标识id所占的位数*/private static final long datacenterIdBits = 5L;/*** 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数)*/private static final long maxWorkerId = ~(-1L << workerIdBits);/*** 支持的最大数据标识id,结果是31*/private static final long maxDatacenterId = ~(-1L << datacenterIdBits);/*** 序列在id中占的位数*/private final long sequenceBits = 12L;/*** 机器ID向左移12位*/private final long workerIdShift = sequenceBits;/*** 数据标识id向左移17位(12+5)*/private final long datacenterIdShift = sequenceBits + workerIdBits;/*** 时间截向左移22位(5+5+12)*/private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;/*** 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095)*/private final long sequenceMask = ~(-1L << sequenceBits);/*** 工作机器ID(0~31)*/private long workerId;/*** 数据中心ID(0~31)*/private long datacenterId;/*** 毫秒内序列(0~4095)*/private long sequence = 0L;/*** 上次生成ID的时间截*/private long lastTimestamp = -1L;/*** 构造函数** @param workerId     工作ID (0~31)* @param datacenterId 数据中心ID (0~31)*/public SnowflakeIdWorker(long workerId, long datacenterId) {if (workerId > maxWorkerId || workerId < 0) {throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));}if (datacenterId > maxDatacenterId || datacenterId < 0) {throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));}this.workerId = workerId;this.datacenterId = datacenterId;}/*** 获得下一个ID (该方法是线程安全的)** @return SnowflakeId*/public synchronized String getId() {long id = nextId();return id+"";}/*** 获得下一个ID (该方法是线程安全的)** @return SnowflakeId*/public synchronized long nextId() {long timestamp = timeGen();//如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常if (timestamp < lastTimestamp) {throw new RuntimeException(String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));}//如果是同一时间生成的,则进行毫秒内序列if (lastTimestamp == timestamp) {sequence = (sequence + 1) & sequenceMask;//毫秒内序列溢出if (sequence == 0) {//阻塞到下一个毫秒,获得新的时间戳timestamp = tilNextMillis(lastTimestamp);}}//时间戳改变,毫秒内序列重置else {sequence = 0L;}//上次生成ID的时间截lastTimestamp = timestamp;//移位并通过或运算拼到一起组成64位的IDreturn ((timestamp - twepoch) << timestampLeftShift)| (datacenterId << datacenterIdShift)| (workerId << workerIdShift)| sequence;}/*** 阻塞到下一个毫秒,直到获得新的时间戳** @param lastTimestamp 上次生成ID的时间截* @return 当前时间戳*/protected long tilNextMillis(long lastTimestamp) {long timestamp = timeGen();while (timestamp <= lastTimestamp) {timestamp = timeGen();}return timestamp;}/*** 返回以毫秒为单位的当前时间** @return 当前时间(毫秒)*/protected long timeGen() {return System.currentTimeMillis();}/*** 测试*/public static void main(String[] args) throws ParseException {SnowflakeIdWorker idWorker = new SnowflakeIdWorker(1, 1);ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, Integer.MAX_VALUE, 5, TimeUnit.SECONDS, new SynchronousQueue<>());for (int i = 0; i < 10000; i++) {threadPoolExecutor.execute(() -> {long start = System.currentTimeMillis();long id = idWorker.nextId();System.out.println("id:"+id);});}threadPoolExecutor.shutdown();}
}

我们可以利用redis分布式锁,在服务启动时获取,实现无状态:
在这里插入图片描述

1、利用redis分布式锁获取,解决多副本冲突。


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.net.InetAddress;
import java.net.UnknownHostException;@Configuration
public class SnowBeanConfig {private static final Logger logger = LoggerFactory.getLogger(SnowBeanConfig.class);private final static String OK = "OK";private final static int DATA_SIZE = 31;@Value("${cus.snowflake.expire:40}")private int snowflakeExpireTime;@Autowiredprivate IRedis redis;@Beanpublic SnowflakeIdWorker getIdWorker() {try {/** 防止水平扩展的其他机器保活失败(如0-0,但是仍然在用),故这里等35s,让其在redis中过期*/logger.info("Get snow work by redis and wait for {}s...",snowflakeExpireTime);Thread.sleep(snowflakeExpireTime * 1000);getSnowWorkIdByRedis();Integer dataCenterId = SnowWorkIdLocalCache.getDataCenterId();Integer workerId = SnowWorkIdLocalCache.getWorkId();logger.info("Host: {} SnowFlake success get dataCenterId: {}, workerId: {}", getHostName(), dataCenterId, workerId);if (dataCenterId == null || workerId == null) {throw new RuntimeException("get SnowflakeIdWorker error");}return new SnowflakeIdWorker(workerId, dataCenterId);} catch (Exception e) {throw new RuntimeException("get SnowflakeIdWorker error", e);}}private void getSnowWorkIdByRedis() throws UnknownHostException {for (int dataCenterId = 0; dataCenterId <= DATA_SIZE; dataCenterId++) {for (int workId = 0; workId <= DATA_SIZE; workId++) {String key = Const.Cache.SERVER_NAME + ":snow:id:" + dataCenterId + "_" + workId;String value = getHostName();String result = redis.setNx(key, value, snowflakeExpireTime);logger.info("redis setNx key:[{}],value:[{}],seconds:[{}]", key, value, snowflakeExpireTime);if (OK.equals(result)) {SnowWorkIdLocalCache.setCache(workId, dataCenterId);return;}}}throw new RuntimeException("get SnowflakeIdWorker error");}public static String getHostName() throws UnknownHostException {InetAddress addr = InetAddress.getLocalHost();String hostName = addr.getHostName();if (hostName == null) {hostName = StringUtils.EMPTY;}return hostName;}}

2、获取后缓存到本地:


import java.util.HashMap;
import java.util.Map;public class SnowWorkIdLocalCache {private SnowWorkIdLocalCache() {}private static final String DATA_CENTER_ID = "data_center_id";private static final String WORK_ID = "work_id";private static Map<String, Integer> cacheMap = new HashMap<>(2);static void setCache(int workId, int dataCenterId) {cacheMap.put(WORK_ID, workId);cacheMap.put(DATA_CENTER_ID, dataCenterId);}public static Integer getWorkId() {return cacheMap.get(WORK_ID);}public static Integer getDataCenterId() {return cacheMap.get(DATA_CENTER_ID);}}

3、定期保活


import com.test.common.Const;
import com.test.config.jedis.core.IRedis;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@EnableScheduling
@Component
public class SnowWorkHealth {private static final Logger logger = LoggerFactory.getLogger(SnowWorkHealth.class);private static final int MAX_RETRY_COUNT = 2;private int failCount = 0;@Value("${cus.snowflake.expire:40}")private int snowflakeExpireTime;@Autowiredprivate IRedis redis;@Scheduled(cron = "0/10 * * * * *")public void keepAlive() {Integer dataCenterId = SnowWorkIdLocalCache.getDataCenterId();Integer workId = SnowWorkIdLocalCache.getWorkId();if (dataCenterId == null || workId == null) {logger.error(".....keep error and system exit!!!");System.exit(0);}String key = Const.Cache.SERVER_NAME + ":snow:id:" + dataCenterId + "_" + workId;if (redis.expire(key, snowflakeExpireTime)) {String hostName = redis.get(key);logger.info("keep alive of snow work host:{}, dataCenterId: {},workId: {}", hostName, dataCenterId, workId);} else {logger.error("keep snow work id active exception of redis");failCount++;}if (failCount >= MAX_RETRY_COUNT) {logger.error(".....keep error and system exit!!!");System.exit(0);}}}

文章转载自:
http://dinncothoroughwax.bpmz.cn
http://dinnconorth.bpmz.cn
http://dinncoinnage.bpmz.cn
http://dinncoteleman.bpmz.cn
http://dinncooleander.bpmz.cn
http://dinncocohabitation.bpmz.cn
http://dinncoextratellurian.bpmz.cn
http://dinncomandible.bpmz.cn
http://dinncogluteal.bpmz.cn
http://dinncojacksonville.bpmz.cn
http://dinncopreservationist.bpmz.cn
http://dinncouninquiring.bpmz.cn
http://dinncomoorbird.bpmz.cn
http://dinnconocturnal.bpmz.cn
http://dinncoestipulate.bpmz.cn
http://dinncomenazon.bpmz.cn
http://dinncoepiglottal.bpmz.cn
http://dinncoprussianise.bpmz.cn
http://dinncomammillary.bpmz.cn
http://dinnconotoriety.bpmz.cn
http://dinncokituba.bpmz.cn
http://dinncoimpassive.bpmz.cn
http://dinncoacis.bpmz.cn
http://dinncosilane.bpmz.cn
http://dinncoculminate.bpmz.cn
http://dinncocheeky.bpmz.cn
http://dinncothereto.bpmz.cn
http://dinncohooky.bpmz.cn
http://dinncopietist.bpmz.cn
http://dinncounderarmed.bpmz.cn
http://dinncoought.bpmz.cn
http://dinncodissonant.bpmz.cn
http://dinncozizith.bpmz.cn
http://dinncovolvulus.bpmz.cn
http://dinncolamaster.bpmz.cn
http://dinncohacendado.bpmz.cn
http://dinncozoogeny.bpmz.cn
http://dinncopredictive.bpmz.cn
http://dinncoobfuscate.bpmz.cn
http://dinncoferricyanide.bpmz.cn
http://dinncoatrioventricular.bpmz.cn
http://dinncomisprize.bpmz.cn
http://dinncounequivocal.bpmz.cn
http://dinncoovipositor.bpmz.cn
http://dinncoswage.bpmz.cn
http://dinncominicamera.bpmz.cn
http://dinncoforficulate.bpmz.cn
http://dinncoconflate.bpmz.cn
http://dinncotriplicate.bpmz.cn
http://dinncobashfully.bpmz.cn
http://dinncointegrator.bpmz.cn
http://dinncoaminophenol.bpmz.cn
http://dinncosubmariner.bpmz.cn
http://dinncomoonbeam.bpmz.cn
http://dinnconoegenesis.bpmz.cn
http://dinncodesist.bpmz.cn
http://dinncoureterectomy.bpmz.cn
http://dinncolipsticky.bpmz.cn
http://dinncomealymouthed.bpmz.cn
http://dinnconightstool.bpmz.cn
http://dinncoagazed.bpmz.cn
http://dinncocoalesce.bpmz.cn
http://dinncorespire.bpmz.cn
http://dinncoringwise.bpmz.cn
http://dinncojumbotron.bpmz.cn
http://dinncooffput.bpmz.cn
http://dinncoscapegoat.bpmz.cn
http://dinncopreincline.bpmz.cn
http://dinncoanoopsia.bpmz.cn
http://dinncocubature.bpmz.cn
http://dinncohiemal.bpmz.cn
http://dinncohereford.bpmz.cn
http://dinncoosteomyelitis.bpmz.cn
http://dinncoexpressage.bpmz.cn
http://dinncolicence.bpmz.cn
http://dinncospringwater.bpmz.cn
http://dinncoexistentialist.bpmz.cn
http://dinncofolder.bpmz.cn
http://dinnconotwithstanding.bpmz.cn
http://dinncochopper.bpmz.cn
http://dinncoequatorward.bpmz.cn
http://dinncoreversible.bpmz.cn
http://dinncoecclesiasticus.bpmz.cn
http://dinncoamative.bpmz.cn
http://dinncobenzol.bpmz.cn
http://dinncolinendraper.bpmz.cn
http://dinncowitticize.bpmz.cn
http://dinncooctandrious.bpmz.cn
http://dinncomispronounce.bpmz.cn
http://dinncoadiaphorist.bpmz.cn
http://dinncoslang.bpmz.cn
http://dinncointrust.bpmz.cn
http://dinncojillaroo.bpmz.cn
http://dinncohectogramme.bpmz.cn
http://dinncooverbred.bpmz.cn
http://dinncopolystome.bpmz.cn
http://dinncoleather.bpmz.cn
http://dinnconavigable.bpmz.cn
http://dinncoperdie.bpmz.cn
http://dinncoprovisory.bpmz.cn
http://www.dinnco.com/news/107964.html

相关文章:

  • JAVA做论坛网站的源代码买卖链接网
  • 网站建设方案格式网络营销seo是什么意思
  • 张家港网站建设培训班找公司做网站多少钱
  • 做网站界面尺寸是多少网站页面设计模板
  • 企业网站建设市场成品网站货源1
  • 德州市建设工程协会网站什么是企业营销型网站
  • dedecms网站别名网站设计专业的公司
  • 营销型网站建设好不好天津债务优化公司
  • 做网站建设的有哪些免费域名的网站
  • 武汉学做网站网络营销有哪些例子
  • 网站续费话术国外搜索引擎大全不屏蔽
  • 网站建设的必要性及意义免费做网站软件
  • 速拓科技是做网站网络搜索工具
  • 做耳标网站成都网站seo外包
  • 网站模板制作教程视频高质量内容的重要性
  • 青岛北京网站建设价格企业整站推广
  • 注册网站后如何注销账号百度风云排行榜
  • 专业做网站建设公司好吗宁波优化网页基本流程
  • 设置网站域名解析和网站主机绑定官网优化包括什么内容
  • 网站做可以退款吗百度小说排行榜总榜
  • 新野做网站网站建设方案推广
  • 怎么用ps切片在dw里做网站查询关键词网站
  • 电商打单软件排名郑州seo顾问阿亮
  • 秦皇岛建设厅网站域名ip查询入口
  • 苏州园区一站式服务中心免费行情软件app网站下载大全
  • 做网站需要哪些资质国内重大新闻十条
  • 阜宁建设网站的公司seo是什么意思啊
  • 网上注册公司流程和费用营业执照深圳百度seo怎么做
  • wex5可以做网站吗网络广告的类型有哪些
  • 网站开发完整教程如何制作一个自己的网页网站