4 changed files with 134 additions and 0 deletions
@ -0,0 +1,56 @@ |
|||
package com.epmet.commons.tools.config; |
|||
|
|||
import com.epmet.commons.tools.constant.NumConstant; |
|||
import com.epmet.commons.tools.constant.StrConstant; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.apache.commons.lang3.StringUtils; |
|||
import org.redisson.Redisson; |
|||
import org.redisson.api.RedissonClient; |
|||
import org.redisson.codec.JsonJacksonCodec; |
|||
import org.redisson.config.Config; |
|||
import org.springframework.beans.factory.annotation.Value; |
|||
import org.springframework.context.annotation.Bean; |
|||
import org.springframework.context.annotation.Configuration; |
|||
|
|||
/** |
|||
* redisson 配置类 |
|||
*/ |
|||
@Slf4j |
|||
@Configuration |
|||
public class RedissonConfig { |
|||
|
|||
@Value("${spring.redis.host}") |
|||
private String host; |
|||
@Value("${spring.redis.port}") |
|||
private String port; |
|||
@Value("${spring.redis.password}") |
|||
private String password; |
|||
|
|||
|
|||
@Bean |
|||
public RedissonClient getRedisson() { |
|||
if (StringUtils.isBlank(host)) { |
|||
log.warn("getRedisson redis param is null,don't need to init redissonClient"); |
|||
return null; |
|||
} |
|||
|
|||
try { |
|||
Config config = new Config(); |
|||
config.setCodec(new JsonJacksonCodec()); |
|||
config.setThreads(NumConstant.FOUR); |
|||
config.setNettyThreads(NumConstant.FOUR); |
|||
//redis://ip:port
|
|||
//redis的部署方式有单节点部署、主从方式部署、哨兵方式部署、集群方式部署
|
|||
config.useSingleServer().setAddress("redis://".concat(host).concat(StrConstant.COLON).concat(port)); |
|||
config.useSingleServer().setPassword(password); |
|||
config.useSingleServer().setConnectTimeout(NumConstant.ONE_THOUSAND * NumConstant.FIVE); |
|||
config.useSingleServer().setDatabase(NumConstant.TEN); |
|||
return Redisson.create(config); |
|||
} catch (Exception e) { |
|||
log.error("初始化redisson失败", e); |
|||
return null; |
|||
} |
|||
|
|||
} |
|||
|
|||
} |
@ -0,0 +1,61 @@ |
|||
package com.epmet.stats.test; |
|||
|
|||
import com.epmet.DataStatsApplication; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.junit.Test; |
|||
import org.junit.runner.RunWith; |
|||
import org.redisson.api.RLock; |
|||
import org.redisson.api.RedissonClient; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.boot.test.context.SpringBootTest; |
|||
import org.springframework.test.context.junit4.SpringRunner; |
|||
|
|||
import java.util.concurrent.TimeUnit; |
|||
|
|||
/** |
|||
* desc:redisson测试类 |
|||
*/ |
|||
@Slf4j |
|||
@RunWith(value = SpringRunner.class) |
|||
@SpringBootTest(classes = {DataStatsApplication.class}) |
|||
public class RedissonTest { |
|||
|
|||
@Autowired |
|||
private RedissonClient redissonClient; |
|||
|
|||
@Test |
|||
public void lockTest() { |
|||
//获取一个名为 lockName 的锁实例
|
|||
RLock lock = redissonClient.getLock("lockName"); |
|||
try { |
|||
// 尝试加锁(推荐使用)
|
|||
// 参数1 等待时长 waitTime:5 等待时长是5秒 如果5秒内还获取不到锁 则返回false,
|
|||
// 参数2 持有时长 leaseTime:5 持有锁时长超过5秒 就释放锁 此时如果继续lock.unlock()会抛出异常
|
|||
// 参数3 时间单位
|
|||
boolean bs = lock.tryLock(5, 6, TimeUnit.SECONDS); |
|||
|
|||
//如果获取不到锁 会一直阻塞到着 直至获取到锁 不推荐使用
|
|||
//lock.lock();
|
|||
|
|||
//异步方式
|
|||
/* RFuture<Void> future = lock.lockAsync(); |
|||
if (future.isSuccess()){ |
|||
//todo something
|
|||
}*/ |
|||
if (bs) { |
|||
// 业务代码
|
|||
System.out.println("进入业务代码: " + 123); |
|||
} else { |
|||
Thread.sleep(300); |
|||
} |
|||
} catch (Exception e) { |
|||
log.error("lockTest exception", e); |
|||
} finally { |
|||
//判断是否是当前线程 持有锁
|
|||
if (lock.isHeldByCurrentThread()) { |
|||
lock.unlock(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
} |
Loading…
Reference in new issue