博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记一次线上 redis 使用分布式锁坑
阅读量:6262 次
发布时间:2019-06-22

本文共 3146 字,大约阅读时间需要 10 分钟。

hot3.png

起因

早上grafana 发来邮件警告系统异常过多..

登录 grafana 查看.

输入图片说明

排查

登录 kibana 查看相关日志.

发现错误一:

Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.UnknownHostException: redis.marathon.l4lb.thisdcos.directory	at redis.clients.jedis.Connection.connect(Connection.java:207)	at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:93)	at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1767)	at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:106)	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:868)	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:435)	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)	at redis.clients.util.Pool.getResource(Pool.java:49)	... 119 common frames omittedCaused by: java.net.UnknownHostException: redis.marathon.l4lb.thisdcos.directory	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)	at java.net.Socket.connect(Socket.java:589)	at redis.clients.jedis.Connection.connect(Connection.java:184)	... 126 common frames omitted

dcos vip 映射 ip 出错,导致服务中找不到 redis

再查看 grafana redis 监控,发现 redis io,setnx 命令都异常.如下图

输入图片说明

排查相关服务. 发现下面代码

while (!flag && start <= System.currentTimeMillis() + time) {            flag = redisTemplate.execute(new RedisCallback
() { @Override public Boolean doInRedis(RedisConnection connection) throws DataAccessException { Jedis jedis = (Jedis) connection.getNativeConnection(); if (jedis.setnx(key, UID) == 1L) { jedis.expire(key, LOCK_DEATH_TIME);//300秒过期,防止死锁.如果在这步前jvm挂了,会导致一直死锁. LOCK_MAP.put(RedisLock.this, 1); setExclusiveOwnerThread(Thread.currentThread()); return true; } return false; } });

在 setnx 方法的时候没有休眠,导致一直循环..

解决方案,while 加入 sleep

while (!flag && start <= System.currentTimeMillis() + time) {            flag = redisTemplate.execute(new RedisCallback
() { @Override public Boolean doInRedis(RedisConnection connection) throws DataAccessException { Jedis jedis = (Jedis) connection.getNativeConnection(); if (jedis.setnx(key, UID) == 1L) { jedis.expire(key, LOCK_DEATH_TIME);//300秒过期,防止死锁.如果在这步前jvm挂了,会导致一直死锁. LOCK_MAP.put(RedisLock.this, 1); setExclusiveOwnerThread(Thread.currentThread()); return true; } //循环竞争锁的时候添加休眠 try { TimeUnit.MILLISECONDS.sleep(20L); } catch (InterruptedException e) { log.error("lock error", e); } log.info("竞争锁: " + key); return false; } });

转载于:https://my.oschina.net/superwen/blog/1571214

你可能感兴趣的文章
全球顶级黑客对决AI GeekPwn2017黑客大赛看点全面曝光
查看>>
浅析前端开发中的 MVC/MVP/MVVM 模式
查看>>
toString、equals和hashCode重写
查看>>
sizeof 和strlen的区别
查看>>
Python与C++引用分析
查看>>
误删一个用户 引起数据不准确问题
查看>>
一场失败的拔河比赛
查看>>
IOS开发工程师欢迎你加入宏略信息
查看>>
java 判断当前时间符合cron时间表达式
查看>>
Telnet协议的实现
查看>>
我的友情链接
查看>>
(一)指南一、初学者指南1、简介2、安装
查看>>
约瑟夫·奈:透视网络空间
查看>>
我的友情链接
查看>>
大数据入门基础:Hadoop简介
查看>>
jdk1.7新特性
查看>>
杭电1029--Ignatius and the Princess IV(哈希)
查看>>
使用CSS3改变文本选中的默认颜色
查看>>
课后作业-阅读任务-阅读提问-3
查看>>
[130_存储业务]002_富士通存储系统Eternus_高级拷贝之对等拷贝(Advanced Copy EC)
查看>>