代码拉取完成,页面将自动刷新
分布式技术提升了系统的运行效率,但是也产生了新的问题(如分布式锁、全局唯一序列等)
这些问题不能直接用Java原生的技术解决,但在分布式系统中却不可或缺
Distributor基于Redis实现常用的分布式组件,简单、可靠、开箱即用
Lock( 基于Redis的分布式锁,支持可重入锁 )
Sequence( 序列生成器,基于雪花算法、Redis )
Limit( 限流工具 )
CacheClient( 缓存客户端,目前支持Redis )
支持注解方式使用( TODO )
初始化Distributor
// 获得实例
Distributor distributor = Distributor.getInstance();
/* 连接配置(使用雪花算法生成序列可以不配置)
可以根据实际情况选择不同的配置方式 */
// 配置1 主机 + 端口 + 密码(如果有) + 默认连接池配置
distributor.initJedisConfig("xxx", 6379, "");
// 配置2 主机 + 端口 + 密码 + 自定义连接池配置
distributor.initJedisConfig(String host, int port, String auth,JedisPoolConfig jedisPoolConfig)
// 配置3 自定义连接池
distributor.initJedisConfig(JedisPool jedisPool)
回收Distributor
// 回收资源,在结束使用时调用
distributor.destory();
Lock的使用
// 获得锁对象, 只指定了锁名
ILock lock = Distributor.newRedisLock("myLock");
// 还可以手动指定锁的过期时间
ILock lock = Distributor.newRedisLock("myLock", 2000);
/* 加锁方式有3种 */
// 1. lock()方法, 直到获取锁成功为止
String lockId = lock.lock();
// 2. tryLock()方法,尝试加锁,2s内未成功返回
String lockId = lock.tryLock();
// 3. tryLock(long tryLockTime, TimeUnit unit),尝试加锁,指定尝试时间
String lockId = lock.tryLock(2000, TimeUnit.MILLISECONDS);
// ----> 业务处理
// 最后释放锁
lock.unLock(lockId);
生成全局唯一序列
/* 如果使用雪花序列生成器的话,不需要初始化Redis
直接new出来就可以用 也支持自定义工作ID和数据中心ID
*/
// 初始化方法1
ISequence sequence = Distributor.newSnowflakeSeq();
// 初始化方法2
ISequence sequence = Distributor.newSnowflakeSeq(long workerId, long datacenterId);
// 直接获取id即可
long id = sequence.nextId();
/* 如果使用Redis序列生成器的话,那么要先初始化Distributor
可以参照上面初始化的例子,然后new出来,就可以使用了
*/
// 初始化方法1 只指定key
ISequence sequence = Distributor.newRedisSeq("seq");
// 初始化方法2 指定key 单元长度 开始位置
ISequence sequence =
Distributor.newRedisSeq(String key, int step, long stepStart);
Limit限流
/* 由于使用了Redis,请参考初始化部分获得实例,
并且配置Redis连接
*/
// 获得限流器
ILimit limit = Distributor.newAccessLimit();
// 进行限流,如果未超过流量限制返回true,否则返回false
// 3个参数的意义:Redis的key,单位时间内执行次数,单位时间
limit.accessLimit("limit", 2, 1)
测试代码可以在测试类中看到(src/test)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。