Redisson 随记

https://aperise.iteye.com/blog/2396196

Java之——redis并发读写锁,使用Redisson实现分布式锁_冰河的专栏-CSDN博客

Redisson 中包含大量的分布式线程调度组件,其多数实现依靠String(int)+LUA+发布/订阅 结构完成。

Redisson 实现的与JDK的AQS有异曲同工之妙。这里用int作为核心控制标志,LUA保证原子性CAS等操作,发布/订阅 完成AQS中双端队列的唤醒功能

官方中文文档

https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95

RedissonClient 

@Bean
    public RedissonClient getRedisson(){

        Config config = new Config();
        config.useSingleServer().setAddress("redis://" + host + ":" + port).setPassword(password);
        //添加主从配置
//        config.useMasterSlaveServers().setMasterAddress("").setPassword("").addSlaveAddress(new String[]{"",""});

        return Redisson.create(config);
    }

RLock

是可重入锁实现,通过LUA保证复合指令原子性操作。并且通过定时任务更新所持锁的TTL

RCountDownLatch 

看源码底层实现是通过 String(int)+LUA+发布/订阅


RCountDownLatch latch = redissonClient.getCountDownLatch("key");
boolean a=latch.trySetCount(1); //只有一个线程能成功,可以代替自旋锁
latch.await();

// 在其他线程或其他JVM里
RCountDownLatch latch = redissonClient.getCountDownLatch("key");
latch.countDown();  


//代替自旋锁,防止缓存击穿
while(true){
    
    if(getCache()){
        return
    }

    //原子操作,同时只有一个线程能成功trySetCount
    if (rCountDownLatch .trySetCount(1)){
       try{
            //成功
            if(getCache()){
               //二次检查
                return 
            }
        
            updateCache();
            return

        } finally {
              //解锁+唤醒其他进程/线程
              rCountDowbLatch.countDown();
        }
       
    }else{
       //没有trySetCount成功的线程等待唤醒,减少忙自旋
       //如果怕锁死,可以设置等待超时时间,保证线程能自己唤醒
       rCountDownLatch.await(); 
    }
}

latch.trySetCount(1)方法底层LUA脚本,可看到当对应的CountDownLatch已经存在时,是不会重复SetCount

if redis.call('exists', KEYS[1]) == 0 then 
   redis.call('set', KEYS[1], ARGV[2]);
   redis.call('publish', KEYS[2], ARGV[1]);
   return 1 
else 
   return 0 
end

latch.countDown()方法底层LUA脚本

local v = redis.call('decr', KEYS[1]);
if v <= 0 then redis.call('del', KEYS[1]) end;
if v == 0 then redis.call('publish', KEYS[2], ARGV[1]) end;

分布式集合

官网文档:7. 分布式集合 · redisson/redisson Wiki · GitHub

坑:

1、rmap导致内存泄漏:Redisson Map踩坑姿势_Peterinor的专栏-CSDN博客

事务

10. 额外功能 · redisson/redisson Wiki · GitHub

Redisson为RMapRMapCacheRLocalCachedMapRSetRSetCacheRBucket这样的对象提供了具有ACID属性的事务功能。Redisson事务通过分布式锁保证了连续写入的原子性,同时在内部通过操作指令队列实现了Redis原本没有的提交滚回功能。当提交滚回遇到问题的时候,将通过org.redisson.transaction.TransactionException告知用户。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值