Java企业级电商项目架构演进之路 Tomcat集群与Redis分布式
Redisson介绍
Redisson是架设在Redis基础上的一个java驻内存数据网格。
Redisson在基于NIO的Netty框架上,充分的利用了Redis键值数据库提供的一系列优势。
在java使用工具包中常用接口的基础上,为使用者提供了一系列具有分布式特性的常用工具类。
使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度。
同时结合各富特色的分布式服务,更进一步简化了分布式环境中程序相互之间的协作。
Redisson官方网站
官网:https://redisson.org
Github:https://github.com/redisson/
wiki:https://github.com/redisson/redisson/wiki
Redisson框架集成
在pom.xml中放入依赖redisson和 jackson-dataformat-avro
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-avro</artifactId>
<version>2.9.0</version>
</dependency>
Redisson初始化方法
public class RedissonManager {
private Config config = new Config();
private Redisson redisson = null;
public Redisson getRedisson() {
return redisson;
}
private static String redis1Ip = PropertiesUtil.getProperty("redis1.ip");
private static Integer redis1Port = Integer.parseInt(PropertiesUtil.getProperty("redis1.port"));
private static String redis2Ip = PropertiesUtil.getProperty("redis2.ip");
private static Integer redis2Port = Integer.parseInt(PropertiesUtil.getProperty("redis2.port"));
//在构造器完成之后执行init方法
@PostConstruct
private void init() {
try {
config.useSingleServer().setAddress(new StringBuilder().append(redis1Ip).append(":").append(redis1Port).toString());
redisson = (Redisson) Redisson.create(config);
log.info("初始化Redisson结束");
} catch (Exception e) {
log.error("redisson init error", e);
}
}
}
、利用Redisson编写关单操作,默认将等待时间设置为0秒
@Scheduled(cron = "0 */1 * * * ?")//每一分钟(每个一分钟的整数倍)
public void closeOrderTaskV4() {
RLock lock = redissonManager.getRedisson().getLock(Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK);
boolean getLock = false;
try {
//等待时间waitTime,释放时间leaseTime
if (getLock = lock.tryLock(0, 50, TimeUnit.SECONDS)) {
log.info("Redisson获取到分布式锁:{},ThreadName:{}", Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK, Thread.currentThread().getName());
int hour = Integer.parseInt(PropertiesUtil.getProperty("close.order.task.time.hour", "2"));
// iOrderService.closeOrder(hour);
} else {
log.info("Redisson没有获取到分布式锁:{},ThreadName:{}", Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK, Thread.currentThread().getName());
}
} catch (InterruptedException e) {
log.error("Redisson分布式锁获取异常", e);
} finally {
if (!getLock) {
return;
}
lock.unlock();
log.info("Redisson分布式锁释放锁");
}
}
redis主从配置:在6380端口的redis中redis.windows.conf文件中加上下面的配置,这样6379为主,6380为从,6380只可读不可写,6379中写入的数据,会同步到6380中
原文地址:https://www.cnblogs.com/itpy/p/11825738.html