目录

一、Jedis实现分布式锁

二、Redisson实现分布式锁(单机Redis)

一、引入依赖(3.5.7)

二、配置redis

三、配置RedisonConfig

四、提供锁接口及实现,方便统一调用

五、提供测试接口,测试分布式锁


一、Jedis实现分布式锁

二、Redisson实现分布式锁(单机Redis)

一、引入依赖(3.5.7)

        <!-- redisson 分布式锁 --><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.5.7</version></dependency>

二、配置redis

spring.redis.database=1
## redis host
spring.redis.host=localhost
## redis port
spring.redis.port=6379
## redis password
spring.redis.password=123456
## redis password
spring.redis.timeout=30000
## redis pool
spring.redis.jedis.pool.max-active=500
spring.redis.jedis.pool.max-idle=1000
spring.redis.jedis.pool.max-wait=6000ms
spring.redis.jedis.pool.min-idle=4

三、配置RedisonConfig

@Component
@ConfigurationProperties(prefix = "spring.redis")
@Data
public class RedisProperties {/** IP */private String host;/** 端口 */private String port;/** 密码 */private String password;}
@Configuration
public class RedissonConfig {@Autowiredprivate RedisProperties redisProperties;// 单机模式@Beanpublic RedissonClient getRedisson(){Config config = new Config();config.useSingleServer().setAddress("redis://" + redisProperties.getHost() + ":" + redisProperties.getPort()).setPassword(redisProperties.getPassword());return Redisson.create(config);}}

四、提供锁接口及实现,方便统一调用

public interface DistributedLocker {RLock lock(String lockKey);RLock lock(String lockKey, long timeout);RLock lock(String lockKey, TimeUnit unit, long timeout);boolean tryLock(String lockKey, TimeUnit unit, long waitTime, long leaseTime);void unlock(String lockKey);void unlock(RLock lock);}
@Component
public class RedissonDistributedLocker implements DistributedLocker {@Autowiredprivate RedissonClient redissonClient;/*** lock(), 拿不到lock就不罢休,不然线程就一直block* @param lockKey* @return*/@Overridepublic RLock lock(String lockKey) {RLock lock = redissonClient.getLock(lockKey);lock.lock();return lock;}/*** leaseTime为加锁时间,单位为秒* @param lockKey* @param leaseTime* @return*/@Overridepublic RLock lock(String lockKey, long leaseTime) {RLock lock = redissonClient.getLock(lockKey);lock.lock(leaseTime, TimeUnit.SECONDS);return lock;}/*** timeout为加锁时间,时间单位由unit确定* @param lockKey* @param unit* @param timeout* @return*/@Overridepublic RLock lock(String lockKey, TimeUnit unit ,long timeout) {RLock lock = redissonClient.getLock(lockKey);lock.lock(timeout, unit);return lock;}/*** tryLock(),马上返回,拿到lock就返回true,不然返回false.* 带时间限制的tryLock(),拿不到lock,就等一段时间,超时返回false.* @param lockKey* @param unit* @param waitTime* @param leaseTime* @return*/@Overridepublic boolean tryLock(String lockKey, TimeUnit unit, long waitTime, long leaseTime) {RLock lock = redissonClient.getLock(lockKey);try {return lock.tryLock(waitTime, leaseTime, unit);} catch (InterruptedException e) {return false;}}/*** 释放锁* @param lockKey*/@Overridepublic void unlock(String lockKey) {RLock lock = redissonClient.getLock(lockKey);lock.unlock();}/*** 释放锁* @param lock*/@Overridepublic void unlock(RLock lock) {lock.unlock();}}

五、 提供测试接口,测试分布式锁

    @RequestMapping("/testRedisson")public void redissonTest() {String key = "redisson_key";for (int i = 0; i < 10; i++) {Thread t = new Thread(() -> {try {logger.error("=============线程开启============"+Thread.currentThread().getName());boolean isGetLock =  distributedLocker.tryLock(Constants.redisTestKey(key), TimeUnit.SECONDS,5L,10L); //尝试获取锁,等待5秒,自己获得锁后一直不解锁则10秒后自动解锁if(isGetLock){Thread.sleep(100); //获得锁之后可以进行相应的处理logger.error("======获得锁后进行相应的操作======"+Thread.currentThread().getName());}} catch (Exception e) {e.printStackTrace();}finally {distributedLocker.unlock(key);}});t.start();}}

再也不用担心面试官让我用Redis实现分布式锁啦(二、Redisson实现分布式锁)相关推荐

  1. 快速了解常用的非对称加密算法,再也不用担心面试官的刨根问底

    面试官:说一说你常用的加密算法有哪些? 加密算法通常被分为两种:对称加密算法和非对称加密算法.其中,对称加密算法在加密和解密时使用的密钥相同:非对称加密算法在加密和解密时使用的密钥不同,分为公钥和私钥 ...

  2. 快速了解常用的消息摘要算法,再也不用担心面试官的刨根问底

    面试官:说一说你常用的加密算法有哪些? 加密算法通常被分为两种:对称加密和非对称加密.其中,对称加密算法在加密和解密时使用的密钥相同:非对称加密算法在加密和解密时使用的密钥不同,分为公钥和私钥.此外, ...

  3. 快速了解常用的对称加密算法,再也不用担心面试官的刨根问底

    面试官:说一说你常用的加密算法有哪些? 加密算法通常被分为两种:对称加密和非对称加密.其中,对称加密算法在加密和解密时使用的密钥相同:非对称加密算法在加密和解密时使用的密钥不同,分为公钥和私钥.此外, ...

  4. 再也不用担心面试官问你HashCode和equals了

    结论 如果两个对象相等,则hashcode()必须相等. 如果两个对象相等,a.equals(b)==b.equals(a)==true 如果两个对象有相同的hashcode值,他们也不一定是相等的. ...

  5. 看完华为这篇面经,我再也不用担心面试了(应届生)

    第一轮 专业面 一对一的专业面,面试官都不是HR,应该部门经理级别的人吧,所以问的问题还是侧重专业的.面试官面完一个人就出来喊另外一个人进去面试,面完好几个人之后,HR就过来给大家念名单,有些人就是叫 ...

  6. MySQL事务及实现原理全面总结,再也不用担心面试

    一. 事务transanction的四个基本要素 简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败,它具有以下四个基本要素. ACID:原子性(Atomicity). 一致性(Cor ...

  7. spring面试专题一点通,再也不用担心面试不会回答了

    前言 文章内容有点小长,希望你能耐心阅读,更多Java面试题以及学习资料获取方式:加Qun:1017-599-436免费获取.  还有更多包括电子书,PDF文档以及视频精讲可以分享给大家,内容覆盖很广 ...

  8. git for windows_手把手教会舍友玩 Git (包教包会,再也不用担心他的学习)

    作 者: BWH_Steven 原文链接:https://www.cnblogs.com/ideal-20/p/13644420.html 舍友长大想当程序员,我和他爷爷奶奶都可高兴了,写他最喜欢的喜 ...

  9. 妈妈再也不用担心别人问我是否真正用过redis了

    1. Memcache与Redis的区别 1.1. 存储方式不同 1.2. 数据支持类型 1.3. 使用底层模型不同 2. Redis支持的数据类型 3. Redis的回收策略 4. Redis小命令 ...

最新文章

  1. pyqt5入门教程(三)
  2. 同时tar解压多个文件
  3. [密码学] 高级加密标准AES
  4. Python subprocess命令行中文乱码
  5. 设计模式笔记-命令模式
  6. Oracle 20c数据库开启原生的区块链表、AutoML以及持久化内存支持
  7. JAVA实现ATM源代码及感想
  8. 【java笔记】java基本语言风格(注释,数据,运算符)
  9. 比赛结束(第二届易观算法大赛)
  10. 淘宝广告数据分析实战!(附代码和100W数据源)
  11. 相机打开显示服务器错误,Win10相机打不开报错“0xa00f4244”怎么解决?
  12. 服务器 端口映射 dmz,如何使用端口映射功能与 DMZ 主机设置
  13. Codeforces Round #476 (Div. 2) 题解
  14. 使用kubeadm安装k8s
  15. 嫁给通信旺的16条理由!!!
  16. 小时代3刺金时代好看吗?
  17. app的崩溃率标准,优秀,合格,轻微隐患,严重隐患
  18. 大数据时代:如何守护我们的数据安全
  19. 使用OmicShare Tools做权重网络图
  20. 论文整理Actively Mapping Industrial Structures with Information Gain-Based Planning on a Quadruped Robot

热门文章

  1. Spark RDD知识点汇总
  2. 【C/C++】获取计算机CPUID序列号
  3. Python数据分析-数据预处理
  4. Unity小地图映射到Canvas中去,并完成摄像机跟随物体。
  5. 类和对象、实例的关系理解
  6. Flink中allowedLateness介绍与测试
  7. 请用matlab写“遗传算法优化bp神经网络预测城市公交系统车站客流量”的代码,数据和参数随便给出...
  8. 大学两年了,想说点什么!
  9. https免费证书获取方式
  10. 3d打印机要火了还需时日