分布式锁结合SpringCache( 二 )
1、分布式锁演进:
文章插图
1.1、分布式锁阶段一:
文章插图
1.2、分布式锁阶段二:
文章插图
1.3、 分布式锁阶段三:
文章插图
1.4、分布式锁阶段四:
文章插图
1.5、演进代码:public Map> getCatalogJsonFromDbWithRedisLock() {//1、占分布式锁 , 去redis占坑同时加锁成功(原子性) , 设置过期时间(30秒) 。 假设过程出问题直接过期不会发生死锁 , 改进第阶段1和阶段2 , 使用setIfAbsent原子命令将获取锁和过期时间同时设置String uuid = UUID.randomUUID().toString();Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", uuid, 300, TimeUnit.SECONDS);if (lock) {System.out.println("获取分布式锁成功");Map> dataFromDb;try {//执行业务dataFromDb = getDataFromDb();} finally {//删除锁.redisTemplate.opsForValue().get("lock")获取需要时间释放锁 , 存在“不可重复读” , 所以获取后删除过程也要要求原子性;/*String lockValue = http://kandian.youth.cn/index/redisTemplate.opsForValue().get("lock");if (uuid.equals(lockValue)){redisTemplate.delete("lock");}*///使用脚本 , 改进阶段4String script = "if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end";//publicT execute(RedisScript script, List4、Redisson实践:1、Redisson官方文档:2、Redisson可重用锁: @ResponseBody@GetMapping("/hello")public String hello(){RLock lock= redisson.getLock("my-lock");lock.lock(10, TimeUnit.SECONDS);//这种方法不会自动续期//Redisson功能://1、可以锁的自动续期 , 如果业务超长 , 因此不用担心业务时间过长自动删锁//2、枷锁业务只要运行完成 , 就不会给当业务续期 。 默认是30s后自动删锁try{//模拟业务超长执行System.out.println("加锁成功"+Thread.currentThread().getId());Thread.sleep(30000);} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}return "hello";}
推荐阅读
- Kensington发布StudioDock 将iPad Pro扩展坞与无线充电器相结合
- 为中国医疗健康产业护航,“医工结合”的机会和趋势在哪里?
- java 从零实现属于你的 redis 分布式锁
- 荣耀游戏本实测分享“性能与智能”完美结合
- 中医与人工智能结合,是必然趋势还是双刃剑?
- HarmonyOS 2.0手机开发者Beta版真来了!快来升级EMUI11提前感受分布式技术
- 四核强性能,华硕XD4灵耀AX魔方分布式路由评测
- 为升级鸿蒙做准备 EMU 11分布式技术提前预演
- 分布式天花板?阿里百万架构师的ZK+Dubbo笔记,颠覆认知
- 为什么分布式云是下一代云计算?Gartner分析师这样解释
