企业网站设计行业健网站怎么做

news/2025/10/6 5:04:49/文章来源:
企业网站设计行业,健网站怎么做,哦咪咖网站建设,wordpress评论通知作者1. 开局在多线程环境中#xff0c;经常会碰到需要加锁的情况#xff0c;由于现在的系统基本都是集群分布式部署#xff0c;JVM的lock已经不能满足分布式要求#xff0c;分布式锁就这样产生了。。。百度一下#xff0c;网上有很多分布式锁的方案或者例子#xff0c;琳琅满…1. 开局在多线程环境中经常会碰到需要加锁的情况由于现在的系统基本都是集群分布式部署JVM的lock已经不能满足分布式要求分布式锁就这样产生了。。。百度一下网上有很多分布式锁的方案或者例子琳琅满目看了之后不知所措总体来说有以下几种基于数据库基于zookeeper基于redis基于memcached各有优缺点和实现难度这里就不一一分析。本文主要是基于redis的setnx实现分布式锁比较简单有一定的局限性欢迎大家提出意见建议2. 加锁过程执行redis的setnx只有key不存在才能set成功(实际使用的是set(key, value, NX, EX, seconds)redis较新版本支持)如果set成功(同时也设置了key的过期时间)则表示加锁成功如果set失败则每次sleep(x)毫秒后不断尝试直到成功或者超时3. 释放过程判断加锁是否成功如果成功则执行redis的del删除4. 问题思考加锁时锁的redis key过期时间多长合适需要根据业务执行的时间长度来评估默认30秒满足绝大部分需求支持动态修改加锁时重试超时时间多长合适本文设置的是过期时间的1.2倍目的是在最坏的情况下等待锁过期后尽量保证获取到锁否则抛出超时异常。这个设置不完全合理加锁时重试的sleep时间多长合适本文采用的是随机[50-300)毫秒避免出现大量线程同时竞争目的是错峰吧释放时如何避免释放了其他线程的锁(A获取锁后由于挂起导致锁到期自动释放此时B获取到锁而A又恢复运行释放了B的锁)在初始化锁时生个一个唯一字符串作为redis锁的valuevalue一致时表明是自己的锁可以释放5. 上代码用法RedisLock lock new RedisLock(redisHelper, lockKey);try {// 执行加锁防止并发问题lock.tryLock();// do somethingsdoSomethings()}finally {// 释放锁lock.release();}RedisLock实现(注依赖RedisHepler类仅仅是对jedis的一层封装可自行实现)import org.slf4j.Logger;import org.slf4j.LoggerFactory;/*** RedisLock** version 2017-9-21上午11:56:27* author xiaoyun.zeng*/public class RedisLock {private Logger logger LoggerFactory.getLogger(getClass());/*** key前缀*/private static final String PREFIX lock:;/*** 操作redis的工具类*/private RedisHelper redisHelper;/*** redis key*/private String redisKey null;/*** redis value*/private String redisValue null;/*** 锁的过期时间(秒)默认30秒防止线程获取锁后挂掉无法释放锁*/private int lockExpire 30;/*** 尝试加锁超时时间(毫秒)默认为expire的1.2倍*/private int tryTimeout lockExpire * 1200;/*** 尝试加锁次数计数器*/private long tryCounter 0;/*** 加锁成功标记*/private boolean success false;private long startMillis 0;private long expendMillis 0;/*** RedisLock** param redisHelper* param lockKey*/public RedisLock(RedisHelper redisHelper, String lockKey) {this.redisHelper redisHelper;this.redisKey PREFIX lockKey;// 生成redis value用于释放锁时比对是否属于自己的锁// 生成规则 lockKey时间戳随机数避免重复// 乐观地认为// 1、同一毫秒内随机数相同的概率极小// 2、释放非自己线程锁的几率极小(release方法有说明这种情况)this.redisValue lockKey - System.currentTimeMillis() - this.random(10000);}/*** RedisLock** param redisHelper* param lockKey* param expire*/public RedisLock(RedisHelper redisHelper, String lockKey, int lockExpire) {this(redisHelper, lockKey);// 过期时间this.lockExpire lockExpire;// 超时时间(毫秒)默认为expire的1.2倍this.tryTimeout lockExpire * 1200;}/*** 尝试加锁* * 尝试加锁的过程将会一直阻塞下去直到加锁成功或超时** version 2017-9-21下午12:00:07* author xiaoyun.zeng* return*/public void tryLock() throws RuntimeException {startMillis System.currentTimeMillis();// 首次直接请求加锁if (!lock()) {do {// 超时判断避免永远获取不到锁的情况下一直尝试// 超时抛出runtime异常if (System.currentTimeMillis() - startMillis tryTimeout) {throw new RuntimeException(尝试加锁超时 tryTimeout ms);}// 随机休眠[50-300)毫秒// 避免出现大量线程同时竞争try {Thread.sleep(this.random(250) 50);}catch (InterruptedException e) {// 出现异常直接抛出throw new RuntimeException(e);}}while (!lock());}}/*** 释放锁** version 2017-9-21下午12:00:21* author xiaoyun.zeng* param lockKey*/public void release() {// 加锁成功才执行释放if (success) {// 释放前检查redis value是否一致// 避免A获取锁后由于挂起导致锁到期自动释放// 此时B获取到锁而A又恢复运行释放了B的锁String value redisHelper.get(redisKey);if (redisValue.equals(value)) {redisHelper.del(redisKey);logger.debug(已释放锁{}, redisValue);}}}/*** 加锁** version 2017-9-21下午6:25:58* author xiaoyun.zeng* param key* param value* param lockExpire* return*/private boolean lock() {// 加锁计数器1tryCounter;// 调用redis setnx完成加锁返回true表示加锁成功否则失败success redisHelper.setNx(redisKey, redisValue, lockExpire);// 计算总耗时expendMillis System.currentTimeMillis() - startMillis;// 记录日志if (success) {logger.debug(加锁成功尝试{}次耗时{}ms{}, tryCounter, expendMillis, redisValue);}return success;}/*** 产生随机数** version 2017-9-22上午10:05:52* author xiaoyun.zeng* param max* return*/private int random(int max) {return (int) (Math.random() * max);}}6. 测试代码单元测试RunWith(SpringRunner.class)SpringBootTestpublic class RedisLockTest {Autowiredprivate RedisHelper redisHelper;Testpublic void test() {for (int i 0; i 10; i) {new Thread(new Runnable() {Overridepublic void run() {RedisLock lock new RedisLock(redisHelper, zxy);try {lock.tryLock();try {Thread.sleep(2 * 1000);}catch (InterruptedException e) {e.printStackTrace();}}finally {lock.release();}}}).start();}while(true) {}}}日志输出2017/10/12 17:47:28.335 [Thread-8] DEBUG [RedisLock.161] 加锁成功尝试1次耗时4mszxy-1507801648330-66652017/10/12 17:47:30.340 [Thread-8] DEBUG [RedisLock.137] 已释放锁zxy-1507801648330-66652017/10/12 17:47:30.351 [Thread-14] DEBUG [RedisLock.161] 加锁成功尝试12次耗时2018mszxy-1507801648333-68662017/10/12 17:47:32.356 [Thread-14] DEBUG [RedisLock.137] 已释放锁zxy-1507801648333-68662017/10/12 17:47:32.396 [Thread-11] DEBUG [RedisLock.161] 加锁成功尝试22次耗时4065mszxy-1507801648331-52172017/10/12 17:47:34.400 [Thread-11] DEBUG [RedisLock.137] 已释放锁zxy-1507801648331-52172017/10/12 17:47:34.430 [Thread-12] DEBUG [RedisLock.161] 加锁成功尝试39次耗时6098mszxy-1507801648332-77082017/10/12 17:47:36.433 [Thread-12] DEBUG [RedisLock.137] 已释放锁zxy-1507801648332-77082017/10/12 17:47:36.453 [Thread-17] DEBUG [RedisLock.161] 加锁成功尝试50次耗时8119mszxy-1507801648334-23622017/10/12 17:47:38.457 [Thread-17] DEBUG [RedisLock.137] 已释放锁zxy-1507801648334-23622017/10/12 17:47:38.494 [Thread-9] DEBUG [RedisLock.161] 加锁成功尝试57次耗时10164mszxy-1507801648330-70862017/10/12 17:47:40.497 [Thread-9] DEBUG [RedisLock.137] 已释放锁zxy-1507801648330-70862017/10/12 17:47:40.587 [Thread-13] DEBUG [RedisLock.161] 加锁成功尝试70次耗时12254mszxy-1507801648333-88812017/10/12 17:47:42.590 [Thread-13] DEBUG [RedisLock.137] 已释放锁zxy-1507801648333-88812017/10/12 17:47:42.611 [Thread-15] DEBUG [RedisLock.161] 加锁成功尝试82次耗时14276mszxy-1507801648335-25092017/10/12 17:47:44.614 [Thread-15] DEBUG [RedisLock.137] 已释放锁zxy-1507801648335-25092017/10/12 17:47:44.699 [Thread-16] DEBUG [RedisLock.161] 加锁成功尝试89次耗时16365mszxy-1507801648334-57912017/10/12 17:47:46.702 [Thread-16] DEBUG [RedisLock.137] 已释放锁zxy-1507801648334-57912017/10/12 17:47:46.802 [Thread-10] DEBUG [RedisLock.161] 加锁成功尝试106次耗时18471mszxy-1507801648331-73472017/10/12 17:47:48.805 [Thread-10] DEBUG [RedisLock.137] 已释放锁zxy-1507801648331-7347

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/928998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

绵阳网站建设报价西安响应式网站

【LetMeFly】2316.统计无向图中无法互相到达点对数:广度优先搜索(BFS) 力扣题目链接:https://leetcode.cn/problems/count-unreachable-pairs-of-nodes-in-an-undirected-graph/ 给你一个整数 n ,表示一张 无向图 中…

创意网站建设设计济南专业网站托管公司

原标题:考前秘籍,无形资产的定义及确认考查导向:每年考3分左右;比较简单,重要程度一般;建议与“固定资产”一章一起类比学习,效果更佳,效率更高。近三年主要考点:(1)无形…

企业网站如何优化排名阳江房产网二手房林夏婷经纪人

浅谈连续逆F类的基础理论 各种逆类型的功放好像都少引人关注,因为很多人学完正的连续B/J类和连续F类,想当然的类推到了连续逆F类上面去。貌似连续逆F类就是连续F类的电压电流交换一下而已,无需额外的注意,实际并非那么简单的。 浅…

廊坊网站建设咨询青橙网络如何建设cpa影视网站

我的最后两个博客讨论了长时间轮询和Spring的DeferredResult技术,并且为了展示这些概念,我将我的Producer Consumer项目中的代码添加到了Web应用程序中。 尽管该代码演示了博客所提出的观点,但其逻辑上确实包含大量漏洞。 除了在实际的应用程…

企业电器网站建设方案服务器租用是什么意思

在linux下使用rz,就可以从本机上传到Linux服务器 在linux中rz 和 sz 命令允许开发者与主机通过串口进行传递文件了,下面我们就来简单的介绍一下rz 和 sz 命令的例子。 sz:将选定的文件发送(send)到本地机器 rz:运行该命…

网站建设对企业的好处有哪些全方位营销型网站

目录 AVL树概念 AVL树结构 AVL树插入 LL型 - 右单旋 RR型 - 左单旋 LR型 - 左右双旋 RL型 - 右左双旋 插入代码实现 AVL树测试 附AVL树实现完整代码 AVL树概念 前面的博客介绍了搜索二叉树,二叉搜索树-CSDN博客 在某些特定的情况下,⼆叉搜索树…

计算机作业做网站网站页脚信息

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 1月6日消息 谷歌起草“机器人宪法” 极越与福耀集团达成合作 三星电子宣布与现代汽车集团合作 OpenAI下周将推GP…

网站建设廴金手指花总壹柒昆山网站建设及推广

目录 1.认识PDCA: 2.PDCA循环的经典案例 3.PDCA的四个阶段和八个步骤 4.PDCA循环的优缺点: 5.案例 6.其他作用 1.认识PDCA: PDCA循环最早由美国质量统计控制之父Shewhat(休哈特)提出的PDS(Plan Do Se…

个人网站数据库大小深圳网站建设ucreator

【声呐仿真】学习记录0.5-配置ssh远程连接docker、在docker中使用nvidia显卡 配置ssh远程连接docker1.端口映射2.配置ssh 在docker中使用nvidia显卡配置CUDA 注意:之前已经创建过容器的,需要打包成镜像,重新创建容器,因为要在创建…

网站网站娱乐建设wordpress置顶文章不生效

简介 将实例化代码提取出来,放到一个类中统一管理和维护,达到和主项目依赖关系的解耦,从而提高项目的扩展性和维护性。 工厂模式将复杂的对象创建工作隐藏起来,而仅仅暴露出一个接口供客户使用,具体的创建工作由工厂管…

口碑好的秦皇岛网站建设哪里有手机建网站制作

一、章节内容概述 战略规划帮助做好当前的业务以迎接未来。战略规划需要思考业务应该是什么,当前必须做什么才能赢得未来。战略规划需要进行风险决策,需要有组织地抛弃过去的业务,要求清晰界定和明确安排为实现理想的未来而开展的工作。战略…

建网站需要软件国内经典网站

1.程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现&…

自学网站编程有多少种做网站后台程序

几天前, WildFly 9发布了,可以肯定的重点之一是Undertow Web子系统中对HTTP / 2.0的支持。 由于Hawkular最近已开始使用WildFly 9(从8.2开始)作为其基础服务器,因此尝试将http2用于从Hawkular-Wildfly-Monitor客户端到…

上海网站推广多少钱wordpress实现pdf浏览

力扣 解题报告: 二分。但是有不少细节要考虑清楚。 所以干脆考虑另一种二分的方式。也就是第二次二分的时候,把两半数组给拼成一个完整的数组,当然下标需要是虚拟的,这一步可以用偏移量取模完成。这样就不需要考虑边界情况了。 …

macOS 编辑字幕

只是为了记录。我使用的软件是 Tero Subtitler 参见:Subtitle editor software | Reddit

公司如何申请一个网站网址南京华璋建设网站

安装和创建虚拟环境 参考:linux系统下Python虚拟环境的安装和使用安装Django包 先进入虚拟环境,在联网下执行:pip install django1.8.7 1.8.7表示django的版本,如果不指定,会默认安装最新版的django。包会被安装到/usr…

网站建设是无形资产网页页面布局

这一节介绍一下 Django 的中间件。 关于中间件,官方文档的解释为:中间件是一个嵌入 Django 系统的 request 和 response 的钩子框架,是一个能够全局改变 Django 输入/输出的系统。 我们可以这样理解,一个 request 请求发送到 Dj…

reLeetCode 热题 100- 438. 找到字符串中所有字母异位词 - MKT

reLeetCode 热题 100- 438. 找到字符串中所有字母异位词 1 map 固定窗口实现 不够速度 词频统计 class Solution { public:vector<int> findAnagrams(string s, string p) {map<char,int> p_map;map<…

网站维护怎么样本溪网站设计公司

问题 你是否在项目中使用线程池遇到过以下问题&#xff1f; 1.创建线程池核心参数不好评估&#xff0c;随着业务流量的波动&#xff0c;极有可能出现生产故障。 2.不支持优雅关闭&#xff0c;当项目关闭时&#xff0c;大量正在运行的线程池任务被丢弃。 3.不支持运行时监控…