Tomcat集群与Redis分布式(十三)——Redisson框架及项目集成

之前的笔记在个人的微博文章中,地址:https://weibo.com/3176843017/profile?profile_ftype=1&is_article=1\#_0

 

Redisson介绍

  1. Redisson是架设在Redis基础上的一个java驻内存数据网格。
  2. Redisson在基于NIO的Netty框架上,充分的利用了Redis键值数据库提供的一系列优势。
  3. 在java使用工具包中常用接口的基础上,为使用者提供了一系列具有分布式特性的常用工具类。
  4. 使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度。
  5. 同时结合各富特色的分布式服务,更进一步简化了分布式环境中程序相互之间的协作。

Redisson官方网站

  1. 官网:https://redisson.org
  2. Github:https://github.com/redisson/
  3. wiki:https://github.com/redisson/redisson/wiki

Redisson框架集成

在pom.xml中放入依赖redisson和 jackson-dataformat-avro

 

1 <dependency> 2 <groupId>org.redisson</groupId> 3 <artifactId>redisson</artifactId> 4 <version>2.9.0</version> 5 </dependency> 6 7 <dependency> 8 <groupId>com.fasterxml.jackson.dataformat</groupId> 9 <artifactId>jackson-dataformat-avro</artifactId> 10 <version>2.9.0</version> 11 </dependency> 12

Redisson初始化方法

1public class RedissonManager { 2 3 private Config config = new Config(); 4 private Redisson redisson = null; 5 6 public Redisson getRedisson() { 7 return redisson; 8 } 9 10 private static String redis1Ip = PropertiesUtil.getProperty("redis1.ip"); 11 private static Integer redis1Port = Integer.parseInt(PropertiesUtil.getProperty("redis1.port")); 12 private static String redis2Ip = PropertiesUtil.getProperty("redis2.ip"); 13 private static Integer redis2Port = Integer.parseInt(PropertiesUtil.getProperty("redis2.port")); 14 15 //在构造器完成之后执行init方法 16 @PostConstruct 17 private void init() { 18 try { 19 config.useSingleServer().setAddress(new StringBuilder().append(redis1Ip).append(":").append(redis1Port).toString()); 20 redisson = (Redisson) Redisson.create(config); 21 log.info("初始化Redisson结束"); 22 } catch (Exception e) { 23 log.error("redisson init error", e); 24 } 25 } 26 27} 28

、利用Redisson编写关单操作,默认将等待时间设置为0秒

1@Scheduled(cron = "0 */1 * * * ?")//每一分钟(每个一分钟的整数倍) 2 public void closeOrderTaskV4() { 3 RLock lock = redissonManager.getRedisson().getLock(Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK); 4 boolean getLock = false; 5 try { 6 //等待时间waitTime,释放时间leaseTime 7 if (getLock = lock.tryLock(0, 50, TimeUnit.SECONDS)) { 8 log.info("Redisson获取到分布式锁:{},ThreadName:{}", Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK, Thread.currentThread().getName()); 9 int hour = Integer.parseInt(PropertiesUtil.getProperty("close.order.task.time.hour", "2")); 10// iOrderService.closeOrder(hour); 11 } else { 12 log.info("Redisson没有获取到分布式锁:{},ThreadName:{}", Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK, Thread.currentThread().getName()); 13 } 14 } catch (InterruptedException e) { 15 log.error("Redisson分布式锁获取异常", e); 16 } finally { 17 if (!getLock) { 18 return; 19 } 20 lock.unlock(); 21 log.info("Redisson分布式锁释放锁"); 22 } 23 24 } 25

redis主从配置:在6380端口的redis中redis.windows.conf文件中加上下面的配置,这样6379为主,6380为从,6380只可读不可写,6379中写入的数据,会同步到6380中。

 

 

 

 

 

 

 

 

 

 

 

 

代码交流 2021