Redisson是什么
Redisson 是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service) Redisson提供了使用Redis的最简单和最便捷的方法。Redisson的宗旨是促进使用者对Redis的关注分离(Separation of Concern),从而让使用者能够将精力更集中地放在处理业务逻辑上。
使用场景
- 数据共享分布式;
- 分布式锁;
- 消息队列;
- 抽奖;
- 点赞、签到、打卡;
- 商品标签;
- 排行榜...
从分布式锁开始讲起
好锁的标准:高可用,高性能,可重入,非阻塞,自定义过期时间,防死锁,(公平锁,读写锁)
对比
spring/RedisLockRegistry
原理:ReentrantLock(单机) + redis (SETNX (SET if Not eXists) 命令和 EX (expiration) )
过期时间是bean级别的,且没有续约
alturkovic/distributed-lock
原理:
基于spring aop 注解锁住整个方法,底层由redis/zk/mysql的分布式锁实现
redis时使用lua命令,单线程,支持SpEL定义key,支持自定义过期时间,续约
使用
@Lock(key = "'data'",id = "#id" ,lockType = LockTypeEnum.AUTO_LOCK)
不建议使用注解锁住整个方法,业务应该与锁更新剥离开,注解没有try-lock-finally-unlock一目了然
redissonClient.getLock()
分布式对象+Redis+WatchDog + 完善的等待重试,过期,续约机制,支持多种锁算法( SETNX EX ,或者 FairLock,ReadWriteLock,RedLock)
HELLO_WORLD
// 1,锁默认有效时间30秒,每10秒去检查并重新设置超时时间
void lock();
// 2,超过锁有效时间 leaseTime,就会释放锁
void lock(long leaseTime, TimeUnit unit);
// 3,尝试获取锁;成功则返回true,失败则返回false
boolean tryLock();
// 4,不会去启动定时任务;在 time 时间内还没有获取到锁,则返回false
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
// 5,不会去启动定时任务;当 waitTime 的时间到了,还没有获取到锁则返回false;若获取到锁了,锁的有效时间设置为 leaseTime
boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException;
COOk_BOOK
目录 · redisson/redisson Wiki · GitHub
常见问题
关于Redisson连接池管理
Redisson是基于Netty的连接池,这意味着Redisson在应用程序运行的整个生命周期中,会一直维护连接池。如果应用程序中有大量的Redisson实例,那么就会导致连接池过多,进而影响应用程序性能。
关于Redisson序列化
Redisson的序列化机制与Java的ObjectOutputStream/ObjectInputStream相似,都可以在内存中保存对象,并将其序列化以便于存储和传输。但是,由于Java对象可能具有复杂的层次结构,所以需要考虑到序列化和反序列化的效率问题,并且需要考虑到序列化大小的限制。
关于Redisson分布式锁
当使用分布式锁时,需要考虑到常见的死锁和活锁问题,以及为了避免过期时间的问题而引入的误判问题。更好的做法是先测试分布式锁的可靠性,并发现任何问题后再开始使用。
优点
Java驻内存数据网格(In-Memory Data Grid)
提供了一系列的分布式的Java常用对象(RSet,RMap,RList,RLock,RQueue。。。),还提供了许多分布式服务
子主题 3
对比
Jedis把Redis命令封装好,单线程执行,Lettuce则进一步有了更丰富的Api,基于Netty多路复用异步非阻塞的数据池连接方案,也支持了异步执行。但是两者也都点到为止,只给了你操作Redis数据库的脚手架,而Redisson则是基于Redis、Lua和Netty建立起了成熟的分布式解决方案,甚至redis官方都推荐的一种工具集。
Jedis
Lettuce