redisson分布式锁php实现,分布式开发必备技能-分布式锁-redisson实现(含源码)

分布式开发必备技能-分布式锁-redisson实现

背景

​ 很久很久以前,我们的架构都是单体架构,项目也只会部署到一台服务器,基于JVM的 java 同步工具(如ReentrantLcok或synchronized)完全可以保证我们的业务的 原子性;随着微服务,分布式的出现,一个项目会部署到多台服务器(多个JVM),这时候多个服务之间的一系列操作要保证原子性,基于JVM的 java 同步工具(如ReentrantLcok或synchronized)就无能为力了,这时候需要一个针对整个项目(包含所有服务)的一个全局锁来控制业务,这时候分布式锁就应运而生。

分布式锁的 注意事项

加锁必须设置过期时间(避免死锁)

加锁操作必须和设置 过期时间 是原子性操作

并发操作下 导致加过期时间失败问题(某个线程执行完枷锁操作 未加过期时间 报错终止)

过期时间 必须保证业务操作 结束

开始子线程监控 未执行结束 续命(加过期时间)

必须保证 谁加锁 谁解锁

防止高并发下 锁失效问题

基于 redisson 实现

@RestController

public class RedissonLock {

// 分布式锁的 注意事项

// 1. 加锁必须设置过期时间

// (避免死锁)

// 2. 加锁操作必须和设置 过期时间 是原子性操作

// 并发操作下 导致加过期时间失败问题(某个线程执行完枷锁操作 未加过期时间 报错终止)

// 3. 过期时间 必须保证业务操作 结束

// 开始子线程监控 未执行结束 续命(加过期时间)

// 4. 必须保证 谁加锁 谁解锁

// 防止高并发下 锁失效问题

static int r = 0;

@Autowired

private RedissonClient redissonClient;

@GetMapping("/testLock")

public int testRedissonLock(@RequestParam boolean isLock) throws InterruptedException {

RLock rLock = null;

int result = 0;

if(isLock){

try{// 获取锁

rLock = redissonClient.getLock("test1");

// 上锁

rLock.lock(12, TimeUnit.SECONDS);

result = dobusiness();

}

finally {

// 解锁

rLock.unlock();

}

} else {

result = dobusiness();

}

return result;

}

private int dobusiness() throws InterruptedException {

++r;

TimeUnit.SECONDS.sleep(1);

System.out.println(r);

return r;

}

个人水平有限,如有问题,请各路大神指教,虚心接纳

如果觉得有帮助,请关注,谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Predis Phpredis Rediska介绍 1 Predis   Predis是一个灵活和特性完备(PHP>5 3)的支持Redis的PHP客户端 当前版本为0 6 3 默认不支持PHP5 2 主要特性如下: 完整的支持从1 2到2 4的Redis 并且支持当前正在开发的版本; 提供客户端实现的一致性哈希算法 支持自定义; 在单个或聚合连接中支持命令管道;(Command pipelining on single and aggregated connections) 能够通过TCP IP或者Unix domain sockets连接到redis 支持持久连接; 自动连接Redis实例 使用“懒惰”方式 只在第一个命令发出时执行连接; 可以灵活定义客户端的命令集合; 2 Phpredis(推荐使用)   这是一个二进制版本的PHP客户端 按照的说法 效率要比Predis高 这个版本支持作为Session的Handler 这个扩展的有点在于无需加载 任何外部文件 使用比较方便 缺点在于难于扩展 一般的PHP程序员无法对其做出扩展 考虑到Redis正在飞速发展过程中 缺乏扩展的特性还是有些影响 的 需要维护过程中注意进行升级更新 调用Redis的相关方法 Redis:: construct构造函数$redis new Redis ; 1 基本相关操作 connect open 链接redis服务 参数host: string 服务地址 port: int 端口号 timeout: float 链接时长 可选 默认为 0 不限链接时间 注: 在redis conf中也有时间 默认为300 pconnect popen 不会主动关闭的链接 参考上面 setOption 设置redis模式 getOption 查看redis设置的模式 ping 查看连接状态 get 得到某个key的值(string值) 如果该key不存在 return false set 写入key 和 value(string值) 如果写入成功 return ture">Predis Phpredis Rediska介绍 1 Predis   Predis是一个灵活和特性完备(PHP>5 3)的支持Redis的PHP客户端 当前版本为0 6 3 默认不支持PHP5 2 主要特性如下: 完整的支持从1 2到2 4的Redis 并且支持当前正在开发的版本; 提供客户 [更多]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值