基于Redis实现的两种分布式锁实现方式

news/2024/11/18 12:41:15/

一、基于redis实现的分布式锁
1.引入依赖:在pom.xml文件中添加Spring Cloud的依赖和缓存组件的依赖。例如,可以选择使用Redis作为缓存组件,需要添加spring-boot-starter-data-redis和jedis的依赖。

2.配置缓存:在application.yml文件中配置缓存,指定缓存的地址、端口和密码等信息。

3.定义分布式锁接口:定义一个接口,并在接口上使用@FeignClient注解,指定调用的服务名和上下文路径,该接口的方法用于获取和释放分布式锁。

	@FeignClient(value = "distributed-lock-service",contextId = "distributedLockService")
public interface DistributedLockService {@GetMapping("/lock/get")boolean getLock(@RequestParam("key") String key, @RequestParam("value") String value, @RequestParam("expireTime") int expireTime);@GetMapping("/lock/release")boolean releaseLock(@RequestParam("key") String key, @RequestParam("value") String value);
}

4.创建分布式锁实现类:使用RedisTemplate和ValueOperations来实现分布式锁的获取和释放。

@Service
public class DistributedLockServiceImpl implements DistributedLockService{@Autowiredprivate RedisTemplate<String,Object> redisTemplate;@Autowiredprivate ValueOperations<String,Object> valueOperations;@Overridepublic boolean getLock(String key, String value, int expireTime) {Boolean result = valueOperations.setIfAbsent(key, value);if(result != null && result){//设置锁的过期时间redisTemplate.expire(key,expireTime, TimeUnit.SECONDS);return true;}return false;}@Overridepublic boolean releaseLock(String key, String value) {if(redisTemplate.hasKey(key)){Object v = valueOperations.get(key);if(v != null && v.equals(value)){redisTemplate.delete(key);return true;}}return false;}
}

5.使用分布式锁:在需要加锁的方法上加上@DistributedLock注解,并指定锁的key和过期时间。

@Service
public class UserServiceImpl implements UserService {@Autowiredprivate DistributedLockService distributedLockService;@Autowiredprivate UserRepository userRepository;@Override@DistributedLock(lockKey = "#userId",expireTime = 10)public User getUserById(Long userId) {Optional<User> optionalUser = userRepository.findById(userId);if(optionalUser.isPresent()){return optionalUser.get();}return null;}
}

以上步骤可以用于在Spring Cloud中使用分布式锁。其中,关键的是通过缓存组件来实现锁的获取和释放,然后使用注解来简化业务代码的编写。
二、基于Redisson实现的分布式锁
1.引入依赖:在pom.xml文件中添加Redisson的依赖,并排除掉默认使用的Jedis和Lettuce的依赖。例如,可以添加以下依赖:

<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.16.0</version><exclusions><exclusion><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></exclusion><exclusion><groupId>redis.clients</groupId><artifactId>jedis</artifactId></exclusion></exclusions>
</dependency>

2.配置Redisson:在application.yml文件中配置Redisson连接信息,例如Redisson的地址和密码等信息。

spring:redis:host: 127.0.0.1port: 6379password:database: 0redisson:address: redis://${spring.redis.host}:${spring.redis.port}password: "${spring.redis.password}"

3.创建分布式锁实例:使用RedissonClient创建Redisson分布式锁实例。在Spring Boot中,可以直接使用RedissonAutoConfiguration自动配置类,或者使用自定义@Configuration注解来创建RedissonClient实例。例如:

@Configuration
public class RedissonConfig {@Autowiredprivate RedisProperties redisProperties;@Bean(destroyMethod = "shutdown")public RedissonClient redisson() {Config config = new Config();config.useSingleServer().setAddress(String.format("redis://%s:%d", redisProperties.getHost(), redisProperties.getPort()));return Redisson.create(config);}}

4.使用分布式锁:使用Redisson的RLock对象来实现分布式锁的获取和释放。例如在需要加锁的方法中,可以使用RLock.tryLock()方法来获取锁,并使用RLock.unlock()方法来释放锁。

@Service
public class UserServiceImpl implements UserService {@Autowiredprivate RedissonClient redissonClient;@Autowiredprivate UserRepository userRepository;@Overridepublic User getUserById(Long userId) {RLock lock = redissonClient.getLock("user_" + userId);try{//尝试获取锁,如果获取锁失败则等待boolean locked = lock.tryLock(10, TimeUnit.SECONDS);if(locked){Optional<User> optionalUser = userRepository.findById(userId);if(optionalUser.isPresent()){return optionalUser.get();}}}catch(InterruptedException e){e.printStackTrace();}finally{//释放锁lock.unlock();}return null;}
}

以上步骤可以用于在Spring Cloud中使用Redisson分布式锁。其中,关键的是使用Redisson的RLock对象来实现锁的获取和释放,而RLock对象可以通过RedissonClient创建。


http://www.ppmy.cn/news/122533.html

相关文章

【Daily Share】觉得浏览器low?手写一个浏览器扩展程序,让自己的浏览器变得与众不同!!!!

浏览器扩展 概念 扩展为浏览器添加了特性与功能。它通过我们所熟悉的 Web 技术-HTML&#xff0c;CSS 还有 JavaScript 来创建。扩展可以利用与 JavaScript 相同的网页 API&#xff0c;但是扩展也可以访问它自己专有的 JavaScript API。这意味着&#xff0c;和在网页里编码相比…

搭建一个AI对话机器人——前端ChatUI使用纪录

最近在使用 OpenAI 的 gpt api 搞着玩玩&#xff0c;然后就遇上了前端对话交互实现的需求场景&#xff0c;如何快速实现 CUI&#xff08;Chat User Interface&#xff09;成了问题。最后选择了来自阿里达摩院的ChatUI&#xff0c;本人便用于整理其使用经验。 介绍 服务于对话领…

Maven高级2-聚合与继承

1. 聚合 注意打包方式&#xff0c;不是默认的jar包形式&#xff0c;也不是web的war包形式&#xff0c;而是pom形式&#xff1b; <groupId>org.example</groupId> <artifactId>springmvc_08_parent</artifactId> <version>1.0-SNAPSHOT</versi…

谷歌android wear智能腕表 价格,谷歌Android Wear 2.0更新推送:仅三款智能手表可享受...

经过一段时间的等待之后&#xff0c;谷歌的最新一代可穿戴平台Android Wear 2.0终于正式发布。此后便有多个品牌宣布将推出搭载Android Wear 2.0的新款智能手表。在近日举办的瑞士巴塞尔国际珠宝钟表展上&#xff0c;各大品牌发布的全新Android Wear 2.0智能手表让人眼花缭乱。…

LG华为抢先苹果发布智能手表

据外媒报道&#xff0c;3月1日&#xff0c;也就是2015年西班牙巴塞罗那世界移动通讯大会召开的前一天&#xff0c;韩国LG公司和中国华为公司均抢先美国苹果公司发布了智能手表产品&#xff0c;显示出2015年智能手表领域的竞争将更加激烈。 LG公司推出的新款Urbane智能手表基本款…

Withings发布Activité Pop智能手表 价格150美元

继去年12月上市的Withings Actvit手表以450美元的价格发售后&#xff0c;其复古的外观设计&#xff0c;内置加速度仪和蓝牙功能受到了人们关注。现在&#xff0c;新版Withings Activit Pop在2015 CES展会上发布&#xff0c;价格更亲民&#xff0c;为150美元。于美国当地时间1月…

智能手表能测新冠?你的Fitbit可能是一个全功能脉搏血氧计

全文共2776字&#xff0c;预计学习时长9分钟 图源&#xff1a;unsplash 新冠病毒最让人担心的一点就是&#xff0c;它能将一名病情稳定的感染者迅速带入病危的境地。Covid-19官方指南告诉我们&#xff0c;要呆在家里&#xff0c;就像患了感冒或流感一样——休息&#xff0c;喝水…

跨界智能手表:比亚迪向左,小鹏向右

如今&#xff0c;电动化、智能化是汽车行业转型的大方向&#xff0c;而由于目前国内汽车产业在电动化方面已经算是“小有成效”&#xff0c;因此&#xff0c;抢占智能化高地&#xff0c;打造一个多设备互融的生态系统&#xff0c;就成为了车企的共同愿景。在此背景下&#xff0…